0012F6C4 00472CCC /CALL 到RegQueryValueExA 来自dumped.00472CC7 0012F6C8 000000CC |hKey = CC 0012F6CC 0066E5B6 |ValueName = "UserName" 0012F6D0 00000000 |Reserved = NULL 0012F6D4 0012FAF0 |pValueType = 0012FAF0 0012F6D8 0012F7E4 |Buffer = 0012F7E4 0012F6DC 0012FAEC pBufSize = 0012FAEC 0012F6E0 505C3A43
此时正是返回程序领空的最佳时机,Alt+F9返回程序领空。 00472CCC |. 85C0 test eax,eax 接下来F8单步一直向下 00472F34 |. 68 94C48200 push dumped.0082C494 ; ASCII "hello" 00472F39 |. E8 BEA31B00 call dumped.0062D2FC 00472F3E |. 83C4 08 add esp,8 00472F41 |. FF75 0C push dword ptr ss:[ebp+C] 00472F44 |. 68 98C58200 push dumped.0082C598 ; ASCII "1234567890123456" 00472F49 |. E8 AEA31B00 call dumped.0062D2FC 00472F4E |. 83C4 08 add esp,8 00472F51 |. B8 01000000 mov eax,1 00472F56 |> 8BE5 mov esp,ebp 00472F58 |. 5D pop ebp 00472F59 . C3 retn
F2在00472F59下断,SHIFT+F9运行,F8单步继续。
00403344 . /74 0D je short dumped.00403353 00403346 . |FF35 54E46700 push dword ptr ds:[67E454] ; /ExitCode = FFFFFFFF 0040334C . |E8 5BB22300 call <jmp.&kernel32.ExitProcess> ; ExitProcess 00403351 . |EB 07 jmp short dumped.0040335A 00403353 > 33C0 xor eax,eax
这里要跳转,不然程序就OVER了! 00403362 . E8 75C01E00 call dumped.005EF3DC ; 激活注册对话框
00403027 8B0D 94B76800 mov ecx,dword ptr ds:[68B794] ; 0040302D A1 C0006400 mov eax,dword ptr ds:[6400C0] ;这两个数值有点奇怪,我们后面完美破解所需要的 00403032 3BC8 cmp ecx,eax 00403034 74 19 je short dumped.0040304F ; 关键跳转 00403036 8B15 08BC6C00 mov edx,dword ptr ds:[6CBC08] ; dumped.00B4ACE8
; 关键跳转,上面的几个函数读取了我们的用户名和假码,通过某种判断,如果注册成功就跳,但是没有跳,所以我要让它跳转 关键点一: 00401DAB |. E8 A8B62200 |call dumped.0062D458 00401DB0 |. 83C4 0C |add esp,0C 00401DB3 |. 8945 BC |mov dword ptr ss:[ebp-44],eax 00401DB6 |. 8B45 BC |mov eax,dword ptr ss:[ebp-44] |