解密系列之OD使用教程13——迷途
程序:XoftSpy41._96.exe
用PEID查看,是VC6编写的程序,用OD载入
获取文本框输入内容API:GetWindowTextA
API下断方法:
a.右键=>查找=>所有模块间的调用,直接输入API,找到后右键该行=>在每个调用到GetWindowTextA
上设置断点;
b.Ctrl+N,找到后右键=>在每个参考上设置断点;
按F9运行程序,删除输入注册码之前就触发的断点,最后输入注册信息之后,在如下位置断下
继续按F8浏览程序,在有跳转处仔细判断是否应该使之实现,来到下面地址处,查看该跳转后所在位置,可知应使其实现,上面有关键call,下断重新运行程序并跟进分析,仔细浏览下面的程序,发现还有与这段完全相同的程序段
可知程序可能在多处地方都存在验证注册代码,跟进后可看到这个子程序有2个返回点,在第1个返回点附近有mov al,1这条指令,猜测是成功的标志;在第2个返回点有xor al,al指令,猜测是失败的标志;按F8单步运行,遇到跳转时修改ZF标志位使其从第1个返回点返回,最终提示“恭喜注册成功”的信息,但是点击确定后发现并没有注册成功!这就是“迷途”!
解密系列之OD使用教程14——知返
程序:XoftSpy41._96.ex.
上一讲用获取编辑框内容的方法并不能实现破解,这次换个思路,采用字符串查找法。
双击高亮这行,来到
发现关键call,继续往上浏览,在子程序开始处下断,发现切换到主程序界面就会触发该断点
跟进关键call,发现子程序只有1个返回点,继续按F8单步执行,来到
根据栈顶所示,推测这个call是验证算法call。继续往下看,如果注册成功的话,会执行以下2句指令
mov bl, 1
mov al, bl
因此,将第2句指令改为mov al, 1即可,保存到可执行文件,测试成功。
解密系列之OD使用教程15——inline patch “内嵌补丁”
程序:DVDMen.Studio.exe
运行程序,有NAG窗口,有30天的试用期,将系统日期调至提前1年,发现软件过期不可用了,再重新将系统的日期调回,但软件还是过期不可用,说明程序在某个地方写入了是否过期的标志。
用PEID查看为VC6编写的程序,用OD载入程序,输入注册信息并点击确定,发现程序并不会断下。输入完注册信息后先不点击OK按钮,在OD中按下Ctrl+N,输入KillTimer
,并在每个参考上设置断点,然后返回软件点击OK,程序断下(此处KillTimer
是break
的作用,构成switch case
语句)。根据分析程序提示信息,得到eax必须等于4才可实现破解成功,如图
选中cmp eax, 4
这行,下面提示“跳转来自004DC1A0
”,右键=>转到jnz来自004DC1A0
,最终找到switch case
语句的开始处
在该子程序头部下断,按F9运行程序,输入注册信息,最后断下,单步执行,发现eax的值来源于上图高亮这行,直接修改为mov eax, 1
,但是修改后会覆盖后面2条指令,因此需要采用“内嵌补丁”的方式进行修补,补丁所在位置为005E47D0
,即程序后面填补为0的区域。
在004DBD9E
处右键=>Bookmark
=>Insert Bookmark
插入书签,对该句指令进行修改如下
同样,在5E47D0处进行修改如下,最后跳转回004DBDA3(即转到下一句继续执行)
将所做的修改保存到可执行文件,打开程序测试,发现程序进入死循环,这是为什么呢?继续载入未修改的程序进行分析,发现把eax的值修改为4后,程序并不能跳出switch case
语句,而把eax的值改为0B
后即可正常跳出。(此处解释有点牵强,但事实却是如此,还需深究原因)
解密系列之OD使用教程16——“堆栈法”
程序:DVDMenuStudiX.ex.
运行程序,先产生主窗口,再出现NAG窗口。用OD载入,按F9运行,NAG窗口出现后,按下暂停键,在打开堆栈窗口如下
双击最后一行,来到
004DC0D1 . E8 77FD0C00 call 005ABE4D
在该行下断,并在该子程序开始处下断
004DBD80 . 55 push ebp
004DBD81 . 8BEC mov ebp, esp
重新载入,按F9,来到断点处,按F8单步执行发现
004DBDBE . 83B8 64010000>cmp dword ptr [eax+164], 1
004DBDC5 . 75 1F jnz short 004DBDE6
004DBDC7 . 8BCF mov ecx, edi
如果上面跳转实现的话,就会004DC0D1
处的call而调出NAG窗口,因此NOP掉该条指令,保存,即可破解。