Shocker 发表于 2021-8-4 14:30

基于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

Shocker 发表于 2021-8-9 21:35

wuxiping101 发表于 2021-8-9 20:50
大神,这个 ollvm_test.exe没法运行
原理很简单,我是在win10用mingw编译的,具体编译方法可以参考这篇文章
https://zhuanlan.zhihu.com/p/366022834

梦想总要有的 发表于 2021-9-14 11:20

Shocker 发表于 2021-8-9 21:35
原理很简单,我是在win10用mingw编译的,具体编译方法可以参考这篇文章
https://zhuanlan.zhihu.com/p/366 ...

那到底要怎么才能在windows下调试运行呢...

GuiXiaoQi 发表于 2021-8-5 08:29

虽然不懂,但是还是要抢一楼

芽衣 发表于 2021-8-5 09:18

是不是发错地方了?这个是pc的吧{:301_998:}

你就是我的阳光 发表于 2021-8-5 09:35

看指令怎么是x86的{:1_907:}

nj001 发表于 2021-8-5 22:27

ollvm混淆是一种技术,所有指令集都可以用,只是经常用于安卓上混淆而已,pc上有更强的

wuxiping101 发表于 2021-8-9 20:50

大神,这个 ollvm_test.exe没法运行

sabercys 发表于 2021-8-17 22:07

没懂,没明白

batstying 发表于 2022-8-29 11:54

mark,等会学习看看~
页: [1] 2
查看完整版本: 基于IDA Python的OLLVM反混淆(一) 手动去混淆