好好的010 说不行就不行了 一脸懵逼
发现原来是之前送了一个月的试用期现在已经到期了
充钱?那必然是不可能的
你说巧不巧 我正想找点软件可以练手re一下呢
那就让我们一起看一看这款神奇的软件
基本面
无壳 64位看起来应该没啥问题
静态分析
这文件一大分析起来确实挺费劲的哈
信息检索
根据我们一开始的注册信息
搜索一下字符串
找到了主要的数据段但目前是图形视图界面
反编译
反编译下去看看C的伪代码
关键信息
往上翻翻可以看到明显的成功提示
v11 = sub_140009EA8(qword_14074D860, 12i64, 18535i64);
v12 = qword_14074D860;
}
if ( v11 == 0xDB )
{
sub_1400051A5(v12, v39);
v36 = QString::fromAscii_helper("MMMM d, yyyy", 12i64);
v20 = (const struct QString *)QDate::toString(v39, v40, &v36);
v21 = (const struct QString *)QString::fromUtf8(
&v37,
"Password accepted. This license entitles you to:n"
"n"
" - Free Upgradesn"
" - Free Supportn"
" - Free Repository Updatesn"
"n"
"until ",
0xFFFFFFFFi64);
代码分析
可以看出关键就是当if语句成立即可
也就是让v11=219(0xDB)
又因为 v11 = sub_140009EA8(qword_14074D860, 12i64, 18535i64);
那我们继续追踪sub_14009EA8函数
没有啥内容继续跟踪
找到了算法的主要过程
__int64 __fastcall sub_14032F1A0(__int64 a1, __int64 a2, __int64 a3)
{
unsigned int v3; // edi
__int64 result; // rax
int v6; // eax
int v7; // eax
int v8; // eax
unsigned int v9; // ecx
int v10; // eax
unsigned int v11; // ecx
int v12; // eax
unsigned int v13; // ecx
v3 = a2;
if ( *(_DWORD *)(a1 + 60) )
return 275i64;
v6 = sub_140007CC5(a1, a2, a3);
switch ( v6 )
{
case 45:
return 219i64;
case 78:
v12 = sub_14000A880(a1, v3);
v13 = 524;
if ( v12 != 23 )
v13 = 237;
result = v13;
break;
case 231:
return 375i64;
default:
v7 = sub_14000A880(a1, v3);
if ( v7 == 23 )
return 113i64;
if ( v7 != 42 )
{
if ( v7 == 312 )
{
v8 = sub_14000775C(a1);
v9 = 47;
if ( v8 == 419 )
v9 = 249;
return v9;
}
return 375i64;
}
v10 = sub_14000775C(a1);
v11 = 375;
if ( v10 == 419 )
v11 = 249;
result = v11;
break;
}
return result;
}
虽然它写了这么多算法过程但是最主要的就是最终返回的结果了
没错就是return result
我们将鼠标指针移到return result一行
按tab转为图形界面
mov eax, 113h
mov rbx, [rsp+28h+arg_0]
add rsp, 20h
pop rdi
retn
可以清晰看到在这一程序框中一定是包含了result的
又因为在这几行汇编中只有一个113h的十六进制数字被送到了eax中
可以猜测这个eax最终就会被赋值到v11中并成为v11的最终结果进行比较
eax往往也是具有这样的作用
很多程序通用的做法就是把计算的结果(函数的返回值)放到eax里面
在这个程序框的上层函数是有一个判断分支的
很明显这个分支不是我们想要的
所以我们要解决了它
sub_14032F1A0 proc near
arg_0= qword ptr 8
mov [rsp+arg_0], rbx
push rdi
sub rsp, 20h
cmp dword ptr [rcx+3Ch], 0
mov edi, edx
mov rbx, rcx
jz short loc_14032F1C5
最后判断条件jz short loc_14032F1C5
若相等(cmp dword ptr [rcx+3Ch], 0)
就会转跳到short loc_14032F1C5所以我们只要将这个函数给nop掉的话
这个程序一定会运行我们想要的程序
打补丁
鼠标移动到这个函数位置
右键 找到 Keypatch -> patcher
也可以用快捷键alt+ctrl+k来打开
输入nop(no operation)点击patch
patch之后的样子
接下来我们再将eax的值修改为我们想要的数值0DBh(219)
点击patch
完成
保存程序
edit->patch progeam->apply patches to input file...
ok
自己动手破解软件还是非常好玩的
感谢b站up主和吾爱破解论坛的大佬提供的思路
在这谢过了
十分感谢
参考 :最新版010editor破解 - 哔哩哔哩 (bilibili.com)
参考:秒X 010Editor - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
原文始发于微信公众号(齐鲁师院网络安全社团):复现 010 editor 最新版 (绕注册)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论