【文章标题】: 一款转换软件的爆解及手动补丁
【软件名称】: 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