010 Editor逆向分析文档

一、010 Editor 介绍
  • 010 Editor是非常好用的16进制编辑器

  • 主要功能如下:

    a. 16进制修改

    b. 文本修改

    c. 模板解析各种文件格式

    d. 对比文件

二、010 Editor 破解注册码截图

在这里插入图片描述

三、010 Editor 暴力破解分析
1.分析思路:

1.找到注册的窗口

2.测试注册窗口的反应

3.根据反应作出下一步分析的打算

​ (1) 猜测API, API下断动态调试

​ (2) 挑出敏感字符串,在程序中搜索

4.动态分析,定位关键跳转,修改代码

5.动态分析,定位关键CALL, 修改代码

2.具体操作:

1.右击 CTRL + N ,查找一下相关函数

在这里插入图片描述

2.观察这些函数,但是无法去定位,到底使用了什么API,这个时候可以去尝试使用IDA 去分析一下。IDA 分析完,查看导入表,CTRL+F 搜索跟 Windows 有关的函数,发现创建窗口的函数应该是与 QT 有关的,但是很无奈,没学过 QT ,所以此路走不通。

在这里插入图片描述
3.此时 继续使用 OD 分析,我们知道,序列号注册失败时会有弹窗,所以我们可以查看一下模块,找到 USER 32模块,找窗口类相关函数(CreateWingdow,DialogBox 等等)。
在这里插入图片描述

4.然后挨个去去尝试,下断点,发现 CreateWindowExW 断下,我们可以以此为切入点,来分析。

在这里插入图片描述

5.通过栈回溯,挨个进去查看,也可以使用字符串搜索,来找到关键字。

在这里插入图片描述
6.找到关键提示信息。

在这里插入图片描述

7.找到关键跳转
在这里插入图片描述
8.找到关键函数。

在这里插入图片描述

9.将关键函数 NOP 掉即可成功。

在这里插入图片描述

四、010 Editor 算法分析
1.分析方法:
  • 单步跟踪,找到访问用户名密码的代码
  • 一步一步分析,加注释
  • 反复推敲,找规律
  • 写代码验证
    • (1) 总结公式
    • (2) 穷举密码
2.具体操作:

1.断到关键函数出,看 ECX 的值,多跟几个,可以找到我们输入的用户名和序列号。

在这里插入图片描述

2.判断上一个函数返回值,返回值赋给 EDI ,将EDI 与 0XDB 比较,发现此处相等时就可以跳出注册窗口成功提示语。

在这里插入图片描述

3.结果如下所示。

在这里插入图片描述

4.顺藤摸瓜,继续往上看跳转,发现这两处均可以跳转至 CMP EDI, 0XDB处。

在这里插入图片描述
5.发现两处关键点,接下来跟进去,重点分析这两个函数,此处避免混乱,给他们由上到下命名为 A 函数和 B 函数。当这两个函数返回值不等于 E7 和 DB 即可。先分析 A 函数。

在这里插入图片描述

6.同样的方法,向上寻找,不过我们的目标是最后的结果不等于 E7,所以向上找不会跳转到将 E7 赋值给 EAX 的操作。最后经过分析发现 MOV ESI,0X2D 有跳转,并且只有将 EAX 赋值为 0X2D 时才是正确的操作。

在这里插入图片描述

7.此时分析发现,这里有对用户名字符串进行加密的操作,然后将用户名加密后得到的4字节数据与用户输入的序列号中某位进行比较。只有当这一个跳转条件不满足时才能执行到赋值为 0X2D 处。并且这里有大量的 CMP 比较,只要一个不满足,就跳出,将 EAX 赋值为 0XE7。

在这里插入图片描述
8.同时继续分析,我们会发现这里面存了一个全局数组,它应该是 010Editor 中的密码表,循环次数为用户名称字符串的长度,每次循环都会从表中取出4字节数据,进行异或,以及其他有符号乘法、加法等操作,对字符串进行一定操作后得到的4字节数据便是真正的序列号的最后四个字节。

在这里插入图片描述

9.接着分析 B 函数。

在这里插入图片描述

10.通过分析,我们知道返回的 EAX 的函数很重要,于时我们跟进去看看。

在这里插入图片描述

在这里插入图片描述

11.进一步分析 B 函数,会发现这个函数和之前分析的是一个相同的函数。至此我们就可以顺着它对用户名字符串加密后得到的4字节数据与用户输入的序列号之间的操作来编写注册机。

在这里插入图片描述
12.拖到 IDA 中,输入地址,按 F5 分析,得到该函数。

在这里插入图片描述

在这里插入图片描述

int _cdecl EncodeUsername(const char *pszUserName, int a2, char a3, char a4)
{
   
	const char *v4;
	signed int v5;
	signed int v6;
	unsigned _int8 v7;
	int v8;
	int v9;
	int v10;
	int result;
	int v12;
	unsigned _int8 v13;
	unsigned _int8 v14;
	unsigned _int8 v15;
	int v16;

	v4 = pszUserName;
	v16 = 0;
	v5 = strlen(pszUserName);
	v6 = 0;
	if (v5 <= 0)
	{
   
		result = 0;
	}
	else
	{
   
		v13 = 0
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值