吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5845|回复: 7
收起左侧

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

[复制链接]
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”
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  

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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:[4EC02C],BX              ;  4EC02C写入00
004AC365   .  66:891D 30C04>MOV WORD PTR DS:[4EC030],BX              ;  4EC030写入00

第二次
004AC55A   .  85C0          TEST EAX,EAX
004AC55C   . /75 1D         JNZ SHORT 004AC57B                                        ;关键跳
004AC55E   . |66:C705 30C04>MOV WORD PTR DS:[4EC030],0FFFF                ;  4EC030写入FF FF 0
004AC567   . |66:891D 2CC04>MOV WORD PTR DS:[4EC02C],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:[4EC030],0FFFF                ;
004AC567   . |66:891D 2CC04>MOV WORD PTR DS:[4EC02C],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:[4EC030],0          ;或者是“MOV WORD PTR DS:[4EC030],BX”都一样
004AC567   .  66:891D 2CC04>MOV WORD PTR DS:[4EC02C],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~

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

作者回复了,是他调试软件时修改日期后忘记修改回来
然后直接使用搜狗输入日期,才造成错误日期,呵呵
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 04:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表