iy0507 发表于 2010-4-22 10:58

重启文件验证型程序逆向之二、有时间限制的重启文件验证型

本帖最后由 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

iy0507 发表于 2010-4-22 11: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

bob123 发表于 2010-4-22 11:45

哈哈,楼主解说的比较专业,小心把新手吓着。

oo789458 发表于 2010-4-22 12:15

呵呵 就是   吓到啦

daibillion 发表于 2010-4-22 12:54

很专业的,看不懂!!

YeMelody 发表于 2010-4-22 12:56

没图吗...不知所云唉

Hmily 发表于 2010-4-26 16:36

你这是修改谁的文章....都超时了....

iy0507 发表于 2010-4-27 16:05

本帖最后由 iy0507 于 2010-5-11 16:07 编辑

他讲解思路还是详细的,刻意转O(∩_∩)O~

你这是修改谁的文章....都超时了....

作者回复了,是他调试软件时修改日期后忘记修改回来
然后直接使用搜狗输入日期,才造成错误日期,呵呵
页: [1]
查看完整版本: 重启文件验证型程序逆向之二、有时间限制的重启文件验证型