分析基础逆向程序3
打开程序
在使用一个功能后出现未注册标志
点击注册后出现的字符串
将程序载入od,查找字符串
先进行查找“Invalid Password”
查看字符串上方代码
发现经过test与je指令后输出未注册字符
现在考虑修改je标志位
测试结果:未注册字符消失,但实际上校验是否注册的算法未通过,只得到表面注册的结果
推测上方的call语句为进行校验算法
进行调试并观察寄存器的值
运行至此处al=0,je跳转成立。故校验算法在call语句中
进入call语句查看代码
程序先对***进行载入,然后判断***位数,接下来进行一系列运算最后从中间的retn中出去
可以忽略算法校验对输出的结果进行修改,将xor指令修改成将al的值为1
测试成功
打开程序将程序载入od
对Windows api进行搜索关键名称
本次先搜索常用的GetWindowTest(后面a为ASCII,w为Unicode)
ctrl+n搜索在其中右键设置断点
然后开始运行程序,若程序在验证***窗口处停下,则证明该语句后的代码包含验证的算法
若没有停下则继续更换常用的api函数进行继续寻找在点击提交***后在此停止
进入4625AB查看发现运行在dll,证明验证的算法在此段后,进行单步调试
后续一部分代码循环来对序列码进行入栈
向下寻找条件判断语句
遇到第一个判断语句联系后方代码判断该语句作用是判断若输入的值为空则跳转到此处
继续调试
直到此处出现一个很经典的条件判断:call + test + jnz
通过后面的jnz的跳转大体确定call内为判断语句
从call内出来al的值果然为0
测试修改jnz的标志位来达到目的提示成功
点击确认后仍然出现注册信息,同时依然显示未注册故简单修改标志位不能达到目的,判断程序仍然有算法来保证,需要进入call内部
观察代码
发现有两个retn 8,同时第一个retn前将al赋值1,后一个将al使用xor清0
推测:校验成功后跳转到第一个retn返回,否则则到第二个retun
接下来寻找条件跳转语句前两个跳转到第一个retn下方但未实现故忽略
此处跳转实现故需要修改
连续出现三处jnz需要修改此处同样需要修改
先修改标志位后同样显示未注册
重新进行调试
推测失败原因:程序拥有另外一段验证算法
点击about后出现has not been registered 可以换个思路查这个
右键查找进入寻找字符
同样此处有call + test + je
进入call中查看并设置断点
运行程序
程序在未启动前在刚才call语句设置的断点处停下
故此部分是程序启动前的校验部分
观察并调试代码
此处jnz不成立未能令bl=1然后bl清零jmp最后将bl的值给al
测试修改此处令al=1,是否成功测试成功