逆向入门(12)程序逆向篇-Acid burn
打开先有个NAG
先给他去了
OD
里面找到字符串,跳转到对应代码处
在0042F786
处下断,运行,断下后,然后ctrl+F9
返回到call
处
这个地方有点小坑,用之前的jnz
或者改cmp
都不行,这里会反复调用好几次,有时候是判断相同,有时候是判断不同,会引起内容报错,但是程序还是可以正常用的。所以就换了种方法,直接使用jmp
这样强制跳,接着将修改过的exe
另存再重新打开,这次就没有弹窗了。
打开新的程序,需要破解的有两个,一个是用户名加序列号,另外一个是序列号
先来序列号的吧,看看样子
搜索字符串
找到了对应分支,改je
试试
可以了,但是这里还是写注册机,还原汇编后继续往上看
这里没有看到明显的cmp
之类的比较,大概率是最后一个call
引起的标志位的改变,不过这里,可以在最上面下断,然后追一下数值看看。
上面的call
里面也有很多test
,这里的字符应该就这个固定字符串Hello Dude!
了
ok
,再进行下一个,看用户名和序列号的。
找到对应的代码处
这里是用来判断用户名长度是否大于等于4
的,直接过,然后又回到了之前单序列号的判断流程上来了
分析写在注释里面了,同时可以结合栈里面的情况,知道序列号组成由固定的CW-
开头,接着由用户名算出来的key
,最后一部分是固定的-CRACKED
。
而算法也很简单,用户名的第一位数转成
ascii
码,先乘以0x29
再翻倍,写出注册机
#include <iostream>
#include <string>
#include <cstdint>int main() {std::string username;// 获取用户名输入std::cout << "用户名: ";std::getline(std::cin, username);if (username.length() >= 4) {int key = (username[0] * 0x29) * 2;printf("序列号是:CW-%d-CRACKED",key);}else {printf("用户名长度应该大于3");}return 0;
}
搞定,其实算法也只取了用户名的首位