吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4334|回复: 9
收起左侧

[Android 原创] OLLVM反混淆改进

[复制链接]
pcy190 发表于 2020-11-3 21:30

最近结合前辈大佬们的反混淆思路,写了一个基于麒麟模拟来做的ollvm fla反混淆
https://github.com/pcy190/deobfuscator

首先是对fla后的块识别。因为对于不同的情况,例如原始逻辑中就有switch case等等,单纯通过块的入度出度数量,或是深搜真实块,可能还是会漏掉一些真实块,鉴于fla后,IDA仍然能F5,还是可以看到真实逻辑的块的,我们可以手动比对真实块是否遗漏,来加上真实块用于后续分析。麒麟的IDA插件具有手动标注真实块的功能,但其要求IDA7.4以上和python3,(但现在流出的demo版本没有ida python),暂时不太可用。

后续会加入一个python2的ida plugin来手动标注真实块,而后将数据保存起来,供反混淆插件使用(主要是常用的泄露ida全是python2)

在https://github.com/GeT1t/deollvm64 的脚本中,是用unicorn来做路径搜索的,但其要手动map内存数据来适配不同二进制环境。用麒麟来做加载能方便适配上不同的环境。

而后修改了patch策略,加入了跳板的策略。即当一个块没有足够长度来存放合适的jmp指令的时候(一般是条件跳转),先jmp跳转到一个跳板地址,再在跳板地址上布置条件判断的指令。

xxx
B.LE            loc_12A60
B               loc_12D20

->

xxx
B trampoline

trampoline:
    B.LE XXX
    B XXX

其中适合做trampoline的地址有很多,例如在fake blocks(分发块等等)中,eh_frame段里面等等。

另外是在arm64,对csel的patch改进。相对之前只能固定patch 特定位置的csel指令,现在能搜索整个块中任意位置的csel指令,然后将块内csel之后的指令往前搬移,以替换csel指令,再在最后空出来的指令位置布置跳转指令来跳转到真实块。

在路径搜索上使用了麒麟ida plugin和deollvm64的两种方式,分别为广搜和深搜。前者的好处是能够全面的搜索所有已知的真实块,后者能够更准确的识别出真实块中的原始条件判断跳转情况。

一个测试效果
原始

patch后

免费评分

参与人数 8威望 +1 吾爱币 +27 热心值 +6 收起 理由
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
丶咖啡猫丶 + 1 + 1 谢谢@Thanks!
傲世V雄哥720 + 1 + 1 我很赞同!
温柔的一哥 + 1 + 1 我很赞同!
fengbolee + 1 + 1 用心讨论,共获提升!
Ravey + 1 谢谢@Thanks!
O678O + 1 用心讨论,共获提升!
InsafeMacro + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

O678O 发表于 2020-11-4 07:46
评分奉上,感谢分享
valar 发表于 2020-11-4 11:02
碎步流年 发表于 2020-11-4 20:50
FenLin 发表于 2020-11-5 11:39
多谢分享!!!
Light紫星 发表于 2020-11-5 20:05
大佬,完全看不懂
醉酒戏红颜 发表于 2020-11-12 09:54
有点看不懂 还是支持下
larkpwn 发表于 2020-11-16 10:19
支持一下,混淆反混淆原理太复杂了
alxstar 发表于 2020-11-17 10:06
谢谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 19:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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