本帖最后由 echowxsy 于 2020-12-22 00:01 编辑  
 
以 Linux 为例(懒得再加载一次macOS版的了) 
首先把程序拖入 Hopper Disassembler,搜索注册框的提示字符串: 
 
 
这里有个小tips:mybase对所有的按钮提示文字进行了混淆,搜license之类的很难定位。 
通过查找引用就能找到注册窗体的代码: 
 
 
再往上找就能找到注册逻辑,代码如下: 
[Objective-C] 纯文本查看 复制代码 
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,看看校验逻辑的实现: 
[Objective-C] 纯文本查看 复制代码 
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 
用这两行代码写修改脚本: 
[Bash shell] 纯文本查看 复制代码 
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下的修改代码: 
[Bash shell] 纯文本查看 复制代码 
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是输出文件 
最终效果: 
 
 
 
 
 
 
 |