在主程序中发送退出消息然后在消息循环中退出的程序如何破解 (3千字)
在主程序中发送退出消息然后在消息循环中退出的程序如何破解现在很多程序,如果没有软件狗,或时间过期,在运行中途就自动退出,常规的教学都是让拦或用W32dasm查找 exitprocess函数,但当拦到这个函数已经退出主程序了,作用不大,其实还有一条好用的,这就是bpx postquitmessage下面以我破解得不完全的黎之工资为例说明:
上次我破的程序不完全,时间超过2001年后,打印功能失效。即然是与时间相关我就下bpx getlocaltime按报表打印拦到后按F12后到下面:(记不清几次了)
:0051D2D9 E98A65EEFF jmp 00403868
:0051D2DE EBF0 jmp 0051D2D0
:0051D2E0 8B45D4 mov eax, dword ptr [ebp-2C]
:0051D2E3 8B55DC mov edx, dword ptr [ebp-24]
:0051D2E6 E8916EEEFF call 0040417C
:0051D2EB 730D jnb 0051D2FA
:0051D2ED 8B45D8 mov eax, dword ptr [ebp-28]
:0051D2F0 8B55E0 mov edx, dword ptr [ebp-20]
:0051D2F3 E8846EEEFF call 0040417C
:0051D2F8 7249 jb 0051D343 //将这里改为JMP
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0051D2EB(C)
|
:0051D2FA A164225200 mov eax, dword ptr [00522264]
:0051D2FF 8B00 mov eax, dword ptr [eax]
:0051D301 8B4074 mov eax, dword ptr [eax+74]
:0051D304 8B4024 mov eax, dword ptr [eax+24]
:0051D307 BA0C000000 mov edx, 0000000C
:0051D30C E823ADF4FF call 00468034
:0051D311 8D5584 lea edx, dword ptr [ebp-7C]
:0051D314 8B08 mov ecx, dword ptr [eax]
:0051D316 FF5158 call [ecx+58]
在softice环境中再按数次F12打印界面出现了,但一按F5程序自动退出了。
别急,打印界面能出现说明前面的判断是对的,后面还有比较,现在是解决程序退出问题
首先改好0051d2f8处,然后bpx postquitmessage
拦到后按F12到下面
* Referenced by a CALL at Addresses:
|:0044F1C3 , :0048E4BE , :0048E53B , :0048E5A4 , :004B6DC0
|:004B7347 , :0050EFEC , :0051D0EF , :0051D599
|
:00452BE4 E88BB6FBFF call 0040E274
:00452BE9 84C0 test al, al
:00452BEB 7407 je 00452BF4
:00452BED 6A00 push 00000000
* Reference To: user32.PostQuitMessage, Ord:0000h
|
:00452BEF E86455FBFF Call 00408158 //就是这里让程序退出
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00452BEB(C)
|
:00452BF4 C3 ret
总于让我抓住狐狸的尾巴了,现在的关键是让这条psostquitmessage指令不运行
如果单纯的改上面的00452BEB 让其JMP的话程序是能运行了,但是退不出去了,现在是要知道是什么地方调用这段过程,临时在00452beb处设断,拦到后用r fl z让其不运行psostquitmessage按F10到这里:
:0050EFCC D805A4F05000 fadd dword ptr [0050F0A4]
:0050EFD2 DB7DF0 fstp tbyte ptr [ebp-10]
:0050EFD5 9B wait
:0050EFD6 E8F5C0EFFF call 0040B0D0
:0050EFDB DB6DF0 fld tbyte ptr [ebp-10]
:0050EFDE DED9 fcompp
:0050EFE0 DFE0 fstsw ax
:0050EFE2 9E sahf
:0050EFE3 730C jnb 0050EFF1
:0050EFE5 A120225200 mov eax, dword ptr [00522220]
:0050EFEA 8B00 mov eax, dword ptr [eax]
:0050EFEC E8F33BF4FF call 00452BE4 //原来就是在这里调用的
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0050EFAE(C), :0050EFE3(C)
到此当然知道去改什么地方去了将0050EFE3 处改为JMP,我也跟着Jump了,不知这次是否改全了?大家试试看。
