【文章标题】: 一款转换软件的爆解及手动补丁
【软件名称】: STDUConverter
【下载地址】: http://down.ddvip.com/view/121531629019583.html
【编写语言】: VC++
【软件介绍】: 将STDU文件转换为PDF文件
【作者声明】: 想用一下,但要注册,就试一下了。如有得罪,马上纠正。
软件特点:
USER32.BlockInput夹住注册关键CALL
--------------------------------------------------------------------------------
【详细过程】
0043D519 |. E8 E24AFCFF call STDUConv.00402000 ; 这里下断点了
0043D51E |. 6A 01 push 1 ; 这里需要修改为push 0
0043D520 |. E8 494E0000 call <jmp.&USER32.BlockInput>
0043D525 |. 8D4C24 0C lea ecx,dword ptr ss:[esp+C]
0043D529 |. 51 push ecx
0043D52A |. 8D5424 14 lea edx,dword ptr ss:[esp+14]
0043D52E |. 52 push edx
0043D52F |. 8D4424 1C lea eax,dword ptr ss:[esp+1C]
0043D533 |. 50 push eax
0043D534 |. E8 67C3FDFF call STDUConv.004198A0 ; 关键CALL
0043D539 |. 83C4 0C add esp,0C
0043D53C |. 6A 00 push 0
0043D53E |. 8BF8 mov edi,eax
0043D540 |. E8 294E0000 call <jmp.&USER32.BlockInput>
0043D545 |. 85FF test edi,edi
0043D547 |. 75 66 jnz short STDUConv.0043D5AF ; 这里必须跳了。
0043D549 |. 8D4C24 30 lea ecx,dword ptr ss:[esp+30]
0043D54D |. E8 BEC5FCFF call STDUConv.00409B10
0043D552 |. 895C24 2C mov dword ptr ss:[esp+2C],ebx
0043D556 |. 68 09830000 push 8309
0043D55B |. 8D4C24 30 lea ecx,dword ptr ss:[esp+30]
0043D55F |. C64424 50 04 mov byte ptr ss:[esp+50],4
0043D564 |. E8 974AFCFF call STDUConv.00402000
0043D569 |. 8B4C24 38 mov ecx,dword ptr ss:[esp+38]
0043D56D |. 8B5424 30 mov edx,dword ptr ss:[esp+30]
0043D571 |. 8B46 04 mov eax,dword ptr ds:[esi+4]
0043D574 |. 6A 10 push 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
0043D576 |. 51 push ecx ; |Title
0043D577 |. 52 push edx ; |Text
0043D578 |. 50 push eax ; |hOwner
0043D579 |. FF15 24644C00 call dword ptr ds:[<&USER32.MessageBoxW>] ; \MessageBoxW
0043D57F |. 8B4424 30 mov eax,dword ptr ss:[esp+30]
0043D583 |. 83C0 F0 add eax,-10
0043D586 |. C64424 4C 03 mov byte ptr ss:[esp+4C],3
0043D58B |. 895C24 2C mov dword ptr ss:[esp+2C],ebx
0043D58F |. 8D48 0C lea ecx,dword ptr ds:[eax+C]
0043D592 |. 83CA FF or edx,FFFFFFFF
0043D595 |. F0:0FC111 lock xadd dword ptr ds:[ecx],edx
0043D599 |. 4A dec edx
0043D59A |. 85D2 test edx,edx
0043D59C |. 7F 08 jg short STDUConv.0043D5A6
0043D59E |. 8B08 mov ecx,dword ptr ds:[eax]
0043D5A0 |. 8B11 mov edx,dword ptr ds:[ecx]
0043D5A2 |. 50 push eax
0043D5A3 |. FF52 04 call dword ptr ds:[edx+4]
0043D5A6 |> 895C24 34 mov dword ptr ss:[esp+34],ebx
0043D5AA |. E9 F8010000 jmp STDUConv.0043D7A7
0043D5AF |> 8D4C24 40 lea ecx,dword ptr ss:[esp+40] ; 注册正确对话框
0043D5B3 |. E8 58C5FCFF call STDUConv.00409B10
0043D5B8 |. 895C24 3C mov dword ptr ss:[esp+3C],ebx
0043D5BC |. 68 0A830000 push 830A
0043D5C1 |. 8D4C24 40 lea ecx,dword ptr ss:[esp+40]
0043D5C5 |. C64424 50 05 mov byte ptr ss:[esp+50],5
0043D5CA |. E8 314AFCFF call STDUConv.00402000
0043D5CF |. 8B4424 38 mov eax,dword ptr ss:[esp+38]
0043D5D3 |. 8B4C24 40 mov ecx,dword ptr ss:[esp+40]
0043D5D7 |. 8B56 04 mov edx,dword ptr ds:[esi+4]
0043D5DA |. 6A 40 push 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
0043D5DC |. 50 push eax ; |Title
0043D5DD |. 51 push ecx ; |Text
0043D5DE |. 52 push edx ; |hOwner
0043D5DF |. FF15 24644C00 call dword ptr ds:[<&USER32.MessageBoxW>] ; \MessageBoxW
0043D5E5 |. 68 F4F94C00 push STDUConv.004CF9F4 ; UNICODE "
"
以上是注册过程的破解。下面是去掉起动窗口的过程。采用的方式还是手动补丁了。
F12堆栈调用法到关键CALL处
0043D977 |. FF15 D4634C00 call dword ptr [<&USER32.GetActiveWin>; [GetActiveWindow
0043D97D |. 50 push eax
0043D97E |. 8D4C24 74 lea ecx, dword ptr [esp+74]
0043D982 |. E8 69BAFEFF call 004293F0 ; 关键CALL
0043D987 |. 83F8 01 cmp eax, 1 ; 在这里下断点。
0043D98A |. 8D4C24 6C lea ecx, dword ptr [esp+6C]
0043D98E |. 889C24 040C00>mov byte ptr [esp+C04], bl
0043D995 |. 74 25 je short 0043D9BC
0043D997 |. E8 14A5FCFF call 00407EB0
0043D99C |. 8D47 F0 lea eax, dword ptr [edi-10]
具体思路:去掉关键CALL,跳到补丁代码处,恢复执行到cmp eax,1处时的寄存器和堆栈的数据。对比原程序
寄存器值:
EAX 00000001
ECX 0012FE90
EDX 00000002
EBX 00000000
ESP 0012F294
EBP 0012FFC0
ESI 00000224
EDI 001842B0 UNICODE "545503445"
堆栈值:
0012F294 7C80B6B1 kernel32.GetModuleHandleA
在程序的结尾找空数据的地方,或者自己添加一个段都可以了。
修改这里为0043D982 jmp XXXXXXXX
在XXXXXXXX处填写以下代码:
pop eax
pop ebx
inc eax
mov edx, 2
mov ecx, 12FE90
push 12F294
pop esp
push 12FFC0
pop ebp
mov esi, 224
mov edi, 1842B0
jmp 0043D987
OK了。
--------------------------------------------------------------------------------
【经验总结】
这里出现了一个jmp.&USER32.BlockInput,这个主要是为了防止逆向分析人员控制调试器,当脱壳主例程运行的时候,壳可
以通过调用user32!BlockInput() API 来阻断键盘和鼠标的输入。通过垃圾代码和反-反编译技术进行隐藏使用这种方法,
如果逆向分析人员没有识别出来的话是很有效的。一旦生效系统看上去没有反应,只剩下逆向分析人员在那里莫名其妙。
但这次出现的位置在关键CALL的上下。所以记录一下。
示例
BlockInput()需要一个boolean型的参数fBlockIt。如果这个参数是true,键盘和鼠标事件被阻断;如果是false,键盘和鼠
标事件被解除阻断:
; Block input
push TRUE
call [BlockInput]
.....
;Unblock input
push FALSE
call [BlockInput]
对策:这里直接修改push 1为push 0
至于如何爆破,做补丁就不写了。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2010年05月14日 10:10:13
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!