010 Editor(linux版)分析
```学习linux下,010 Editor 的 PJ 思路,需要用到的工具如下:
010Editor_Linux64_15.0.2
ida(linux版)
```
```
1、010editor$ ./010editor // 先走遍安装流程,避免出现意外
2、启动ida,拖入 010editor // 虚拟机中加载约10多秒,看左下角的显示
3、Debugger -> Select debugger... F9 -> Local Linux debugger -> 按 F9
4、Alt + B,搜索 "Evaluation Version",选第1个 .rodata:0000000000929025,双击进入
5、Ctrl + x,发现4处 "Evaluation Version\n",且都在 RRegister::GetLicenseStatusString(int,int *,int,int) 里
6、双击第1个,进入 .text:000000000054FB7E lea rsi, aEvaluationVers ; "Evaluation Version\n"
```
```
7、往上翻,发现如下代码
.text:000000000054FB00 ; __unwind { // __gxx_personality_v0 // C++ 异常处理机制的标志
.text:000000000054FB00 push r15
.text:000000000054FB02 push r14
.text:000000000054FB04 push r13
.text:000000000054FB06 push r12
.text:000000000054FB08 push rbp
.text:000000000054FB09 push rbx
.text:000000000054FB0A mov rbp, rcx
.text:000000000054FB0D mov rbx, rdi
.text:000000000054FB10 sub rsp, 198h
.text:000000000054FB17 mov rax, fs:28h
.text:000000000054FB20 mov , rax
.text:000000000054FB28 xor eax, eax
.text:000000000054FB2A mov rax, cs:_ZN10QArrayData11shared_nullE_ptr // 初始化 Qt 容器
.text:000000000054FB31 cmp edx, 0DBh // 比较 edx 和 0DBh
.text:000000000054FB37 mov , rax
.text:000000000054FB3A jz loc_54FD90 // 跳转
.text:000000000054FB40 cmp edx, 2Fh ; '/' // 比较 edx 和 2Fh
.text:000000000054FB43 jz loc_550160 // 跳转
.text:000000000054FB49 cmp edx, 71h ; 'q' // 比较 edx 和 71h
.text:000000000054FB4C jz loc_54FC48 // 跳转
.text:000000000054FB52 cmp edx, 20Ch // 比较 edx 和 20Ch
.text:000000000054FB58 jz loc_54FC48 // 跳转
.text:000000000054FB5E cmp edx, 0F9h // 比较 edx 和 0F9h
.text:000000000054FB64 jz loc_550400 // 跳转
.text:000000000054FB6A cmp edx, 0EDh // 比较 edx 和 0EDh
.text:000000000054FB70 jz loc_54FFB8 // 跳转
.text:000000000054FB76 lea rdi, ; this
.text:000000000054FB7E lea rsi, aEvaluationVers ; "Evaluation Version\n" // 从这儿往上翻
.text:000000000054FB85 mov edx, 13h ; int
```
```
8、查看 比较 和 所有跳转,猜测 edx的值可能代表 注册的状态(标志)
```
```
9、loc_54FD90(可能是成功的跳转)
text:000000000054FB31 cmp edx, 0DBh
.text:000000000054FB37 mov , rax
.text:000000000054FB3A jz loc_54FD90
```
```
10、进入 loc_54FD90
text:000000000054FD90 test r8d, r8d
.text:000000000054FD93 mov r12, rsi
.text:000000000054FD96 mov r13d, r9d
.text:000000000054FD99 jz short loc_54FDE0
.text:000000000054FD9B lea rdi, ; this
.text:000000000054FDA0 lea rsi, aLicensedTo ; "Licensed to:\n" // 注册成功的字符串,猜测 0DBh 为成功的标志
.text:000000000054FDA7 mov edx, 0Dh ; int
```
```
11、验证猜想
a、动态调试,修改 edx 的值,看 010editor 的弹窗显示
b、在 .text:000000000054FB31 cmp edx, 0DBh 处下断点
c、F9 -> 改 RDX 0000000000000071 'q' 的值 // 选中,按 e ,将 71 改为 DB
d、重复 F9 -> 修改RDX,约改4次后,010editor启动完成
About -> Licensed to: 0 User License 证明思路没错
```
```
12、查找 edx 的初始赋值点
a、在进入函数时,edx 的值已经是 71h,想办法找初始赋值点,
尝试 函数引用 ,发现干扰太多,搜索 edx, 0DBh 或 edx, 71h 也没发现啥有价值的东西
b、又尝试只搜值(0DBh 或 71h),发现它俩都能搜出很多结果,瞬间灰心 // 非调试状态,Alt + t静态搜索更快
c、静下心来,认真看一下,发现,多数值是 .rodata,真正的 .text 其实并不多
看几条就能找到 .text:000000000054FB31 _ZN9RRegister22GetLicenseStatusStringEiPiii cmp edx, 0DBh
且它的上1条都是 .text:000000000054F1D7 _ZN9RRegister11CheckStatusEii
```
```
13、查看 RRegister::CheckStatus 函数
.text:000000000054F1A0 ; __int64 __fastcall RRegister::CheckStatus(RRegister *__hidden this, int, int)
.text:000000000054F1A0 public _ZN9RRegister11CheckStatusEii
.text:000000000054F1A0 _ZN9RRegister11CheckStatusEii proc near ; CODE XREF: main+434↑p
.text:000000000054F1A0 ; RRepository::BuildHttpUpdateRequest(void)+83↓p ...
.text:000000000054F1A0 ; __unwind {
.text:000000000054F1A0 mov ecx, // this->member_0x3C 读到 ecx
.text:000000000054F1A3 mov eax, 113h // eax = 0x113
.text:000000000054F1A8 test ecx, ecx // 判断 member_0x3C 是否为0
.text:000000000054F1AA jz short loc_54F1B0 // 0,跳到 54F1B0
.text:000000000054F1AC retn // !0,返回 0x113
.text:000000000054F1AC ; ---------------------------------------------------------------------------
.text:000000000054F1AD align 10h
.text:000000000054F1B0
.text:000000000054F1B0 loc_54F1B0: ; CODE XREF: RRegister::CheckStatus(int,int)+A↑j
.text:000000000054F1B0 push rbp
.text:000000000054F1B1 push rbx
.text:000000000054F1B2 mov ebp, esi
.text:000000000054F1B4 mov rbx, rdi
.text:000000000054F1B7 sub rsp, 8
.text:000000000054F1BB call _ZN9RRegister13CheckPasswordEii ; RRegister::CheckPassword(int,int)
.text:000000000054F1C0 cmp eax, 4Eh ; 'N'
.text:000000000054F1C3 mov edx, eax
.text:000000000054F1C5 jz short loc_54F210
.text:000000000054F1C7 cmp edx, 0E7h
.text:000000000054F1CD mov eax, 177h
.text:000000000054F1D2 jz short loc_54F204
.text:000000000054F1D4 cmp edx, 2Dh ; '-'
.text:000000000054F1D7 mov eax, 0DBh // 从这儿往上翻
```
```
14、突破点
.text:000000000054F1A0 mov ecx,
.text:000000000054F1A3 mov eax, 113h // mov eax, 0DBh
.text:000000000054F1A8 test ecx, ecx
.text:000000000054F1AA jz short loc_54F1B0 // jz short loc_54F1AC
.text:000000000054F1AC retn
```
```
参考:https://www.52pojie.cn/thread-1695625-1-1.html
``` 支持一下!!!!! 看不懂,大佬牛 大佬牛逼,膜拜一下 膜拜大佬,win版的这个软件我也在摸索使用中,想不到大佬已经pj了linux版本了 ccql5211314 发表于 2026-9-3 21:05
看不懂,大佬牛
太客气了,我都不好意思了 teddy708 发表于 2026-9-4 08:34
大佬牛逼,膜拜一下
太客气了,别这样,脸都红了 stbeta 发表于 2026-9-4 08:37
膜拜大佬,win版的这个软件我也在摸索使用中,想不到大佬已经pj了linux版本了
不用那么客气,你要是有兴趣的话,都可以相互学习的 675550115 发表于 2026-9-3 20:35
支持一下!!!!!
多谢支持 牛逼啊!
页:
[1]
2