搜尋

CRC檢測作弊

返回清單
切換到指定樓層
通知這文章過時或找檔案 發表主題

[其他] (轉貼)某遊戲CRC檢測作弊的解決方法

[複製連結]
SheepKingCN ( Lv.80 論壇達人 ) 發表於 2014-8-11 20:11:05 | 顯示全部樓層 |閱讀模式
本文章最後由 SheepKingCN 於 2014-8-11 20:32 編輯

文章轉自  「某游戏 CRC检测的解决方法
http://webcache.googleusercontent.com/search?q=cache:bxGei46npLwJ:hi.baidu.com/findcall/item/80db3743856fb70ee935047c+&cd=1&hl=zh-TW&ct=clnk&gl=tw

(僅本人備份文章用途)
解決辦法:
開啟遊戲後,隨便修改了下....發現一旦修改了代碼,馬上被系統踢出遊戲....非常鬱悶
於是上網查了查相關的資料,再對比一下我之前玩過的遊戲的檢測代碼,發現是CRC檢測
最後經過N天苦戰,終於成功bypass,實現了代碼的隨意修改不被T,想到論壇上還沒有相關的資料,於是就決定發上來....

什麼是CRC
  1. crc即是循環冗餘位校驗(Cyclicl Redundncy Check英文簡稱CRC)是非常廣泛的一種數據容錯方法,在數據傳輸,數據壓縮等領域運用極其廣泛。 CRC的實現分為硬件和軟件兩種方法,其中軟件實現的關鍵在於計算速度。如果單純模擬硬件實現方法,則計算速度較慢。
  2. 由於是數據結構的一種算法,因為檢測速度極快,能有效的檢測字節之間的相互性,所以很多遊戲包括大型軟件採用這種算法,至於該算法如何實現,就是一個很複雜​​的問題,不在我的能力範圍內,我的目的很明確:那就是跳過他的檢測,實現代碼的修改.
複製代碼
下面開始我們的研究:
在Cheat Engine修改軟體中任意對一個地址用find out what accesses,都發現被這幾個指令讀取了:
  1. 005F2E63 897C24 10 mov dword ptr ss:[esp+10],edi
  2. 005FF390 0FB658 FF movzx ebx,byte ptr ds:[eax-1]
  3. 005FF396 8A70 01 mov dh,byte ptr ds:[eax+1]
  4. 005FF39F 8A50 FC mov dl,byte ptr ds:[eax-4]
  5. 005FF3A7 0FB658 FA movzx ebx,byte ptr ds:[eax-6]
複製代碼
於是我們基本可以確定這幾個讀取的指令就是遊戲的檢測代碼
查看這幾條指令附近,並分析之,發現:
  1. 005FF390 0FB658 FF movzx ebx,byte ptr ds:[eax-1]
  2. 005FF396 8A70 01 mov dh,byte ptr ds:[eax+1]
  3. 005FF39F 8A50 FC mov dl,byte ptr ds:[eax-4]
  4. 005FF3A7 0FB658 FA movzx ebx,byte ptr ds:[eax-6]
複製代碼
這幾條指令是在一個部分裡面的,由於之前我查過資料,再加上和冒險島CRC檢測部分的代碼進行比較
知道了這部分就是CRC檢測
還有一條指令也是遊戲的檢測代碼.不過現在我們暫時不研究...今天我們主要是來解決CRC

貼出CRC檢測部分的代碼:
005FF370 83EC 44 sub esp,44
005FF373​​ 8B4424 48 mov eax,dword ptr ss:[esp+48] ; 指向檢測地址
005FF377 53 push ebx ;保存寄存器狀態
005FF378 55 push ebp
005FF379 56 push esi
005FF37A 57 push edi
005FF37B 894C24 10 mov dword ptr ss:[esp+10],ecx
005FF37F 83C0 02 add eax,2
005FF382 8D7424 14 lea esi,dword ptr ss:[esp+14]
005FF386 BF 10000000 mov edi,10
005FF38B EB 03 jmp short trgame.005FF390
005FF38D 8D49 00 lea ecx,dword ptr ds:[ecx+00
005FF390 0FB658 FF movzx ebx,byte ptr ds:[eax-1] ;算法開始
005FF394 33D2 xor edx,edx
005FF396 8A70 01 mov dh,byte ptr ds:[eax+1]
005FF399 83C6 04 add esi,4
005FF39C 83C0 04 add eax,4
005FF39F 8A50 FC mov dl,byte ptr ds:[eax-4]
005FF3A2 C1E2 08 shl edx,8
005FF3A5 0BD3 or edx,ebx
005FF3A7 0FB658 FA movzx ebx,byte ptr ds:[eax-6]
005FF3AB C1E2 08 shl edx,8
005FF3AE 0BD3 or edx,ebx
005FF3B0 4F dec edi
005FF3B1 8956 FC mov dword ptr ds:[esi-4],edx
005FF3B4 ^ 75 DA jnz short trgame.005FF390
005FF3B6 8B79 50 mov edi,dword ptr ds:[ecx+50]
005FF3B9 8B71 54 mov esi,dword ptr ds:[ecx+54]
005FF3BC 8B51 58 mov edx,dword ptr ds:[ecx+58]
005FF3BF 8B49 4C mov ecx,dword ptr ds:[ecx+4C]
005FF3C2 8B6C24 14 mov ebp,dword ptr ss:[esp+14]
005FF3C6 8BC7 mov eax,edi
005FF3C8 F7D0 not eax
005FF3CA 23C2 a​​nd eax,edx
005FF3CC 8BDE mov ebx,esi
005FF3CE 23DF and ebx,edi
005FF3D0 0BC3 or eax,ebx
005FF3D2 03C5 add eax,ebp
005FF3D4 8D8C01 78A46AD7 lea ecx,dword ptr ds:[ecx+eax+D76AA478]
005FF3DB 8BC1 mov eax,ecx
005FF3DD C1E1 07 shl ecx,7
005FF3E0 8B6C24 18 mov ebp,dword ptr ss:[esp+18]
005FF3E4 C1E8 19 shr eax,19
005FF3E7 0BC1 or eax,ecx
005FF3E9 03C7 add eax,edi
005FF3EB 8BC8 mov ecx,eax
005FF3ED F7D1 not ecx
005FF3EF 23CE and ecx,esi
005FF3F1 8BDF mov ebx,edi
005FF3F3 23D8 and ebx,eax
005FF3F5 0BCB or ecx,ebx
005FF3F7 03CD add ecx,ebp
005FF3F9 8D8C0A 56B7C7E8 lea ecx,dword ptr ds:[edx+ecx+E8C7B756]
005FF400 8BD1 mov edx,ecx
005FF402 C1E1 0C shl ecx,0C
005FF405 8B6C24 1C mov ebp,dword ptr ss:[esp+1C]
005FF409 C1EA 14 shr edx,14
005FF40C 0BD​​1 or edx,ecx
005FF40E 03D0 add edx,eax
005FF410 8BCA mov ecx,edx
005FF412 F7D1 not ecx
005FF414 23CF and ecx,edi
005FF416 8BDA mov ebx,edx
005FF418 23D8 and ebx,eax
005FF41A 0BCB or ecx,ebx
005FF41C ​​03CD add ecx,ebp
.................................此處省略N個字
005FFC17 8D940A 91D386EB lea edx,dword ptr ds:[edx+ecx+EB86D391]
005FFC1E 8B4C24 10 mov ecx,dword ptr ss:[esp+10]
005FFC22 8B79 4C mov edi,dword ptr ds:[ecx+4C]
005FFC25 03F8 add edi,eax
005FFC27 8979 4C mov dword ptr ds:[ecx+4C],edi
005FFC2A 8BC2 mov eax,edx
005FFC2C 8B79 50 mov edi,dword ptr ds:[ecx+50]
005FFC2F C1E0 15 shl eax,15
005FFC32 C1EA 0B shr edx,0B
005FFC35 0BC2 or eax,edx
005FFC37 03C7 add eax,edi
005FFC39 03C3 add eax,ebx
005FFC3B 8941 50 mov dword ptr ds:[ecx+50],eax
005FFC3E 8B41 54 mov eax,dword ptr ds:[ecx+54]
005FFC41 03C3 add eax,ebx
005FFC43 8941 54 mov dword ptr ds:[ecx+54],eax
005FFC46 8B41 58 mov eax,dword ptr ds:[ecx+58]
005FFC49 5F pop edi
005FFC4A 03C6 add eax,esi
005FFC4C 5E pop esi
005FFC4D 5D pop ebp
005FFC4E 8941 58 mov dword ptr ds:[ecx+58],eax
005FFC51 5B pop ebx
005FFC52 83C4 44 add esp,44
005FFC55 C2 0400 retn 4
看了中間那部分冗長的代碼估計是人都想睡覺了- -....
沒關係,我們只需找到問題的關鍵所在可以了.

開始的時候,我隨便看了下前面的代碼,發現有個轉跳點:
  1. 005FF38B EB 03 jmp short trgame.005FF390
  2. 005FF38D 8D49 00 lea ecx,dword ptr ds:[ecx+00
  3. 005FF390 0FB658 FF movzx ebx,byte ptr ds:[eax-1] ;算法開始
複製代碼
直接修改之,使其直接「轉跳」到最後部分.即改為jmp short trgame.005FFC49
本以為能夠成功,結果剛改完沒幾秒,遊戲就顯示:感知到輔助程式 (輔助程式)
果然不成功.........(如果就這麼輕易成功就不是CRC檢測了)


分析失敗的原因:
可能是CRC檢測完一次就會發一次包給伺服器用來報告是否正常,如不正常則斷開客戶端的鏈接
而我們跳過了中間的部分,伺服器無法得知客戶端的情況,所以我就被遊戲系統踢
既然直接的行不通,那我們就拐彎抹角地來:
於是我就想到了在內存中註入一段內存鏡像,讓遊戲來檢測鏡像.這樣就可以實現跳過CRC檢測的目的了
在函數開頭下斷,知道了:
  1. 005FF373​​ 8B4424 48 mov eax,dword ptr ss:[esp+48]
複製代碼
這條指令的[esp+48]是指向檢測地址的
為了讓遊戲去檢測我們的內存鏡像,我們就要在CRC檢測部分之前,修改這個eax,使其指向我們的鏡像地址,這就需要我們使用CE的auto assmenble,的代碼注入
首先觀察了下開頭的地址,在算法開始之前找個地址轉跳走,並修改eax的值
發現就在開始檢測之前就有2條「廢代碼」可以供我們踐踏,並且這兩條「廢代碼」長度加起來剛好是一個長轉跳的長度:
  1. 5FF38B EB 03 jmp short trgame.005FF390 :
複製代碼
這兩條代碼剛好提供我們「轉跳」的位置
  1. 5FF38D 8D49 00 lea ecx,dword ptr ds:[ecx+00
  2. 5FF390 0FB658 FF movzx ebx,byte ptr ds:[eax-1] ;算法開始
複製代碼
轉跳​​的位置找好了,思路也有了,就差「內存鏡像的製作」...估計還有很多人不會

Cheat Engine製作內存鏡像的方法:
memory viewer---->file----->save memory region---->don't include CE header in file--->ok---->


在from和to那裡輸入你要保存的代碼的範圍
一般遊戲從400000~800000是遊戲主要部分(少數遊戲除外)
最後輸入名字就可以了,然後你Cheat Engine的主目錄那裡就多了個XXX.CEM文件,這就是我們做的遊戲的內存鏡像

好了,需要的東西都齊全

開始寫Cheat Engine的注入腳本

(為了方便大家就貼出來好了)

ALLOC(CRC,128)   向遊戲申請一塊大小為128的區域
ALLOC(DUMP,5550018)   這個是用來保存我們內存鏡像的,為了方便我沒有去算,直接輸入了一個很龐大的數值,....其實沒必要用這麼大.太小了就不能全部存放完
LABEL(RET)   這個是為了方便轉跳回去而定義的標籤
LOADBINARY(DUMP,check.CEM)   這個是關鍵了.把我們的內存鏡像Check.cem注入到我們申請的空白內存區
CRC:
CMP EAX,00400000   // 比較EAX,小於400000和大於800000的時候我們就"放手一搏"讓遊戲系統自己去檢測
JB RET   // 因為我們只需要修改400000~800000的代碼,並且我們的內存鏡像中
CMP EAX,00800000   //只有400000~800000這部分的代碼
JA RET
ADD EAX, DUMP-400000   // 這個也很重要,我解釋一下:因為我們的鏡像是從400000開始的
jmp RET    // 為了把EAX改成指向鏡像中所對應的代碼
                  // 所以eax要改為:eax+d​​ump-400000
                 //上面的代碼就是為了判斷此時EAX是否在檢測400000~800000是則進行修改(ADD EAX, DUMP-400000)不是的話則放手一搏(JB RET 和JA RET )改完了​​再回到原來的地方( jmp RET )

5f2e5f:
mov esi,edi     // 這個是跳過另外一個反輔助部分的,有興趣大家可以研究下,比較簡單

5ff38b:      //跳到我們申請的區域,判斷此時EAX是否在檢測400000~800000
JMP CRC     // 是則進行修改,不是的話則放手一搏  (放手一搏 意思就是「放行」)
RET:    // 把5ff38b之後的第一條代碼定義為RET,方便轉跳回來


把上面的代碼複製到auto assemble再點write code成功注入了我們的作弊代碼,並且完全繞過了CRC的檢測,怎麼修改遊戲數據都可以!!!











大家正在看啥


回覆 使用道具 檢舉
複製專屬你的推廣連結:發至FB與各論壇宣傳:累積點數換GP商品 & 藍鑽
每五點閱率就可以兌換藍鑽積分或遊戲點卡 夢遊推廣文章換GP商品

你需要登入後才可以回覆 登入 | 加入會員

本版積分規則

Copyright (C) 2010-2020 夢遊電玩論壇

廣告合作:請直接聯繫我們,並附上您預刊登位置的預算。  

快速回覆 返回頂端 返回清單