下面是网上的160个CrackMe的部分逆向笔记,包括逆向思路、注册机实现和逆向中常用的知识整理
注意:逆向前一定要先操作一下软件,熟悉软件的运行现象;逆向一定要自己操作一遍,看是很难看会的(高手除外)
重要的事情说3遍:
笔记更新换位置了!
笔记更新换位置了!
笔记更新换位置了!
新位置
:我写的新系列,刚开始写没几天,后续文章主要在新地址更新,欢迎支持;写作不易,且看且珍惜(点击跳转,欢迎收藏)
文章目录
连续的4个CrackMe都是同一个作者编写的,都是VB程序;其中CrackMe008使用的是关键字符串思路,是最简单的一个;CrackMe009多了一个用户名
1.现象
需要输入正确的用户名和key程序才能破解成功
2.查看程序基本信息
无壳,VB编写
3.响应函数和关键跳转
爆破程序要找到程序的关键跳转,下面使用2种方法进行分析,加深理解
思路 1.错误字符串法
思路:通过错误字符串在OD中找到关键函数(CrackMe001有详细的介绍),简单操作就是在错误字符串下断点,向上回溯找到关键跳转和函数入口(按钮的响应函数)
下面是OD分析的按钮响应函数主要结构
其中:
0x4022CB
:是关键跳转,单步调试时,直接nop
掉这行的反汇编,直接显示注册成功,爆破成功0x401FF0
:按钮的响应函数入口,如果想写出注册机,要从这个函数开始分析
思路 2.使用VB Decompiler
分析
VB Decompiler
是分析VB
的神器;加载程序后,程序只有一个按钮,因此0x401FF0
就应该是按钮的响应函数入口,也很容易找到关键跳转
说明:Native Code标识程序是自然编译的(编译为机器码),可以用OD直接调试
2种思路对比,逆向VB程序还是使用专用工具VB Decompiler
可以提高效率
4.注册机
分析前要了解一些VB的相关知识
- VB中,文本是Unicode编码,每个变量所在地址的
前8个byte
是数据的类型信息,首地址+8
才是数据开始存储的地方- VB中,大多数函数的参数都放在
eax
和ecx
中,返回值放在[ebp-0x34]
中
step 1.VB Decompiler分析
提示:分析
VB
程序的注册流程时,一定要结合VB Decompiler
显示的反汇编结果进行分析,否则能把人累死…
下面是工具VB Decompiler
分析的代码,加上了自己猜测的注释(不一定正确,但是会有助于用OD调试)
加完注释感觉注册机基本上逆向出80%
了,只要在看一下
这2个相同语句具体是做什么的逆向就完成了
step 2.OD分析
用户名使用test123
,key使用456
进行测试
step 2-1.求出用户名长度
获取的用户名后,使用类似strlen
的计算符,计算出用户名的长度;
有2处
+8
要注意:
- 1.第一处:edx中存放的是用户名,但是
edx+8
才是真实的用户名的存放位置,且是Unicode编码- 2.第二处:计算用户名长度存在eax中,但是
eax+8
位置的数据才是真实的用户名长度
step 2-2.用户名计算key
下面是对用户名处理的for循环逻辑,会取出每个用户名中的字符,累加得到最后结果
示例:test123
经过for循环的计算结果为0x256
说明:
rtcMidCharVar
从字符串中取相应字符,VB中的MID
函数,用法MID(“字符串”,“开始的位置”,“取几个字符”)
step 2-3.查看一下疑惑的地方
示例:test123
经过for循环的计算结果为0x256
,再乘十进制的1234567890
,得到738271598220
上面2个疑惑的语句的作用就是将738271598220
结果的第4
位和第9
位改成-
,即得到真正的key:738-7159-220
step 2-4.简单验证猜想
最后将738-7159-220
与用户输入的key进行比较,相等就弹出注册成功窗口;验证结果是ok,说明分析是正确的
提示:这种将最后的key在程序运行的某个时刻放在stack上是十分不安全的,但是很多程序却使用这种方式,这会导致只要耐心的单步调试,然后时刻观察stack就有可能发现真正的key
step 3.注册机
有了上面的分析,注册机很容易写出
#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char key[100] = {0};
char user_name[100] = {0};
printf("请输入用户名(长度>0):");
scanf_s("%s", user_name, 100);
//用户名每一位求和
long long res = 0;
for (int i = 0; i < strlen(user_name); i++) {
res += user_name[i];
}
res *= 1234567890;
//没有使用to_string,直接使用sprintf进行int -> string转换了
sprintf(key, "%I64d", res);
//替换第4位和第9位
key[3] = '-';
key[8] = '-';
printf("用户名:%s, 对应的密码是%s\n", user_name, key);
system("pause");
return 0;
}
验证结果:
5.参考
- 1.VB程序逆向反汇编常见的函数 - 笨笨D幸福 - 博客园 (cnblogs.com)
- 2.常用软件可以在这里下载:爱盘 - 最新的在线破解工具包 (52pojie.cn)
- 3.【反汇编练习】160个CrackME索引目录1~160建议收藏备用
- 4.160个Crackme_鬼手56的博客-CSDN博客
- 5.《使用OllyDbg从零开始Cracking》系列的文章也不错