逆向入门(39、40)程序逆向篇-DaNiEl-RJ.1、genocide1
0x01 DaNiEl-RJ.1
有个说明教你怎么玩,然后exeinfo
看了下是delphi
,所以先去ida
里面导好了map
放od
里面,查关键字看,定位到关键代码
已经非常有经验了,就是比较eax
和edx
的值,其中eax
是输入的字符串, edx
是通过用户名计算出来的
往上追了下,发现一个循环,就是算法了,这个也很简单,就是将用户名的ascii
加5
,可以写注册机了
#include <iostream>
#include <string>int main() {std::string username;printf("用户名: ");std::getline(std::cin, username);int userLen = username.length();char new_name[256] = {0};for (int i = 0; i < userLen; i++) {new_name[i] = username[i] + 5;}printf("key: %s", new_name);return 0;
}
搞定
0x02 genocide1
这个有upx
的壳,先脱掉再看
缺少一个Reg.dat
文件,给他补上,重启程序后,然后搜索字符串
定位到关键代码处,发现这里只是一个函数开头
通过引用查看上一层函数地址
找到了跳转处,应该是点击后跳转到刚刚的函数
尝试在这里下断,但是改的时候并不断
因为ok
只会在全部输入正确的时候才会亮,所以得继续往下走编辑框的函数
发现这里有几个编辑框的函数,按回车跟一下
这四个框都会进同一个函数,大概就是计算函数,继续追
这里有一个switch...case
,先动态追着看看
到这个地方了,继续跟这个call
先取用户名的值进行取商,接着进入下一断循环
其余就是判断了,这里跟了一下地址发现了两组数据
上面一组数据是根据用户名计算的,下面是自己填入的,尝试输入一下
这里的ok
按钮果然亮起来了,根据上述可以写出注册机
#include <iostream>
#include <string>int main() {std::string username;printf("用户名: ");std::getline(std::cin, username);int userLen = username.length();if (userLen <= 4) {printf("用户名长度不小于5");return 1;}printf("key: ");for (int i = 0; i < userLen; i++) {if (i == 1) continue;int result = username[i] / 10;if (result > 9) result /= 10;printf("%d", result);}return 0;
}
搞定
最近事情好多,逆向大业进度缓慢啊