吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6980|回复: 11
收起左侧

[原创] 基于IDA Python的OLLVM反混淆(一) 手动去混淆

[复制链接]
Shocker 发表于 2021-8-4 14:30
本帖最后由 Shocker 于 2021-8-10 10:49 编辑

前言

本文介绍一种根据IDA Python动态调试的OLLVM反混淆方法(基于x86_32指令)

思路

根据之前大佬们给出的ollvm流程图,可知

控制流平坦化

all.png
OLLVM的真实逻辑在

  • 序言
  • 真实块
  • retn块

那么只要在这些块的头部下断点,记录下之前断点的位置,最后将块中真实块的跳转的地址修改为下一个真实的块的地址即可.

对所有真实块下断点

ollvm_.png

注意

1.一个真实块的后继真实块可能连接着多个真实块,也可能只有一个真实块
ollvm3.jpg
如上图所示,这个块中将一个立即数放入栈中的一个变量里,且该块的后继块中并无cmov指令,意味着该块的后继真实块只有一个.

2.若该块或其后继块中包含cmov指令
ollvm4.jpg
意味着该块的后继将会有两个真实块,在此例中,该块的下一个真实块由第一个条指令cmp决定.
若[ebp+var_8]的值小于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 并启动调试
script.jpg

F9直到程序结束.
res.jpg

就可以得到所有真实块的下一个真实块.

0x401600 -> 0x401677
0x401677 (该块包含cmov指令) -> 0x401690,0x4016cc
0x401690 -> 0x4016b3
0x4016b3 -> 0x401677

连接所有真实块

使用IDA的Keypatch插件就可以对代码进行patch
key_patch.jpg
需要注意

  • 若真实块只有一个后继的真实块,则可以将块中末尾的跳转地址改成下一真实块的首地址.
  • 若真实块中包含两个后的继真实块,则需要根据cmov的类型对跳转指令进行修改.
    例如
    cmovl xxx,xxx

    则末尾的跳转指令需要改成

    jl xxxxxxxxx
    jmp xxxxxxxxx

结果

将无关的块进行nop后,结果如下

patch_1.jpg

IDA 去混淆后F5的代码

patch_1_f5.jpg

混淆前F5的代码

patch_0.jpg

萌新第一次发帖,如有不足之处请大家多等指教...

本文所用示例
链接:https://pan.baidu.com/s/15k9KQcHChFqMgMt8mFD6sA
提取码:mxnk

免费评分

参与人数 3威望 +1 吾爱币 +22 热心值 +2 收起 理由
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
GuiXiaoQi + 1 用心讨论,共获提升!

查看全部评分

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

 楼主| 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的吧
你就是我的阳光 发表于 2021-8-5 09:35
看指令怎么是x86的
nj001 发表于 2021-8-5 22:27
ollvm混淆是一种技术,所有指令集都可以用,只是经常用于安卓上混淆而已,pc上有更强的
wuxiping101 发表于 2021-8-9 20:50
大神,这个 ollvm_test.exe没法运行
image.png
sabercys 发表于 2021-8-17 22:07
没懂,没明白
batstying 发表于 2022-8-29 11:54
mark,等会学习看看~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-15 13:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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