返回列表 发新帖

关于还原落叶思秋nop代码的提示

  [复制链接]

139

主题

859

回帖

4477

积分

大学生

Rank: 5Rank: 5

金币
968
好评
37
信誉
100

MT论坛帅哥考神MT论坛新人MT论坛最佳新人MT论坛活跃会员

QQ
发表于 2025-11-1 13:51:22 | 显示全部楼层 | 阅读模式  来自 福建
按理来说只要解密so的rc4就能还原nop
详细参考https://bbs.kanxue.com/thread-285620.htm
DPT通过Hook DefineClass 函数来触发代码恢复流程:
Hook:在native层的.init_array节中,通过Dobby和bhook框架Hook关键函数
触发:当系统调用 DefineClass 加载类时,Hook函数会被触发
定位:利用 DefineClass 的参数获取 DexFile 和 ClassDef 结构,从而定位需要恢复的CodeItem
详细介绍
1.原始代码的加密
DPT使用RC4加密对原始代码进行加密
i.生成密钥
位于RC4Utils.java
  1. <p>public static byte[] generateRC4Key() {</p><p>    byte[] rc4key = new byte[16];</p><p>    SecureRandom secureRandom = new SecureRandom();</p><p>    for(int i = 0;i < rc4key.length;i++) {</p><p>        secureRandom.nextBytes(rc4key);</p><p>    }</p><p>    rc4key[3] = 0x20;</p><p>    rc4key[9] = 0x74;</p><p>    return rc4key;</p><p>}</p>
复制代码
ii.加密
  1. <p>public static byte[] crypt(byte[] key,byte[] in) {</p><p>    try {</p><p>        Cipher cipher = Cipher.getInstance(transform);</p><p>        SecretKeySpec spec = new SecretKeySpec(key,transform);</p><p>        cipher.init(Cipher.ENCRYPT_MODE,spec);</p><p>        return cipher.doFinal(in);</p><p>    } catch (Exception e) {</p><p>    }</p><p>    return null;</p><p>}</p>
复制代码
iii.加固时加密 :在AndroidPackage类中执行SO文件加密
  1. <p>public void encryptSoFiles(String packageOutDir, byte[] rc4Key){</p><p>    // ...</p><p>    encryptSoFile(soFile, rc4Key);</p><p>    writeSoFileCryptKey(soFile, rc4Key);</p><p>    // ...</p><p>}</p>
复制代码
位于AndroidPackage.java
iiii.运行解密
在运行时,DPT通过 decrypt_section 函数解密存储在SO文件特定section中的代码:
  1. <p>void decrypt_section(const char* section_name, int temp_prot, int target_prot) {</p><p>    // ...获取section信息</p><p>    struct rc4_state dec_state;</p><p>    rc4_init(&dec_state, reinterpret_cast<const u_char *>(DPT_UNKNOWN_DATA), 16);</p><p>    rc4_crypt(&dec_state, reinterpret_cast<const u_char *>(target),</p><p>              reinterpret_cast<u_char *>(bitcode),</p><p>              size);</p><p>    // ...将解密后的数据写回</p><p>}</p>
复制代码
2.加密后文件的存储位置
原始代码存储
存储格式 :使用 MultiDexCode 结构存储所有被提取的代码
包含版本信息、DEX数量、DEX代码索引数组和所有CodeItem数据
每个CodeItem包含方法索引、指令大小和原始指令数据
存储位置 :以特定名称( CODE_ITEM_NAME_IN_ZIP )存储在APK的ZIP文件中
运行读取 :在 init_app 函数中从ZIP文件读取:
  1. auto entry_data = read_zip_file_entry(package_addr, package_size, AY_OBFUSCATE(CODE_ITEM_NAME_IN_ZIP));
复制代码
位于dpt.cpp
加密密钥存储
密钥符号 :加密密钥存储在SO文件的特定符号 DPT_UNKNOWN_DATA 中
  1. public static final String RC4_KEY_SYMBOL = "DPT_UNKNOWN_DATA";
复制代码
位于const.java
密钥写入
在 writeSoFileCryptKey 方法中将密钥写入SO文件:
  1. <p>private void writeSoFileCryptKey(File soFile, byte[] rc4key) {</p><p>    ReadElf.Symbol symbol = readElf.getDynamicSymbol(Const.RC4_KEY_SYMBOL);</p><p>    // ...</p><p>    IoUtils.writeFile(soFile.getAbsolutePath(), rc4key, symbolDataOffset);</p><p>}</p>
复制代码
3.代码加载与恢复
初始化与数据加载
初始化流程 :在 JNI_OnLoad 中调用 init_dpt() ,解密关键代码段
  1. <p>void init_dpt() {</p><p>#ifdef DECRYPT_BITCODE</p><p>    decrypt_bitcode();</p><p>#endif</p><p>    // ...</p><p>}</p>
复制代码
代码数据解析 :通过 readCodeItem 函数解析 MultiDexCode 格式的数据
  1. <p>DPT_ENCRYPT void readCodeItem(uint8_t *data, size_t data_len) {</p><p>    if (data != nullptr && data_len >= 0) {</p><p>        data::MultiDexCode *dexCode = data::MultiDexCode::getInst();</p><p>        dexCode->init(data, data_len);</p><p>        // ...解析DEX代码索引和CodeItem</p><p>    }</p><p>}</p>
复制代码

4.MultiDexCode结构解析
MultiDexCode 提供了读取加密代码数据的方法:
数据结构 :
版本号(2字节)
DEX数量(2字节)
DEX代码索引数组
CodeItem数据数组
读取方法 :
  1. <p>dpt::data::CodeItem* dpt::data::MultiDexCode::nextCodeItem(uint32_t* offset) {</p><p>    uint32_t methodIdx = readUInt32(*offset);</p><p>    uint32_t insnsSize = readUInt32(*offset + 4);</p><p>    auto* insns = (uint8_t*)(m_buffer + *offset + 8);</p><p>    *offset = (*offset + 8 + insnsSize);</p><p>    auto* codeItem = new CodeItem(methodIdx, insnsSize, insns);</p><p>    return codeItem;</p><p>}</p>
复制代码
5.内存操作与代码恢复
内存保护与修改
内存权限修改 :通过Hook mmap 函数为DEX内存区域添加 PROT_WRITE 权限
代码恢复 :在Hook的 DefineClass 函数中,找到对应的CodeItem并将原始代码写回NOP填充区域
DPT使用映射表( dexMap )管理所有的CodeItem,以便在运行时快速查找和恢复:
  1. <p>// 在readCodeItem函数中构建映射</p><p>for (int i = 0; i < indexCount; i++) {</p><p>    // ...</p><p>    auto codeItemVec = new std::vector<data::CodeItem *>(65536);</p><p>    // ...</p><p>    for (int k = 0; k < methodCount; k++) {</p><p>        data::CodeItem *codeItem = dexCode->nextCodeItem(&codeItemIndex);</p><p>        uint32_t methodIdx = codeItem->getMethodIdx();</p><p>        codeItemVec->at(methodIdx) = codeItem;</p><p>    }</p><p>    dexMap.emplace(i, codeItemVec);</p><p>}</p>
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

9

主题

5489

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
698
好评
0
信誉
116

MT论坛新人考神MT论坛帅哥

发表于 2025-11-1 13:52:22 来自手机  | 显示全部楼层  来自 安徽
看看隐藏
回复

使用道具 举报

139

主题

859

回帖

4477

积分

大学生

Rank: 5Rank: 5

金币
968
好评
37
信誉
100

MT论坛帅哥考神MT论坛新人MT论坛最佳新人MT论坛活跃会员

QQ
发表于 2025-11-1 13:53:11 来自手机  | 显示全部楼层  来自 福建
电脑版论坛代码框有点问题,凑合着看
回复

使用道具 举报

16

主题

1778

回帖

1万

积分

博士生

阿巴阿巴

Rank: 7Rank: 7Rank: 7

金币
2219
好评
244
信誉
190
发表于 2025-11-1 13:53:23 来自手机  | 显示全部楼层  来自 贵州
看看
回复

使用道具 举报

20

主题

4125

回帖

1万

积分

博士生

陨落凡尘

Rank: 7Rank: 7Rank: 7

金币
4685
好评
14
信誉
99

考神MT论坛活跃会员

发表于 2025-11-1 13:55:27 | 显示全部楼层  来自 山东
看看发的啥
回复

使用道具 举报

24

主题

826

回帖

3267

积分

大学生

Rank: 5Rank: 5

金币
1482
好评
4
信誉
100
发表于 2025-11-1 13:57:38 来自手机  | 显示全部楼层  来自 浙江
看看隐藏
回复

使用道具 举报

15

主题

2094

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4200
好评
19
信誉
100
发表于 2025-11-1 14:00:44 来自手机  | 显示全部楼层  来自 湖北
过来瞧瞧
回复

使用道具 举报

0

主题

7273

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
2246
好评
8
信誉
124

考神

发表于 2025-11-1 14:01:01 来自手机  | 显示全部楼层  来自 广东
看看
回复

使用道具 举报

134

主题

3460

回帖

1万

积分

博士生

无敌最俊朗

Rank: 7Rank: 7Rank: 7

金币
3010
好评
49
信誉
105
发表于 2025-11-1 14:01:31 来自手机  | 显示全部楼层  来自 浙江
看看
回复

使用道具 举报

25

主题

6262

回帖

1万

积分

博士生

小白一个

Rank: 7Rank: 7Rank: 7

金币
2777
好评
2
信誉
95

MT论坛新人考神MT论坛最佳新人

发表于 2025-11-1 14:12:32 来自手机  | 显示全部楼层  来自 辽宁
看看隐藏
回复

使用道具 举报

28

主题

1906

回帖

7023

积分

硕士生

Rank: 6Rank: 6

金币
4150
好评
5
信誉
100
发表于 2025-11-1 14:12:55 来自手机  | 显示全部楼层  来自 浙江
看看
回复

使用道具 举报

17

主题

947

回帖

3815

积分

大学生

Rank: 5Rank: 5

金币
1227
好评
0
信誉
98
发表于 2025-11-1 14:13:04 来自手机  | 显示全部楼层  来自 江西
收藏
回复

使用道具 举报

38

主题

1214

回帖

4733

积分

大学生

Rank: 5Rank: 5

金币
2974
好评
1
信誉
100

MT论坛新人考神

发表于 2025-11-1 14:13:10 来自手机  | 显示全部楼层  来自 湖南
看看隐藏
回复

使用道具 举报

4

主题

407

回帖

1318

积分

高中生

Rank: 4

金币
97
好评
0
信誉
100
发表于 2025-11-1 14:13:28 来自手机  | 显示全部楼层  来自 重庆
看看
回复

使用道具 举报

54

主题

4527

回帖

1万

积分

博士生

辰夕Mod

Rank: 7Rank: 7Rank: 7

金币
7121
好评
35
信誉
169

MT论坛帅哥考神MT论坛活跃会员

QQ
发表于 2025-11-1 14:14:44 来自手机  | 显示全部楼层  来自 辽宁
让我康康
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表