重启文件验证型程序逆向之二、有时间限制的重启文件验证型
本帖最后由 iy0507 于 2010-4-22 11:00 编辑重启文件验证型程序逆向之二、有时间限制的重启文件验证型
配置:
本人操作系统:Windows XP sp2
破解软件:CDMC 2007 E(CD Msetup) 老外的一个CD程序
使用工具 :OD(任意版本)、PEID V0.94、十六进制计算器。
~~~~~~~~~~~~~~~~~~~~~~~~~~
无聊时的练习记录,本人逆向经验不足,有任何披漏请各位指点。
~~~~~~~~~~~~~~~~~~~~~~~~~~
打开程序一看提示大概意思是"只有30天试用期",而且注册需要网络验证
帮助菜单中出现"Shareware"大概意思是共享字符串,咱们就查找该字符串。逆向上称为断窗口调用。
使用DEID查看没有壳是VB语言写的
使用C32asm进行查找“Shareware”
004C79AA8B55 E8 MOV EDX,
004C79AD52 PUSH EDX
004C79AE68 14C34200 PUSH 42C314 \->: (Shareware)
004C79B3FFD7 CALL EDI
OD载入程序,忽略所有异常(保险起见)。
在OD中跟随,不过发现价值不大。
004C798E .8B4D E8 MOV ECX,DWORD PTR SS:
004C7991 .51 PUSH ECX
004C7992 .68 FCC24200 PUSH 0042C2FC ;UNICODE "(Demo)"
004C7997 .FFD7 CALL EDI
004C7999 .8BD0 MOV EDX,EAX
004C799B .8D4D E8 LEA ECX,DWORD PTR SS:
004C799E .FFD6 CALL ESI
004C79A0 >66:833D 30C04>CMP WORD PTR DS:,0
004C79A8 .74 12 JE SHORT 004C79BC
004C79AA .8B55 E8 MOV EDX,DWORD PTR SS:
004C79AD .52 PUSH EDX
004C79AE .68 14C34200 PUSH 0042C314 ;UNICODE "(Shareware)"
这时又想到了使用VB断点“rtcGetPresentDate”,该函数用于获取当前系统日期。逆向上称为断文件调用。
在OD命令行 " BPXrtcGetPresentDate "
Alt+B查看“BPX”命令下的断点~丫丫几百个~晕
分析吧~(分析软件获取当前系统日期的方法是个笨蛋方法,没有深厚的功力是分析不了的)
经过分析N个“rtcGetPresentDate”函数后决定放弃
VB语言还有一个简单而又麻烦的办法
就是Ctrl+B搜索816C24 然后分别在他上面的JMP设置F2断点.逆向上称为断窗口调用。
(经验:1、找比较多JMP与SUB的地方下断(根据程序大小决定)。2、别一下子全部下断,不然OD可能假死(根据硬件配置不同而定))
.....忽略几百行类似的代码....
0041F88E . /E9 BDAC0800 JMP 004AA550
0041F893 . |816C24 04 970>SUB DWORD PTR SS:,397
0041F89B . |E9 20AD0800 JMP 004AA5C0
0041F8A0 . |816C24 04 9B0>SUB DWORD PTR SS:,39B
0041F8A8 . |E9 83AD0800 JMP 004AA630
0041F8AD . |816C24 04 AB0>SUB DWORD PTR SS:,3AB
0041F8B5 . |E9 E6AD0800 JMP 004AA6A0
0041F8BA . |816C24 04 FFF>SUB DWORD PTR SS:,0FFFF
0041F8C2 . /E9 49AE0800 JMP 004AA710 ;主窗口
0041F8C7 . |816C24 04 FFF>SUB DWORD PTR SS:,0FFFF
0041F8CF . |E9 0CB90800 JMP 004AB1E0 ;注册提示窗口
0041F8D4 .816C24 04 270>SUB DWORD PTR SS:,227
在0041F8C2与0041F8CF就是我们的关键了,别的全部取消吧,Ctrl+F2重新载入程序,
F9运行,中断在0041F8C2继续F9运行。出现主窗口,程序在OD中又中断在0041F8CF,F9运行吧。
程序出现注册提示窗口。
我们现在知道程序是先运行主窗口然后再运行注册提示窗口,那么可能是主窗口区段调用注册提示窗口段。
到主窗口段开始 分析代码吧 (即从004AA710到004AB1D6总共2758条代码~逆向这碗饭真是不好吃)
当然聪明的逆向工程系是不会这样去瞎分析的。咱们可以使用“返回跟踪法”进行跟踪
返回跟踪法原理:
在OD中如果某个call调用某段代码的时候,当OD中断在call调用的第一行代码时,
就可以在OD的堆帐窗口中看到返回调用call的地址
(如00401000CALL 004100CC
00401005MOV EAX,1
当程序中断在004100CC PUSH EBX的时候,
OD的堆帐窗口将提示是返回到00401005)。
利用OD提供的方便,我们让OD中断在0041F8CF(开始调用注册提示窗口的JMP)
看堆帐窗口:
0012FB10 004ABBDERETURN to SLCDEDIT.004ABBDE ;返回到“004ABBDE”,我们去“004ABBDE”看看吧
0012FB14 001784A0
0012FB18 0012FB3C
Ctrl+G到“004ABBDE”
004ABBC3 > \66:833D 30C04>CMP WORD PTR DS:,0 ;4、这是决定下面的JE跳转,将4EC030指向的值减去0
004ABBCB .0F84 8A000000 JE 004ABC5B ;3、发现这个跳能跳过调用“0041F8CF”的call
004ABBD1 .8B0E MOV ECX,DWORD PTR DS:
004ABBD3 .8D55 C4 LEA EDX,DWORD PTR SS:
004ABBD6 .52 PUSH EDX
004ABBD7 .56 PUSH ESI
004ABBD8 .FF91 D0090000 CALL DWORD PTR DS: ;2、这里就是调用“0041F8CF”的call向上面看有没有跳跳过该call
004ABBDE .85C0 TEST EAX,EAX ;1、跟随到这里
004ABBE0 .7D 12 JGE SHORT 004ABBF4
逆向就是反则看,程序从上向下执行,咱们就从下向上分析。
决定004ABBCB处的JE(下面将简声 JE)是否跳,的关键就是004ABBC3处的CMP。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
汇编指令说明:
CMP:
指令格式:CMP ORP1,ORP2
指令功能:目操作数减去源操作数,不保存结果但修改相关标志位。(即ORP1-ORP2)
ZF:零标志位,运行结果为0时ZF=1,否则为ZF=0
JZ/JE 相等或为零为则跳转
JNZ/JNE 不相等或不为零则跳转
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
代码逆向分析:
CMP WORD PTR DS:,0 ;将4EC030指向的值减去0,修改ZF标志位
JE 004ABC5B ;如果ZF标志位等于1则跳,否则不跳
在数据窗口Ctrl+G跟随“4EC030”
004EC030FF FF 00 00 00 00 00 00 反过来就是FF FF(数据存储的问题如果是1234,在数据存储的是将写成34 12)
FFFF-0=FFFF
ZF则等于0,JE将不会跳,程序就执行004ABBD8处的call,如果4EC030等于0,则0-0=0 ZF等于1。
或者直接将JE改成JNE,程序将跳过004ABBD8处的call。
经过测试发现程序是多次使用4EC030的值用于验证。包括是否提示“Shareware”字符串
(这里就是一个乌龙,在前面即可逆向分析程序了,但是却认为没价值)
在OD命令行下 HW 4EC030(HW 硬件写入断点),Ctrl+F2重新载入。F9运行。
程序有两次写入
第一次
004AC35D .52 PUSH EDX ;
004AC35E .66:891D 2CC04>MOV WORD PTR DS:,BX ;4EC02C写入00
004AC365 .66:891D 30C04>MOV WORD PTR DS:,BX ;4EC030写入00
第二次
004AC55A .85C0 TEST EAX,EAX
004AC55C . /75 1D JNZ SHORT 004AC57B ;关键跳
004AC55E . |66:C705 30C04>MOV WORD PTR DS:,0FFFF ;4EC030写入FF FF 0
004AC567 . |66:891D 2CC04>MOV WORD PTR DS:,BX ;4EC02C写入00
004AC56E . |68 89C94A00 PUSH 004AC989
4EC030写入FF FF了,我们可以将JNZ改成JE或者JZ即可,或者改成写入0
改成JE
004AC55A .85C0 TEST EAX,EAX
004AC55C . /74 1D JZ SHORT 004AC57B ;JNZ改成JE
004AC55E . |66:C705 30C04>MOV WORD PTR DS:,0FFFF ;
004AC567 . |66:891D 2CC04>MOV WORD PTR DS:,BX ;
004AC56E . |68 89C94A00 PUSH 004AC989
改成写入0
004AC55A .85C0 TEST EAX,EAX
004AC55C 75 1D JNZ SHORT 004AC57B
004AC55E 66:C705 30C04>MOV WORD PTR DS:,0 ;或者是“MOV WORD PTR DS:,BX”都一样
004AC567 .66:891D 2CC04>MOV WORD PTR DS:,BX
004AC56E .68 89C94A00 PUSH 004AC989
出现主界面了!成功了??应该是的,我没有去测试O(∩_∩)O~。
~~~~~~~~~~~~~~~~~~~~~~~~~~
后记:
大家可以尝试使用 CreateFile(A/W) 函数进行跟踪,程序跳过访问文件的call就可以了。
;CreateFileA 创建或打开文件、管道、邮槽、通信服务、设备以及控制台。
还可以使用 F12堆帐暂停法 进行跟踪
2010年5月14日20:32:57
by:Howlet 哈哈,楼主解说的比较专业,小心把新手吓着。 呵呵 就是 吓到啦 很专业的,看不懂!! 没图吗...不知所云唉 你这是修改谁的文章....都超时了.... 本帖最后由 iy0507 于 2010-5-11 16:07 编辑
他讲解思路还是详细的,刻意转O(∩_∩)O~
你这是修改谁的文章....都超时了....
作者回复了,是他调试软件时修改日期后忘记修改回来
然后直接使用搜狗输入日期,才造成错误日期,呵呵
页:
[1]