在网上下了个《全国报纸天天读》软件,这款软件在大概试用几十秒之后就会出现对话框,提示试用时间已到(史上试用时间最短的软件),然后点击确定后软件就关闭。
用od打开,运行后竟然刚出现启动画面软件就不运行了,接着到了系统的领空,看来这条路不好走。那试试找字符串吧,在软件上选择注册,随便写了几个数字,点确定竟然什么提示都没有。用od插件搜搜吧(不知道为什么,只能搜ascll字符串,不能搜unicode的,否则会出错),从底往上搜,终于发现了“评估时间到,请注册”的字符串双击一下,看到:
0043B002 . 50 PUSH EAX
0043B003 . 68 F0030000 PUSH 3F0
0043B008 . E8 89940000 CALL <JMP.&MFC42.#5951>
0043B00D . 81BE 94000000>CMP DWORD PTR DS:[ESI+94],2BC
0043B017 . 75 3A JNZ SHORT Rpaper.0043B053
0043B019 . 8B8E 98000000 MOV ECX,DWORD PTR DS:[ESI+98]
0043B01F . 8B56 20 MOV EDX,DWORD PTR DS:[ESI+20]
0043B022 . 51 PUSH ECX ; /TimerID
0043B023 . 52 PUSH EDX ; |hWnd
0043B024 . FF15 84B84400 CALL DWORD PTR DS:[<&USER32.KillTimer>] ; \KillTimer
0043B02A . 8BCE MOV ECX,ESI
0043B02C . C786 94000000>MOV DWORD PTR DS:[ESI+94],0
0043B036 . E8 55940000 CALL <JMP.&MFC42.#4853>
0043B03B . 6A 00 PUSH 0
0043B03D . 6A 00 PUSH 0
0043B03F . 68 80314700 PUSH Rpaper.00473180 ; 评估时间到,请注册,继续试用请重新开始!
0043B044 . 8BCE MOV ECX,ESI
0043B046 . E8 21940000 CALL <JMP.&MFC42.#4224>
0043B04B 6A 00 PUSH 0
0043B04D FF15 88B84400 CALL DWORD PTR DS:[<&USER32.PostQuitMess>; USER32.PostQuitMessage
0043B053 > 8BCE MOV ECX,ESI
0043B055 . E8 24940000 CALL <JMP.&MFC42.#2379>
0043B05A . 5E POP ESI
0043B05B . C2 0400 RETN 4
大家看到了,在这个字符串左右调用了2个函数(还调用了mfc中的几个函数,大概是绘制对话框的),一个是killtimer,一个是postquitmess,很显然这里是关闭计时器,并且令程序结束。
仔细看这2行
0043B00D . 81BE 94000000>CMP DWORD PTR DS:[ESI+94],2BC
0043B017 . 75 3A JNZ SHORT Rpaper.0043B053
这里程序做了个比较,如果不相等就跳转,那么相等呢?当然就执行底下的语句,也就是关闭程序的语句了.很简单的,把JNZ改成JMP,然后保存一下,这个软件再也不会弹出试用已到的对话框了。
有的人可能会问,虽然把JNZ改成JMP,你怎么就确定JMP以后的语句不会反过来执行上面那段关闭程序的代码呢。很简单,我把破解的软件开了几个小时,一点问题都没有。有时候破解就像做探索实验,没必要纠结程序每个细节,只要实验成功了就行了
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)