最好用的十六进制编辑器010 Editor
https://blog.csdn.net/qq_38482805/article/details/89309120
新版010Edit注册机&去除网络验证:https://bbs.pediy.com/thread-249724.htm
010Editor脚本语法入门:https://www.jianshu.com/p/ba60ebd8f916
宇宙最强 010 Editor 模板开发教程(附带示例):https://bbs.pediy.com/thread-257797.htm
简介
010editor是一款十六进制编辑器,和winhex相比支持更灵活的脚本语法,可以对文件、内存、磁盘进行操作
软件简介:
010 Editor 是一款专业的文本编辑器和十六进制编辑器,旨在快速轻松地编辑计算机上任何文件的内容。该软件可以编辑文本文件,包括 Unicode 文件、批处理文件、C/C++、XML 等,而在编辑二进制文件中,010 Editor 有很大的优势。二进制文件是一种计算机可读但人类不可读的文件(如果在文本编辑器中打开,二进制文件将显示为乱码)。十六进制编辑器是一个程序,它允许您查看和编辑二进制文件的单个字节,以及包括 010 Editor 的高级十六进制编辑器还允许您编辑硬盘驱动器、软盘驱动器、内存密钥、闪存驱动器、CD-ROM、进程等中的字节。这里仅列出使用 010 Editor 的一些优点:
* 查看并编辑在你硬盘驱动器上(文件大小无限制)的任何二进制文件和文本文件,包括 Unicode 文件、C/C++、XML、PHP,等。
* 独特的二进制模板技术允许你了解任何二进制文件格式。
* 查找并修复硬盘驱动器、软驱、内存密钥、闪存驱动器、CD-ROM、进程等的问题。
* 用强大的工具包括查找、替换、在多文件中查找、在多文件中替换、二进制比较、校验和/散列算法、直方图等,来分析和编辑文本和二进制数据。
* 强大的脚本引擎允许多任务的自动化(语言非常类似于 C)。
* 轻松下载并安装其他使用 010 Editor 储存库共享的二进制模板和脚本。
* 以不同的格式导入和导出二进制数据。
内置在 010 Editor 中的十六进制编辑器可以立即加载任意大小的文件,并且对所有编辑操作都可以无限制地撤消和重做。编辑器甚至可以立即在文件之间复制或粘贴大量的数据块。010 Editor 的可移植版本也可用于 Windows 从 USB 键运行 010 Editor。试用了 010 Editor 后,我们相信你会同意 010 Editor 是今天最强大的十六进制编辑器!
官网地址是:http://www.sweetscape.com
模板文件地址是:http://www.sweetscape.com/010editor/repository/templates/
可以看到很多支持的模板。可以在官网上手动下载模板,也可以在 010editor 编辑器中下载模板。
打开 010editor 点击菜单 Templates -> Template Repository,会出现各种文件格式的模板,如下图
比如选择 EXE 文件的模板来分析 PE 文件,然后打开一个 PE 文件,效果如图:
文件模板
(*.bt) 用于识别文件类型 http://www.sweetscape.com/010editor/repository/templates/
支持cab gzip rar zip cda midi mp3 ogg wav avi flv mp4 rm pdf iso vhd lnk dmp dex androidmanifest class
Drive.bt 解析mbr fat16 fat43 hfs ntfs等
elf.bt 解析Linux elf格式的文件
exe.bt 解析windows pe x86/x64 格式文件(dll sys exe ...)
macho.bt 解析mac os可执行文件
registrayhive.bt 解析注册表(Hive)文件
bson.bt 解析二进制json
脚本模板
常用的脚本库(*.1sc)用于操作数据
简要说明
010Editor----一款专业且强大的文本编辑和十六进制编辑工具。
本着加强逆向学习的心理。对该软件进行一次逆向分析(仅以学习为目的)
所使用工具
ExeInfo、OD、IDA、VS
目标
找出关键算法并写出对应的注册机、去掉网络验证
查看软件基本信息
使用ExeInfo收集软件基本信息
使用QT5开发、无壳
基本的信息获取完毕,后面需要的话再次查看。
软件基本流程
用户名和密码随意填,点击Check弹窗提示错误
这个弹窗很关键,将信息记录文本中。
进入OD定位关键函数
1、依靠弹窗信息,直接搜索字符串
2、定位到错误信息。回溯往上找到函数头下断点
时刻留意每一个CALL的返回值
将任何一个可疑点注释标记起来。以防止丢失关键点,找寻函数过程这里不做过多说明。下面直接进入关键函数开始分析算法。
找到下面的一个Switch case结构。就是我们需要的算法。
具体算法分析如下,没有过多的注释
以下用户名与密钥之间有点关联的一块地方
到此,算法基本完毕。接下来代码实现
借助IDA将函数复制出来到VS中
IDA中找到该函数地址,整段复制下来。注意,该函数还有一段数组
复制该数组地址,回到OD中将这些数值拿出来
注册机代码实现
代码如下
#include<stdio.h>#include<time.h>#include <Windows.h>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};//对用户名处理函数int __cdecl EnCodeUserName(const char* pUserName, int a2, char a3, unsigned __int16 a4){ const char* v4; // edx@1 signed int v5; // esi@1 signed int v6; // edi@1 unsigned __int8 v7; // bl@2 int v8; // eax@3 int v9; // ecx@3 int v10; // ecx@4 int result; // eax@4 int v12; // ecx@5 unsigned __int8 v13; // [sp+8h] [bp-10h]@2 unsigned __int8 v14; // [sp+Ch] [bp-Ch]@2 unsigned __int8 v15; // [sp+10h] [bp-8h]@2 int v16; // [sp+14h] [bp-4h]@1 v4 = pUserName; v16 = 0; v5 = strlen(pUserName); 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 = pUserName; } while (v6 < v5); } return result;}int main(){ srand(time(NULL)); BYTE PASS[10] = { 0x11,0x22,0x33,0x9C,0x55,0x66,0x77,0x88,0x99,0xaa }; DWORD eax; DWORD esi; DWORD ecx; DWORD dwRet = 0x3E8; //用户名密码加密。EnCodeUserName //参数1: 用户名 //参数2: 是否9C //参数3: 0 //参数4: 0x3E8 char name[20] = {};//接收输入字符缓冲区 printf("输入用户名:\n"); scanf_s("%s", & name, 20); DWORD dwKey = EnCodeUserName(name, 1, 0, dwRet); PASS[4] = dwKey & 0xFF; PASS[5] = dwKey >> 0x8 & 0xFF; PASS[6] = dwKey >> 0x10 & 0xFF; PASS[7] = dwKey >> 0x18 & 0xFF; while (true) { PASS[0] = rand() & 0xFF; eax = ((PASS[0] ^ PASS[6] ^ 0x18 + 0x3D) ^ 0xA7); if (eax >= 9) {break;} } while (true) { PASS[1] = rand() % 0xFF; PASS[2] = rand() % 0xFF; esi = (0x100 * (PASS[1] ^ PASS[7] & 0xFF) + PASS[2] ^ PASS[5] & 0xFF) & 0xFFFF; eax = (((esi ^ 0x7892) + 0x4D30) ^ 0x3421) & 0xFFFF; if ((eax % 0XB == 0) && (eax / 0XB == dwRet)) { break; } } printf("%02X%2X-%02X%2X-%02X%2X-%02X%2X\n", PASS[0], PASS[1], PASS[2], PASS[3], PASS[4], PASS[5], PASS[6], PASS[7]); system("pause");}
运行注册机进行验证
正常进入,无异常
去除网络验证
注册机实现后,会发现点击检查时还是会卡一会。然后弹出一个验证失败窗口
下面继续分析直接去除联网验证
到这里的时候,我们就不需要去观察这个验证函数了。直接强制修改
点击运行
至此,打上补丁保存文件。完成!
总结
该软件无壳,还是比较好搞定的。
分析过程中需要足够的耐心
逆向中思路还是很重要
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/6605.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~