两行代码搞定myBase Desktop Ver735 [macOS + Linux]
本帖最后由 echowxsy 于 2020-12-22 00:01 编辑以 Linux 为例(懒得再加载一次macOS版的了)
首先把程序拖入 Hopper Disassembler,搜索注册框的提示字符串:
这里有个小tips:mybase对所有的按钮提示文字进行了混淆,搜license之类的很难定位。
通过查找引用就能找到注册窗体的代码:
再往上找就能找到注册逻辑,代码如下:
int sub_5c6ba0(int arg0, int arg1, int arg2, int arg3, int arg4) { //省略代码
rax = sub_555bb0(&var_D8, arg0, arg2, arg3, arg4); //唤起注册窗口,获得用户名和code
if (QDialog::exec() != 0x0) {
//省略代码
rax = sub_590eb0(0xb04ae0, &stack[-616], &var_258);//校验
if (rax != 0x0) {
//成功逻辑
}
else {
//失败逻辑
}
}
rax = QDialog::~QDialog();//提示窗口
return rax;
}
现在进入sub_590eb0,看看校验逻辑的实现:
int sub_590eb0(int arg0, int arg1, int arg2) {
//省略代码
//长度判断
//格式检查
//新版本的key "1-CA……"
rax = sub_5762a0(&var_48, rbx, r12);//检测算法
r13 = 0x1;
if (rax == 0x0) {
//旧版本的key "1-15……"
rax = sub_5762a0(&var_58, rbx, r12);//检测算法
r13 = rax;
//旧版处理代码省略
}
if (r13 != 0x0) {
//正确的逻辑省略
rax = 0x1;
} else {
rax = 0x0;
}
return rax;
}
在这里我犯了个小聪明,直接修改返回值为0x1,在注册的时候任意字符会提示成功,但是关于界面还是试用。说明校验的地方不止一处。
所以我们要更深入一点,再深入一点,进入sub_5762a0里面,查看一下sub_5762a0的引用:
大致浏览了一下,校验都用了这个函数,所以我们对这个动手就可以了。
在这里我们直接让程序ret并在这之前把eax设置为0x1,修改结果如图:
这里有个细节,为了保证堆栈平衡,保留了sub rsp, 0x68和add rsp, 0x68,理论上同时去掉这两个应该也没有问题,这块我不是很懂,还需要学习一个。
到这里,如果你的Hopper像我一样,就可以 File > Produce New Executable... 生成修改后的程序。
没有也没关系,我们看十六进制模式:
注意两点:字节值 和 offset
用这两行代码写修改脚本:
printf'\xB8\x01\x00\x00\x00' | dd seek=$((0x1762ac)) conv=notrunc bs=1 of=./myBase
printf'\xE9\x5B\x01\x00\x00' | dd seek=$((0x1762b1)) conv=notrunc bs=1 of=./myBase
printf'\xC0' | dd seek=$((0x176416)) conv=notrunc bs=1 of=./myBase
啊,为了直观我分成了三段,请不要介意。
同样,macOS下的修改代码:
printf'\xE9\x57\x01\x00\x00\x00' | dd seek=$((0x19b631)) conv=notrunc bs=1 of=/Applications/myBase.app/Contents/MacOS/myBase
printf'\xB0\x01' | dd seek=$((0x19b78d)) conv=notrunc bs=1 of=/Applications/myBase.app/Contents/MacOS/myBase
解释一下代码:printf '\xXX' 是生成16进制的数据,seek是文件的offset,of是输出文件
最终效果:
感谢分享,您辛苦了。 Hopper 是亮点 {:biggrin:} 半夜发帖。支持支持。 看完之后虎躯一震茅塞顿开,感谢楼主 大表哥优秀 虽然看不懂 但是我会默默支持 的 Hopper 是亮点 macOS是直接在终端输入这两行代码吗,好像没有用
页:
[1]