文章目录

  • 一、010 Editor 介绍
  • 二、010 Editor 破解注册码截图
  • 三、010 Editor 暴力破解分析
    • 1.分析思路:
    • 2.具体操作:
  • 四、010 Editor 算法分析
    • 1.分析方法:
    • 2.具体操作:
    • 3.算法总结:
    • 3.注册机总结
    • 4.网络验证分析

一、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;v14 = 0;v7 = 15 * a4;v15 = 17 * a3;do{v8 = toupper(v4[v6]);v9 = v16 + g_EcodeArray[v8];if (a2){v10 = g_EcodeArray[v7]+ g_EcodeArray[v15]+ g_EcodeArray[(unsigned _int8)(v8 + 47)] * (g_EcodeArray[(unsigned _int8)(v8 + 13)] ^ v9);result = g_EcodeArray[v14] + v10;v16 = g_EcodeArray[v14] + v10;}else{v12 = g_EcodeArray[v7]+ g_EcodeArray[v15]+ g_EcodeArray[(unsigned _int8)(v8 + 23)] * (g_EcodeArray[(unsigned _int8)(v8 + 63)] ^ v9);result = g_EcodeArray[v13] + v12;v16 = g_EcodeArray[v13] + v12;}v14 += 19;++v6;v15 += 9;v7 += 13;v13 += 7;v4 = pszUserName;} while (v6 < v5);}return result;
}

13.我们可以看到 dword_2E64148 这个数组,由于 IDA 中不好观察,把这个地址拷贝到 OD 中,这个全局变量数组就是密码表,我们可以从内存中拷贝出来。

DWORD  g_EcodeArray[] = {0x39CB44B8, 0x23754F67, 0x5F017211, 0x3EBB24DA, 0x351707C6, 0x63F9774B, 0x17827288, 0x0FE74821,
0x5B5F670F, 0x48315AE8, 0x785B7769, 0x2B7A1547, 0x38D11292, 0x42A11B32, 0x35332244, 0x77437B60,
0x1EAB3B10, 0x53810000, 0x1D0212AE, 0x6F0377A8, 0x43C03092, 0x2D3C0A8E, 0x62950CBF, 0x30F06FFA,
0x34F710E0, 0x28F417FB, 0x350D2F95, 0x5A361D5A, 0x15CC060B, 0x0AFD13CC, 0x28603BCF, 0x3371066B,
0x30CD14E4, 0x175D3A67, 0x6DD66A13, 0x2D3409F9, 0x581E7B82, 0x76526B99, 0x5C8D5188, 0x2C857971,
0x15F51FC0, 0x68CC0D11, 0x49F55E5C, 0x275E4364, 0x2D1E0DBC, 0x4CEE7CE3, 0x32555840, 0x112E2E08,
0x6978065A, 0x72921406, 0x314578E7, 0x175621B7, 0x40771DBF, 0x3FC238D6, 0x4A31128A, 0x2DAD036E,
0x41A069D6, 0x25400192, 0x00DD4667, 0x6AFC1F4F, 0x571040CE, 0x62FE66DF, 0x41DB4B3E, 0x3582231F,
0x55F6079A, 0x1CA70644, 0x1B1643D2, 0x3F7228C9, 0x5F141070, 0x3E1474AB, 0x444B256E, 0x537050D9,
0x0F42094B, 0x2FD820E6, 0x778B2E5E, 0x71176D02, 0x7FEA7A69, 0x5BB54628, 0x19BA6C71, 0x39763A99,
0x178D54CD, 0x01246E88, 0x3313537E, 0x2B8E2D17, 0x2A3D10BE, 0x59D10582, 0x37A163DB, 0x30D6489A,
0x6A215C46, 0x0E1C7A76, 0x1FC760E7, 0x79B80C65, 0x27F459B4, 0x799A7326, 0x50BA1782, 0x2A116D5C,
0x63866E1B, 0x3F920E3C, 0x55023490, 0x55B56089, 0x2C391FD1, 0x2F8035C2, 0x64FD2B7A, 0x4CE8759A,
0x518504F0, 0x799501A8, 0x3F5B2CAD, 0x38E60160, 0x637641D8, 0x33352A42, 0x51A22C19, 0x085C5851,
0x032917AB, 0x2B770AC7, 0x30AC77B3, 0x2BEC1907, 0x035202D0, 0x0FA933D3, 0x61255DF3, 0x22AD06BF,
0x58B86971, 0x5FCA0DE5, 0x700D6456, 0x56A973DB, 0x5AB759FD, 0x330E0BE2, 0x5B3C0DDD, 0x495D3C60,
0x53BD59A6, 0x4C5E6D91, 0x49D9318D, 0x103D5079, 0x61CE42E3, 0x7ED5121D, 0x14E160ED, 0x212D4EF2,
0x270133F0, 0x62435A96, 0x1FA75E8B, 0x6F092FBE, 0x4A000D49, 0x57AE1C70, 0x004E2477, 0x561E7E72,
0x468C0033, 0x5DCC2402, 0x78507AC6, 0x58AF24C7, 0x0DF62D34, 0x358A4708, 0x3CFB1E11, 0x2B71451C,
0x77A75295, 0x56890721, 0x0FEF75F3, 0x120F24F1, 0x01990AE7, 0x339C4452, 0x27A15B8E, 0x0BA7276D,
0x60DC1B7B, 0x4F4B7F82, 0x67DB7007, 0x4F4A57D9, 0x621252E8, 0x20532CFC, 0x6A390306, 0x18800423,
0x19F3778A, 0x462316F0, 0x56AE0937, 0x43C2675C, 0x65CA45FD, 0x0D604FF2, 0x0BFD22CB, 0x3AFE643B,
0x3BF67FA6, 0x44623579, 0x184031F8, 0x32174F97, 0x4C6A092A, 0x5FB50261, 0x01650174, 0x33634AF1,
0x712D18F4, 0x6E997169, 0x5DAB7AFE, 0x7C2B2EE8, 0x6EDB75B4, 0x5F836FB6, 0x3C2A6DD6, 0x292D05C2,
0x052244DB, 0x149A5F4F, 0x5D486540, 0x331D15EA, 0x4F456920, 0x483A699F, 0x3B450F05, 0x3B207C6C,
0x749D70FE, 0x417461F6, 0x62B031F1, 0x2750577B, 0x29131533, 0x588C3808, 0x1AEF3456, 0x0F3C00EC,
0x7DA74742, 0x4B797A6C, 0x5EBB3287, 0x786558B8, 0x00ED4FF2, 0x6269691E, 0x24A2255F, 0x62C11F7E,
0x2F8A7DCD, 0x643B17FE, 0x778318B8, 0x253B60FE, 0x34BB63A3, 0x5B03214F, 0x5F1571F4, 0x1A316E9F,
0x7ACF2704, 0x28896838, 0x18614677, 0x1BF569EB, 0x0BA85EC9, 0x6ACA6B46, 0x1E43422A, 0x514D5F0E,
0x413E018C, 0x307626E9, 0x01ED1DFA, 0x49F46F5A, 0x461B642B, 0x7D7007F2, 0x13652657, 0x6B160BC5,
0x65E04849, 0x1F526E1C, 0x5A0251B6, 0x2BD73F69, 0x2DBF7ACD, 0x51E63E80, 0x5CF2670F, 0x21CD0A03,
0x5CFF0261, 0x33AE061E, 0x3BB6345F, 0x5D814A75, 0x257B5DF4, 0x0A5C2C5B, 0x16A45527, 0x16F23945
};

14.开始写注册机,先初始化,随机生成一个小于 0X3E8 的数。

srand(time(NULL));//0.初始化int dwRet = rand() % 0X3E8;byte K[10] = { 0x11,0x22,0x33,0x9C,0x55,0x66,0x77,0x88,0x99,0xAA };char szName[100] = { 0 };printf("please input name: ");scanf_s("%s", szName, 100);

15.传入用户名字符串的首地址,加上上面的随机数,就可以得到与 010Editor 相同的加密的4字节数据。

//1.用户名,加密,将返回值赋给密码数组DWORD dwKey = EncodeUsername(szName, 1, 0, dwRet);K[4] = dwKey & 0xFF;K[5] = dwKey >> 8 & 0xFF;K[6] = dwKey >> 16 & 0xFF;K[7] = dwKey >> 24 & 0xFF;

16.再穷举剩余的字节,并打印出计算出来的序列号。

//2.穷举剩余的字节while (true){byte k0 = rand() % 0xFF;byte k6 = K[6];byte al = (k0^k6 ^ 0X18 + 0X3D) ^ 0XA7;if (al >= 9){K[0] = k0;K[6] = k6;break;}}while (true){byte K1 = rand() % 0xFF;byte K7 = K[7];byte K2 = rand() % 0xFF;byte K5 = K[5];DWORD ESI = (0X100 * (K1 ^ K7 & 0XFF) + K2 ^ K5 & 0XFF) & 0XFFFF;DWORD EAX = (((ESI ^ 0X7892) + 0X4D30) ^ 0X3421) & 0XFFFF;if (EAX % 0XB == 0 && EAX / 0XB == dwRet){K[1] = K1;K[7] = K7;K[2] = K2;K[5] = K5;break;} }//打印计算出的序列号printf("%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X", K[0], K[1], K[2], K[3], K[4], K[5], K[6], K[7], K[8], K[9]);
3.算法总结:
  • 判断用户名密码是否为空
  • 将密码字符串转为16进制字节数据
  • 验证密码16进制数据
    • K[3] = 0X9C 或者 0XAC
    • sub_00407644 函数的返回值 不能为0 ;
      即AL = (K[0]K[6]0X18+0X3D)^0X47
      AL!=0
    • sub_004083C8 函数的返回值 不能为0 且小于等于0X3E8
      即 esi = 0X100 *(k[1]k[7])+k[2]k[5]
      eax = ((esi0x7892+0x4D30)0x3421)&0Xffff
      if(eax%0xB == 0&&eax/0xB<=0x3E8)
  • 将用户名转为ASCII字符串
  • 使用用户名计算出一个 key,与密码 K[4]~K[7] 相等
    • 调用 sub_402e50函数,参数是用户名字符串、1、0、 sub_4083C8函数的返回值
      返回了一个4字节的值 retValue
    • 使用密码中的几个字节与 sub_402e50函数的返回值retValue进行比较
      cmp K[4], retValue&0xFF
      cmp K[5], retValue>>8&0xFF
      cmp K[6], retValue>>16&0xFF
      cmp K[7], retValue>>24&0xFF
  • 判断参数
    • cmp arg, sub_00407644’s retValue >= 9
3.注册机总结
  • 方法一:

    • 随机字节,穷举找出符合条件的值
    • 随机字节, 穷举找出符合条件的值
  • 方法二:
    • 指定用户名,调用加密函数求出 key
    • 将 key 拆分,指定到密码字节数组
    • 穷举剩下的字节
4.网络验证分析

1.但是利用上述生成的序列号注册以后,还存在一个问题,就是他会联网检查,然后告诉我们,序列号不可用,我们此时需要过滤掉网络验证。

2.我们继续分析关键函数,此时 EAX = 2D


3.我们单走一步,走完发现 EAX 变为 113,我们跟进去看看


4.我们返回跟进去,继续分析这个关键函数,找到网络验证部分,将他修改掉。


5.发现还是不行。猜测应该有二次验证,继续往下分析。找到二次验证的函数,跟进去继续分析。


6.通过继续分析可得,让此函数一直返回 1 即可通过验证。继续分析,可以看到该函数返回了 0X4 ,即可以做如下操作。

7.此时,完美过掉网络验证。

010 Editor逆向分析文档相关推荐

  1. 关于人工智能引擎的最初分析文档

    关于人工智能引擎的最初分析文档 赵立 1.开发人工智能引擎的目的是什么?其功能定位什么?有什么特色? 希望开发一整套人工智能软件的开发平台,用于解决目前软件技术难以处理的智能问题,从而能逐渐形成这方面 ...

  2. linux资源使用统计指南,指南:工作量分析文档

    指南:工作量分析文档 工作量分析文档 工作量分析文档用于在不同的性能测试中确定要使用的变量并定义变量值,利用这些性能测试可以模拟主角特征.最终用户业务功能(用例).负载和容量. 主题 软件质量要从不同 ...

  3. WLAN驱动分析文档_gzc126_新浪博客

    WLAN驱动分析文档 目 录 1 引言 3 1.1 目的 3 1.2 项目背景 3 1.3 参考资料 3 2 预备知识 3 2.1 WLAN技术 3 2.2 802.11协议简述 3 2.2.1 概述 ...

  4. Python数据分析大作业 4000+字 图文分析文档 销售分析

    资源地址:Python数据分析大作业 4000+字 图文分析文档 销售分析 +完整python代码 数据来自某商场,具体商业数据保密 资源地址:Python数据分析大作业 4000+字 图文分析文档 ...

  5. 建议收藏:用Axure做一个竞品分析文档(教程+下载)

    之前和大家分享了<Axure版PRD产品需求文档(教程+下载)>大家表示非喜欢.所以这期呢,作者就和大家分享如何用axure制作一个精美的竞品分析文档.有同学可能会问:为什么要用axure ...

  6. 图书室管理系统--UML用例图、竞品分析文档

    这个是朋友做的资源,提供给大家学习. 这是图书管理系统的用例图. 竞品分析文档下载链接:点击下载文档 竞品分析文档目录

  7. wifi驱动分析文档

    WLAN驱动分析文档 目 录 1引言 3 1.1目的 3 1.2项目背景 3 1.3参考资料 3 2预备知识 3 2.1WLAN技术 3 2.2802.11协议简述 3 2.2.1概述 3 2.2.2 ...

  8. java读取ofd文档内容_ofd电子文档内容分析工具(分析文档、签章和证书)

    前言 ofd是国家文档标准,其对标的文档格式是pdf.ofd文档是容器格式文件,ofd其实就是压缩包.将ofd文件后缀改为.zip,解压后可看到文件包含的内容. ofd文件分析工具下载: ofd文件解 ...

  9. PDF-XChange Editor使用教程:如何在PDF-XChange Editor中为文档的每个页面添加水印?

    ​PDF-XChange Editor能替代Adobe Reader功能,比任何其他免费的PDF阅读器.查看器和编辑器更小,但功能更加丰富,支持用户在评价模式尝试使用PDF-Xchange免费提供的扩 ...

  10. html文档是哪个版本,Pro010-从零开始HTML[#010]——5分钟-HTML 文档类型版本

    标签 #010_Str_DocType 之前的课程里,简单的学习了一些在 HTML 文档里面编辑内容的方法,了解了一些 HTML 的概念.相信你已经可以写一些展示文章的简单页面了. #001~#006 ...

最新文章

  1. [Dnode]基于Node.js给浏览器提供异步远程方法调用
  2. 面试必问的16个经典问题的回答思路
  3. javascript解析json格式的字符串,拼接后显示到表格中
  4. 开放搜索助力提升趣店商城20%转化率
  5. mysql数据库永久链接_PHP使用数据库永久连接方式(mysql_pconnect)操作MySQL的是与非...
  6. java listen_java web-- listen
  7. 响应头中content-type常用的类型有哪些?
  8. thinkPHP 空模块和空操作、前置操作和后置操作 详细介绍(十四)
  9. 银联在线支付、第三方快捷支付三种快捷支付模式有何区别?
  10. Shadow DOM的样式ShadowRoot
  11. Hugo博客双线部署
  12. linux下Unison安装
  13. 图片加载oom以及photoView缩放崩溃问题
  14. 运用supervisor管理thinkqueue 和swoole推送
  15. 【资源帖】漏洞平台(国内外)+企业SRC整理-持续更新
  16. 智能网联汽车信息安全研究报告
  17. 安装windows与Ubuntu双系统,并使用GRUB启动引导器
  18. DEDE织梦网站首页仿制实战操作
  19. 4G无线模块 电力通信模块
  20. 【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

热门文章

  1. rk3399 外接一个usb声卡,同时指定另一个usb声卡做放音功能
  2. 软件:10款免费无广告的看图软件,总有一款适合你
  3. 自动化之RPA工具之UiPath
  4. dpp-enrollee配网
  5. 如何在Mac OS X中使用GeekTool设置桌面任务清单
  6. instsrv.exe和srvany.exe将.exe文件注册为windows服务
  7. C++多线程并发(五)---原子操作与无锁编程
  8. sql server 2000 版本及sp4补丁说明
  9. matlab 生成噪声信号
  10. 毕业论文答辩ppt怎么做?