深入跟踪
这里是个高强度的工作,你需要有足够耐力和观察分析判断力。你没有注册,又过了试用期。所以你必须找到所有的判断注册与否的关键跳转,并记录下相关的代码部分(该软件使用的非可逆注册算法,只能爆破)。通过寻找,会得到如下关键代码处:
1、005131FA SETE AL
2、0051321E JNZ SHORT LsDown.00513227
3、00533C89 JE SHORT LsDown.00533C91
通过分析和试验,发现需要将它们分别更改成为:
1、005131FA MOV AL,1
NOP
2、0051321E JE SHORT LsDown.00513227
3、00533C89 JNZ SHORT LsDown.00533C91
则软件可以使用并且没有任何限制。
制作模拟补丁
因为这里所说的补丁制作不是在软件里直接完成,而是另用编程软件制作,所以需要取得补丁的汇编级机器码。又因为上述需要修改的汇编代码的机器码为:
MOV AL,1-->B0 01
NOP -->90
JE SHORT LsDown.00513227-->74 07
JNZ SHORT LsDown.00533C91-->75 06
其偏移地址分别为:
005131FA
0051321E
00533C89
所以模拟补丁形如:
MOV WORD PTR SS:[5131FA],1B0
MOV BYTE PTR DS:[5131FC],90
MOV BYTE PTR DS:[51321E],74
MOV BYTE PTR DS:[533C89],75
JMP LsDown.006083BA ;补丁完成后的返回
NOP
NOP
再在OllyDbg中下面的代码区的全0区域的任意位置输入上述汇编代码,然后复制出对应的汇编机器码备用。在返回到偏移006083B0处,将JNZ SHORT LsDown.006083BA改为形如JMP 0060A310(你选定的位置),复制出机器码备用。到此,模拟补丁代码获取工作完成。
编写补丁程序
众所周知,反汇编后的代码位置的偏移与软件经过编译后的物理偏移是不一样的,要在壳外植入补丁需要取得对应位置的物理偏移。我们这里需要两处物理偏移,一处是对应于JNZ SHORT LsDown.006083BA的,一处是补丁部分的起始位置,这就要借助于文本编辑器进行。
用UltraEdit(或其它文本编辑器)打开前面保存的修改过的更名文件,使用查找功能查找hex:75 08 B8 01(对应于JNZ SHORT LsDown.006083BA)。得到首地址为:000935B0h,记下备用,然后拉到文件的最后,查找添加的代码位置(对应RETN),得到首地址为:00095510h(视你选择的位置不同而不同),记下备用,至此全部准备工作完成。
做好上述准备工作后,你就可以使用任一编程软件来编写你的补丁用程序了。
请注意我们所要做的工作:修改006083B0处的跳转;植入动态补丁代码和设置返回跳转,其余还应该考虑版本检测、原文件备份、提示帮助等问题。以下是我用 VB 编写的主要部分代码:
Open Fname For Binary As fhandle
'再次检验
'=============================================
'寻找软件版本的关键标志
'VB中Get命令读数据指针从1开始,注意与hex编辑器中的地址
'的区别。即 偏移+1。
Get fhandle, &H935B0, data1 '为保险读取四个字节,也可多读
Get fhandle, &H935B1, data2
Get fhandle, &H935B2, data3
Get fhandle, &H935B3, data4
'=============================================
If (data1 <> &H61) And (data2 <> &H75) And (data3 <> &H8) _
And (data4 <> &HB8) Then MsgBox "请核对软件版本!", _
vbCritical + vbOKOnly, "文件错误:": Close fhandle: Exit Sub
'修改全部要补丁的数据
'==========================
'壳的出口部分的修改
Put fhandle, &H935B1, &HE9
Put fhandle, &H935B2, &H5B
Put fhandle, &H935B3, &H1F
Put fhandle, &H935B4, &H0
Put fhandle, &H935B5, &H0
Put fhandle, &H935B6, &H90
Put fhandle, &H935B7, &H90
'增加动态修改用代码
Put fhandle, &H95511, &H66
Put fhandle, &H95512, &H36
Put fhandle, &H95513, &HC7
Put fhandle, &H95514, &H5
Put fhandle, &H95515, &HFA
Put fhandle, &H95516, &H31
Put fhandle, &H95517, &H51
Put fhandle, &H95518, &H0
Put fhandle, &H95519, &HB0
Put fhandle, &H9551A, &H1
Put fhandle, &H9551B, &HC6
Put fhandle, &H9551C, &H5
Put fhandle, &H9551D, &HFC
Put fhandle, &H9551E, &H31
Put fhandle, &H9551F, &H51
Put fhandle, &H95520, &H0
Put fhandle, &H95521, &H90
Put fhandle, &H95522, &HC6
Put fhandle, &H95523, &H5
Put fhandle, &H95524, &H1E
Put fhandle, &H95525, &H32
Put fhandle, &H95526, &H52
Put fhandle, &H95527, &H0
Put fhandle, &H95528, &H74
Put fhandle, &H95529, &HC6
Put fhandle, &H9552A, &H5
Put fhandle, &H9552B, &H89
Put fhandle, &H9552C, &H3C
Put fhandle, &H9552D, &H53
Put fhandle, &H9552E, &H0
Put fhandle, &H9552F, &H75
Put fhandle, &H95530, &HE9
Put fhandle, &H95531, &H86
Put fhandle, &H95532, &HE0
Put fhandle, &H95533, &HFF
Put fhandle, &H95534, &HFF
Put fhandle, &H95535, &H90
Put fhandle, &H95536, &H90
Put fhandle, &H95537, &H90
'完成写入,关闭它
Close fhandle