| 本帖最后由 十二 于 2011-3-14 15:44 编辑 
 F3载入Game.exe
 
 bp ReadFile
 
 堆栈:
 
 
 复制代码0241FB74 75FADAFD /CALL 到 ReadFile 来自 kernel32.75FADAF8
0241FB78 000000C0 |hFile = 000000C0 (window)
0241FB7C 03C0CF68 |Buffer = 03C0CF68
0241FB80 00001000 |BytesToRead = 1000 (4096.)
0241FB84 0241FBE8 |pBytesRead = 0241FBE8
0241FB88 00000000 \pOverlapped = NULL
 直接Alt+F9返回,Ctrl+A分析。
 
 
 复制代码03B00595 83C4 1C ADD ESP,1C
03B00598 57 PUSH EDI
03B00599 8BCE MOV ECX,ESI
03B0059B E8 A0FBFFFF CALL RGE.03B00140    校验RGE脚本,检测RGE脚本是否有效。
03B005A0 85C0 TEST EAX,EAX
03B005A2 75 15 JNZ SHORT RGE.03B005B9
03B005A4 C745 D8 A081B60>MOV DWORD PTR SS:[EBP-28],RGE.03B681A0
03B005AB 68 08C4B403 PUSH RGE.03B4C408
03B005B0 8D4D D8 LEA ECX,DWORD PTR SS:[EBP-28]
03B005B3 51 PUSH ECX
03B005B4 E8 E9460300 CALL RGE.03B34CA2 ; JMP 到 msvcrt._CxxThrowException
03B005B9 8B96 D8000000 MOV EDX,DWORD PTR DS:[ESI+D8]
03B005BF 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C]
03B005C2 03C2 ADD EAX,EDX
03B005C4 8946 14 MOV DWORD PTR DS:[ESI+14],EAX
03B005C7 8946 10 MOV DWORD PTR DS:[ESI+10],EAX
03B005CA 885E 19 MOV BYTE PTR DS:[ESI+19],BL
03B005CD 885E 18 MOV BYTE PTR DS:[ESI+18],BL
03B005D0 C745 FC FFFFFFF>MOV DWORD PTR SS:[EBP-4],-1
03B005D7 B8 01000000 MOV EAX,1
03B005DC 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
03B005DF 64:890D 0000000>MOV DWORD PTR FS:[0],ECX
03B005E6 5F POP EDI
03B005E7 5E POP ESI
03B005E8 5B POP EBX
03B005E9 8BE5 MOV ESP,EBP
03B005EB 5D POP EBP
03B005EC C2 0800 RETN 8
 直接Ctrl+F9执行到RETN 8然后F8单步,两次Ctrl+F搜索CALL RGE.rb_str_new2指令,在它上一句PUSH ESI下断F9执行跟踪ESI的地址得到解密脚本。
 
 F7步入CALL RGE.rb_str_new2指令。
 
 
 03AF1790 |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]复制代码03AF1770 >/$ 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
03AF1774 |. 85D2 TEST EDX,EDX
03AF1776 |. 75 10 JNZ SHORT RGE.03AF1788
03AF1778 |. A1 A0F3BB03 MOV EAX,DWORD PTR DS:[rb_eArgError]
03AF177D |. 68 B837B603 PUSH RGE.03B637B8 ; ASCII "NULL pointer given"
03AF1782 |. 50 PUSH EAX
03AF1783 |. E8 A8B1FAFF CALL RGE.rb_raise
03AF1788 |> 57 PUSH EDI
03AF1789 |. 8BFA MOV EDI,EDX
03AF178B |. 83C9 FF OR ECX,FFFFFFFF
03AF178E |. 33C0 XOR EAX,EAX
03AF1790 |. F2:AE REPNE SCAS BYTE PTR ES:[EDI]
03AF1792 |. F7D1 NOT ECX
03AF1794 |. 49 DEC ECX
03AF1795 |. 51 PUSH ECX
03AF1796 |. 52 PUSH EDX
03AF1797 |. E8 04FFFFFF CALL RGE.rb_str_new
03AF179C |. 83C4 08 ADD ESP,8
03AF179F |. 5F POP EDI
03AF17A0 \. C3 RETN
03AF1792 |. F7D1 NOT ECX
 03AF1794 |. 49 DEC ECX
 得到脚本的大小,Ctrl+F9结束此子程。停到03A6F29A |. 8945 D4 |MOV [LOCAL.11],EAX
 
 复制代码03A6F29A |. 8945 D4 |MOV [LOCAL.11],EAX
03A6F29D |. 6A 03 |PUSH 3
03A6F29F |. 53 |PUSH EBX
03A6F2A0 |. 8B55 DC |MOV EDX,[LOCAL.9]
03A6F2A3 |. 52 |PUSH EDX
03A6F2A4 |. 50 |PUSH EAX
03A6F2A5 |. 6A 04 |PUSH 4
03A6F2A7 |. A1 D081B603 |MOV EAX,DWORD PTR DS:[3B681D0]
03A6F2AC |. 50 |PUSH EAX
03A6F2AD |. 8B0D 90F2BB03 |MOV ECX,DWORD PTR DS:[rb_mKernel]
03A6F2B3 |. 51 |PUSH ECX
03A6F2B4 |. E8 27790300 |CALL RGE.rb_funcall
03A6F2B9 |. 83C4 24 |ADD ESP,24
03A6F2BC |. 8B75 08 |MOV ESI,[ARG.1]
03A6F2BF |. 8B7D E4 |MOV EDI,[LOCAL.7]
03A6F2C2 |. 8B5D E0 |MOV EBX,[LOCAL.8]
03A6F2C5 |.^ E9 B3FEFFFF \JMP RGE.03A6F17D
 03A6F2B4  |.  E8 27790300   |CALL RGE.rb_funcall 初步猜测是实例化脚本的过程因为我步过的时候程序就跑起来了(汗- =)
 
 但是它上面的几个PUSH参数我无解。
 
 |