熟悉OD(顺便破解一个小工具)
上一节了解了OD的简单使用,这次就练习下,目标是破解一款小软件(入门练手用的,没有壳什么的)。
首先我们来看一下这个小软件:
我们的目的是输入任何字符串都可以成功注册,达到破解的目的。
这个东西破解方式很多,而且也不是唯一,逆向这东西很多地方都不是固定的,都是靠分析汇编逻辑细节,靠经验,有的时候还要靠猜,当然更需要的就是耐心。
说下我的分析过程:
1.首先看下有没有加壳:
OK 没有进行加壳处理。
2.加载到OD里:
注意左上角的地址,固定基址。
3.找到一个分析的入口,这个很容易想到就是
那么猜测一下:
if(***) 注册成功...
else 注册失败
我们查找注册失败的这个串的调用地址,应该是能找到他这个弹窗函数,这样我们可以看下这个附近有没有注册成功的串,如果有的话,那么可以简单判断应该是在同一个函数里完成的,也就是破解的位置j*这个语句也可能在这个函数里,如果没有看到那个成功串,只看到了注册失败,那么就有可能这是个失败函数,如果是个失败函数也比较好处理。我们在这打上断电,然后调试到ret的位置,这个时候堆栈应该是平衡的,正确的,我们直接看栈里的下一条地址,这个就应该是调用这个函数call FunError() 的下一条地址,至于为什么,这里就不解释了,汇编基础知识。同时我们还可以不看堆栈,直接在ret打上断点,然后F8就行了,当然也可以直接找到这个函数的最上面,也就是函数地址,这样可以直接查找谁调用过这个函数,然后再一一排除,不过感觉这样效率不高。
OK,继续往下走,我们可以先文档化的搜索下这个字符串在PE文件里的文件偏移位置:
OK 这里看到 文件偏移地址是81A79 在加上这个工具是固定基址:
所以可以简单计算字符串的内存位置是0x00400000+81A79 = 0x00481A79
那我们可以直接在OD里搜索常量:
然后我们可以分析上下文,来找找注册成功的串在不在,如果在就分析这个函数,否则就找调用这个函数的地方去找注册成功后call的那个函数。
结果是就在附近:
那么好办了,直接分析下这附近的汇编代码就行了。我分析了下,内容我写在注释里:
具体破解思路我也写在了注释里。
4.修改指令,保存文件实现破解jg A.00405D11 -> jl A.00405411
最后的破解结果是:
TIP:
最后提示一下,上面我通过找文件偏移地址然后计算字符串内存加载地址,还有另一种方式就是直接OD插件部分一个功能,插件->中文搜索引擎->ASCII直接搜索到注册失败的这个串,然后直接双击那一行会直接跳转到我们搜索计算后的常量的时候的那一行汇编代码出。然后后续分析流程一样。而且这只是其中一种破解思路,比如如果我们发现成功掉函数A 失败掉函数B 那么我们可以在失败Call B处改成 Call A 等等,根据具体情况而求改相关代码。还有,上面的是大体思路,我没有写OD的详细操作细节,比如怎么搜索东西,怎么改汇编代码,怎么保存等,这些都是基础操作我就不写了,很容易搜到。