|
|
本帖最后由 莫岚暮 于 2026-5-21 01:36 编辑
RzDroid,以下简称RD
RzDroid允许你在手机上进行简单的二进制文件分析,它的反编译和控制流图功能表现很出色,因为我在这两个板块下了相当大的工夫,并且RD可以不依赖AI生成高质量表达的反编译C代码,甚至可以让大家像使用BN一样将反编译代码也转进控制流图里面。
开始之前,首先请下载最新版RD,本篇教程围绕RD26.4.0版本展开:小飞机网盘,下载不限速、一键转存无上限、在线播放无损音视频。复制这段内容打开「小飞机网盘」APP即可获取
链接:https://share.feijipan.com/s/2xalVCkF
你也可以去看看RD的基础操作教程:传送门
不过在教程开始前,请确保使用软件为26.4.0
我先自己做了一个Crackme小程序,它要求用户输入自己的id以及id对应的key,错误的key会导致验证失败。现在让我们打开RD看看这个程序内部发生了什么奇妙的事情
打开这个文件,分析完毕后可以直接从这里打开main函数,会自动弹出汇编代码窗口
汇编代码理解起来肯定麻烦,这个时候可以打开控制流图
选一个你喜欢的样式
并将内容改为"反编译"
这样你就会发现展现出来的都是通俗易懂的代码啦往下找找我们可以看见这个
CFG将逻辑直接呈现出来:当iVar2为0时,就打印"欢迎使用",否则打印"密钥错误"。
Crack这个程序有两种方法,第一种是直接patch掉这个逻辑,让它始终走成功分支,另一种是研究这个程序做了什么事,从而根据id将key手动算出来。我两种方式都讲,慢慢来
第一种方法:
回到汇编代码这个地方,发现这里有一条cbnz指令,它的作用是:判断一个寄存器的值是否不等于0,如果不等于0,就跳转到指定地址继续执行,否则顺序执行下一条指令。
cbnz跟着的地址是0x00100afc,双击这一行汇编,然后在弹出的菜单中点击"跟随跳转",看看这个地址有啥东西
不出所料,这里就是密钥错误的逻辑代码
同时也验证了之前反编译的代码,iVar2不等于0时就走验证失败这条分支。
要改起来呢也是十分的简单,既然程序要在满足一定条件时把逻辑跳走,那我们不让它跳走就行了,所以...
再次双击这一行,点击用NOP填充当前指令
之后是这样
这个时候再打开控制流图看已经没有分支了
写出文件运行一下看看
完美Crack
第二种方法:
依旧打开反编译窗口,点击"浏览",这个是专门为手机竖屏模式做的
效果是这样
根据这些代码可以看出来
- sVar9 = 0;
- dVar10 = 0x6d6f4d55;
- dVar8 = 0;
- do {
- dVar8 = dVar8 + 1;
- dVar10 = dVar7 + sVar9 ^ dVar10;
- sVar9 = sVar9 + 0x45d9f3b;
- dVar7 = (uint32_t)abStack_b8[dVar8];
- dVar10 = (dVar10 >> 0x1b | dVar10 << 5) + (dVar10 >> 2) + 0x9e3779b9;
- dVar10 = dVar10 ^ dVar10 >> 0xb ^ dVar10 * 0x80;
- } while (dVar7 != 0);
- }
- sVar5 = strlen((char *)abStack_b8);
- dVar10 = (int32_t)sVar5 * 0x27d4eb2d ^ dVar10;
- dVar7 = (dVar10 ^ dVar10 >> 0x10) * -0x7a143595;
- dVar7 = (dVar7 ^ dVar7 >> '\r') * -0x3d4d51cb;
- snprintf(acStack_108,9,"%08X",(uint64_t)(dVar7 ^ dVar7 >> 0x10));
- iVar2 = strcmp(acStack_f8,acStack_108);
复制代码
你甚至可以直接扔给AI
程序会遍历id字符串的每一个字符,然后将当前字符的ASCII值加上sVar9,然后与当前的哈希值 dVar10进行异或
sVar9每次累加固定常数0x45D9F3B
(dVar10 >> 0x1b | dVar10 << 5)实际上是对32位整型进行循环左移5位,随后加上(dVar10 >> 2) 和常数0x9E3779B
最后通过dVar10 = dVar10 ^ (dVar10 >> 11) ^ (dVar10 * 0x80)打乱二进制位
当遍历完所有字符后,进行最后的散列混淆
混合字符串长度:dVar10 = (id长度 * 0x27D4EB2D) ^ dVar10
第一轮乘法混淆:将dVar10高低位异或后,乘以-0x7A143595(即无符号32位下的 0x85EBCA6B)
第二轮乘法混淆:右移13位异或后,乘以-0x3D4D51CB(即无符号32位下的 0xC2B2AE35)
最终高低位再次异或,并格式化为8位大写的十六进制字符串
分析完了,让我们写个python来试试
输入id为momu,给出的key为2139E3FE
运行验证一下:
用其它id也是没问题的
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +2
金币 +2
|