好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 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”
004C79AA 8B55 E8 MOV EDX, [EBP-18]
004C79AD 52 PUSH EDX
004C79AE 68 14C34200 PUSH 42C314 \->: (Shareware)
004C79B3 FFD7 CALL EDI
OD载入程序,忽略所有异常(保险起见)。
在OD中跟随,不过发现价值不大。
004C798E . 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
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:[EBP-18]
004C799E . FFD6 CALL ESI
004C79A0 > 66:833D 30C04>CMP WORD PTR DS:[4EC030],0
004C79A8 . 74 12 JE SHORT 004C79BC
004C79AA . 8B55 E8 MOV EDX,DWORD PTR SS:[EBP-18]
004C79AD . 52 PUSH EDX
004C79AE . 68 14C34200 PUSH 0042C314 ; UNICODE " (Shareware)"
这时又想到了使用VB断点“rtcGetPresentDate”,该函数用于获取当前系统日期。逆向上称为断文件调用。
在OD命令行 " BPX rtcGetPresentDate "
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:[ESP+4],397
0041F89B . |E9 20AD0800 JMP 004AA5C0
0041F8A0 . |816C24 04 9B0>SUB DWORD PTR SS:[ESP+4],39B
0041F8A8 . |E9 83AD0800 JMP 004AA630
0041F8AD . |816C24 04 AB0>SUB DWORD PTR SS:[ESP+4],3AB
0041F8B5 . |E9 E6AD0800 JMP 004AA6A0
0041F8BA . |816C24 04 FFF>SUB DWORD PTR SS:[ESP+4],0FFFF
0041F8C2 . /E9 49AE0800 JMP 004AA710 ; 主窗口
0041F8C7 . |816C24 04 FFF>SUB DWORD PTR SS:[ESP+4],0FFFF
0041F8CF . |E9 0CB90800 JMP 004AB1E0 ; 注册提示窗口
0041F8D4 . 816C24 04 270>SUB DWORD PTR SS:[ESP+4],227
在0041F8C2与0041F8CF就是我们的关键了,别的全部取消吧,Ctrl+F2重新载入程序,
F9运行,中断在0041F8C2继续F9运行。出现主窗口,程序在OD中又中断在0041F8CF,F9运行吧。
程序出现注册提示窗口。
我们现在知道程序是先运行主窗口然后再运行注册提示窗口,那么可能是主窗口区段调用注册提示窗口段。
到主窗口段开始 分析代码吧 (即从004AA710到004AB1D6总共2758条代码~逆向这碗饭真是不好吃)
当然聪明的逆向工程系是不会这样去瞎分析的。咱们可以使用“返回跟踪法”进行跟踪
返回跟踪法原理:
在OD中如果某个call调用某段代码的时候,当OD中断在call调用的第一行代码时,
就可以在OD的堆帐窗口中看到返回调用call的地址
(如00401000 CALL 004100CC
00401005 MOV EAX,1
当程序中断在004100CC PUSH EBX的时候,
OD的堆帐窗口将提示是返回到00401005)。
利用OD提供的方便,我们让OD中断在0041F8CF(开始调用注册提示窗口的JMP)
看堆帐窗口:
0012FB10 004ABBDE RETURN to SLCDEDIT.004ABBDE ;返回到“004ABBDE”,我们去“004ABBDE”看看吧
0012FB14 001784A0
0012FB18 0012FB3C
Ctrl+G到“004ABBDE”
004ABBC3 > \66:833D 30C04>CMP WORD PTR DS:[4EC030],0 ;4、这是决定下面的JE跳转,将4EC030指向的值减去0
004ABBCB . 0F84 8A000000 JE 004ABC5B ;3、发现这个跳能跳过调用“0041F8CF”的call
004ABBD1 . 8B0E MOV ECX,DWORD PTR DS:[ESI]
004ABBD3 . 8D55 C4 LEA EDX,DWORD PTR SS:[EBP-3C]
004ABBD6 . 52 PUSH EDX
004ABBD7 . 56 PUSH ESI
004ABBD8 . FF91 D0090000 CALL DWORD PTR DS:[ECX+9D0] ;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:[4EC030],0 ;将4EC030指向的值减去0,修改ZF标志位
JE 004ABC5B ;如果ZF标志位等于1则跳,否则不跳
在数据窗口Ctrl+G跟随“4EC030”
004EC030 FF FF 00 00 00 00 00 00 |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|