工具:OllyDBG、StrongOD+HideOD
今天偶然更新了StrongOD,嘿,居然把VMP加殼的繁體版雲之遙讓OD給跑起來了。。。對於我這種不會過VMP的ANTI的菜鳥,這下可以研究研究了
首先來研究隨時存檔,存檔肯定是需要寫文件,我們先找一個可以存檔的地圖,來到存檔界麵,在OD中設下斷點:CreateFileW,這時彈回去時會攔下一大堆讀IMD,原來雲之遙優化非常不錯,需要的時候才讀取文件。
繼續F9可以攔到CreateFileW存檔S09.sav,然後可以返回到:
0041BC35 8BF0 MOV ESI,EAX
在0041B30A下一個斷點,函數返回回去後。。。OMG,VM代碼,繼續研究下去要死人,換個思路。。。
我們先右鍵->超級字串參考->查找ASCII,返回程序,從0041BC35往上麵看,有一條指令:
0041B1DA 68 F8C27900 PUSH SwdCF.0079C2F8 ; ASCII "%s\%c\S%02d.sav"
這不就是存檔路徑嗎?繼續往上,我們在0041B168下一個斷點,單擊“儲存”,OD就會斷下來,F8下去,會看到函數會返回到004FE286,繼續在004FE1C0下一個斷點,F9運行,然後再單擊“儲存”,斷下來後,觀察堆棧,有如下兩條:
0012FBCC 004FC0DC 返回到 SwdCF.004FC0DC 來自 SwdCF.004FE1C0
0012FBD8 004FFDAD 返回到 SwdCF.004FFDAD 來自 SwdCF.004FC0A0
我們到004FFDAD去看下,往上在004FFB34下一個斷點,再次單擊“儲存”可以被斷下,根據剛才記錄,可以看到存檔CALL的地址在004FFDA8:
004FFDA8 E8 F3C2FFFF CALL SwdCF.004FC0A0 ; 存檔 CALL
隻要走到這裏便能存檔,此時我們F8一路單步走,在004FFC18處有一個JMP到存檔CALL的上麵,我們先標記一下
此時我們讀一個不能存檔的地圖,直接來到儲存界麵單擊“儲存”,程序被斷下來了,可以看到在這裏會跳走從而無法存檔
004FFBCC 74 4F JE SHORT SwdCF.004FFC1D
代碼整理如下:
004FFB34 57 PUSH EDI
004FFB35 85C0 TEST EAX,EAX
004FFB37 0F85 00030000 JNZ SwdCF.004FFE3D ; EAX 不為 0 跳走
004FFB3D A1 283F7E00 MOV EAX,DWORD PTR DS:[7E3F28]
004FFB42 BF 01000000 MOV EDI,1
004FFB47 C680 CC000000 0>MOV BYTE PTR DS:[EAX+CC],0 ; [7E3F28+CC] 置0
004FFB4E 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8] ; [ESP+8] -> EAX
004FFB52 3B05 243E8300 CMP EAX,DWORD PTR DS:[833E24]
004FFB58 75 09 JNZ SHORT SwdCF.004FFB63 ; EAX 不等於 [833E24] 跳走
004FFB5A 33C0 XOR EAX,EAX ; EAX 清零
004FFB5C A3 A03C8300 MOV DWORD PTR DS:[833CA0],EAX ; EAX = [833CA0]
004FFB61 EB 52 JMP SHORT SwdCF.004FFBB5
004FFB63 3B05 283E8300 CMP EAX,DWORD PTR DS:[833E28]
004FFB69 75 09 JNZ SHORT SwdCF.004FFB74 ; EAX 不等於 [833E28] 跳走
004FFB6B 8BC7 MOV EAX,EDI
004FFB6D A3 A03C8300 MOV DWORD PTR DS:[833CA0],EAX
004FFB72 EB 41 JMP SHORT SwdCF.004FFBB5
004FFB74 3B05 2C3E8300 CMP EAX,DWORD PTR DS:[833E2C]
004FFB7A 75 0C JNZ SHORT SwdCF.004FFB88 ; EAX 不等於 [833E2C] 跳走
004FFB7C B8 02000000 MOV EAX,2
004FFB81 A3 A03C8300 MOV DWORD PTR DS:[833CA0],EAX
004FFB86 EB 2D JMP SHORT SwdCF.004FFBB5
004FFB88 3B05 303E8300 CMP EAX,DWORD PTR DS:[833E30]
004FFB8E 75 0C JNZ SHORT SwdCF.004FFB9C ; EAX 不等於 [833E30] 跳走
004FFB90 B8 03000000 MOV EAX,3
004FFB95 A3 A03C8300 MOV DWORD PTR DS:[833CA0],EAX
004FFB9A EB 19 JMP SHORT SwdCF.004FFBB5
004FFB9C 3B05 343E8300 CMP EAX,DWORD PTR DS:[833E34]
004FFBA2 75 0C JNZ SHORT SwdCF.004FFBB0 ; EAX 不等於 [833E34] 跳走
004FFBA4 B8 04000000 MOV EAX,4
004FFBA9 A3 A03C8300 MOV DWORD PTR DS:[833CA0],EAX
004FFBAE EB 05 JMP SHORT SwdCF.004FFBB5
004FFBB0 A1 A03C8300 MOV EAX,DWORD PTR DS:[833CA0] ; EAX = [833CA0]
004FFBB5 83F8 04 CMP EAX,4
004FFBB8 0F87 75020000 JA SwdCF.004FFE33 ; EAX 大於 4 跳走
004FFBBE FF2485 44FE4F00 JMP DWORD PTR DS:[EAX*4+4FFE44]
004FFBC5 A0 C13D8300 MOV AL,BYTE PTR DS:[833DC1] ; [833DC1] -> AL
004FFBCA 84C0 TEST AL,AL
004FFBCC 74 4F JE SHORT SwdCF.004FFC1D ; AL 為 0 跳走
004FFBCE A0 F9FA8300 MOV AL,BYTE PTR DS:[83FAF9] ; [83FAF9] -> AL
004FFBD3 84C0 TEST AL,AL
004FFBD5 75 46 JNZ SHORT SwdCF.004FFC1D ; AL 不為 0 跳走
004FFBD7 B9 983C8300 MOV ECX,SwdCF.00833C98
004FFBDC E8 5FE7FFFF CALL SwdCF.004FE340
004FFBE1 B9 983C8300 MOV ECX,SwdCF.00833C98
004FFBE6 E8 65EEFFFF CALL SwdCF.004FEA50
004FFBEB B9 983C8300 MOV ECX,SwdCF.00833C98
004FFBF0 E8 7BEEFFFF CALL SwdCF.004FEA70
004FFBF5 A1 5C257E00 MOV EAX,DWORD PTR DS:[7E255C]
004FFBFA 893D A43C8300 MOV DWORD PTR DS:[833CA4],EDI
004FFC00 3BC7 CMP EAX,EDI
004FFC02 75 0D JNZ SHORT SwdCF.004FFC11
004FFC04 6A 0F PUSH 0F
004FFC06 57 PUSH EDI
004FFC07 B9 A8088300 MOV ECX,SwdCF.008308A8
004FFC0C E8 3F2BFDFF CALL SwdCF.004D2750
004FFC11 8B0D 3C257E00 MOV ECX,DWORD PTR DS:[7E253C]
004FFC17 51 PUSH ECX
004FFC18 E9 75010000 JMP SwdCF.004FFD92 ; 這裏去存檔
004FFC1D 6A FF PUSH -1
如果要實現隨時存檔,方法很明確:
[833DC1]應保持為非0值
[83FAF9]應保持為0
簡體版方法是一樣的,不過隻能讓OD附加,直接載入會被SecuROM給Anti掉,而且附加後程序也跑不起來,但可以查找到指令。
附簡體版的方法及內存地址如下:
[82B779]應保持為非0值
[8374B1]應保持為0