基于IDA Python的OLLVM反混淆(一) 手动去混淆
本帖最后由 Shocker 于 2021-8-10 10:49 编辑## 前言
本文介绍一种根据IDA Python动态调试的OLLVM反混淆方法(基于x86_32指令)
## 思路
根据之前大佬们给出的ollvm流程图,可知
#### 控制流平坦化
OLLVM的真实逻辑在
- 序言
- 真实块
- retn块
那么只要在这些块的头部下断点,记录下之前断点的位置,最后将块中真实块的跳转的地址修改为下一个真实的块的地址即可.
#### 对所有真实块下断点
#### 注意
1.一个真实块的后继真实块可能连接着多个真实块,也可能只有一个真实块
如上图所示,这个块中将一个立即数放入栈中的一个变量里,且该块的后继块中并无cmov指令,意味着该块的后继真实块**只有一个**.
2.若该块或其后继块中包含cmov指令
意味着该块的后继将会有**两个真实块**,在此例中,该块的下一个真实块由第一个条指令cmp决定.
若的值小于5,它的下一个真实块由ecx(0D8AAAD2D)决定,反之由eax(140A249C)决定.
### 找出所有真实块的后继块
用IDA Python脚本记录所有的断点运行的地址
```
from idaapi import *
class MyDbgHook(DBG_Hooks):
""" Own debug hook class that implementd the callback functions """
def dbg_bpt(self, tid, ea):
print ("Break point at 0x%x pid=%d" % (ea, tid))
# return values:
# -1 - to display a breakpoint warning dialog
# if the process is suspended.
# 0 - to never display a breakpoint warning dialog.
# 1 - to always display a breakpoint warning dialog.
return 0
# Remove an existing debug hook
try:
if debughook:
print("Removing previous hook ...")
debughook.unhook()
except:
pass
# Install the debug hook
debughook = MyDbgHook()
debughook.hook()
debughook.steps = 0
# Stop at the entry point
ep = get_inf_attr(INF_START_IP)
request_run_to(ep)
# Step one instruction
request_step_over()
# Start debugging
run_requests()
```
将脚本载入IDA 并启动调试
F9直到程序结束.
就可以得到所有真实块的下一个真实块.
**0x401600 -> 0x401677**
**0x401677 (该块包含cmov指令) -> 0x401690,0x4016cc**
**0x401690 -> 0x4016b3**
**0x4016b3 -> 0x401677**
### 连接所有真实块
使用IDA的Keypatch插件就可以对代码进行patch
需要注意
- 若真实块只有一个后继的真实块,则可以将块中末尾的跳转地址改成下一真实块的首地址.
- 若真实块中包含两个后的继真实块,则需要根据cmov的类型对跳转指令进行修改.
例如
```
cmovl xxx,xxx
```
则末尾的跳转指令需要改成
```
jl xxxxxxxxx
jmp xxxxxxxxx
```
## 结果
将无关的块进行nop后,结果如下
IDA 去混淆后F5的代码
混淆前F5的代码
萌新第一次发帖,如有不足之处请大家多等指教...
本文所用示例
链接:https://pan.baidu.com/s/15k9KQcHChFqMgMt8mFD6sA
提取码:mxnk wuxiping101 发表于 2021-8-9 20:50
大神,这个 ollvm_test.exe没法运行
原理很简单,我是在win10用mingw编译的,具体编译方法可以参考这篇文章
https://zhuanlan.zhihu.com/p/366022834 Shocker 发表于 2021-8-9 21:35
原理很简单,我是在win10用mingw编译的,具体编译方法可以参考这篇文章
https://zhuanlan.zhihu.com/p/366 ...
那到底要怎么才能在windows下调试运行呢... 虽然不懂,但是还是要抢一楼 是不是发错地方了?这个是pc的吧{:301_998:} 看指令怎么是x86的{:1_907:} ollvm混淆是一种技术,所有指令集都可以用,只是经常用于安卓上混淆而已,pc上有更强的 大神,这个 ollvm_test.exe没法运行
没懂,没明白 mark,等会学习看看~
页:
[1]
2