吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2644|回复: 10
上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
Shocker 发表于 2021-8-4 14:30 回帖奖励
本帖最后由 Shocker 于 2021-8-10 10:49 编辑

前言

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

思路

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

控制流平坦化


OLLVM的真实逻辑在

  • 序言
  • 真实块
  • retn块

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

对所有真实块下断点

注意

1.一个真实块的后继真实块可能连接着多个真实块,也可能只有一个真实块


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

2.若该块或其后继块中包含cmov指令


意味着该块的后继将会有两个真实块,在此例中,该块的下一个真实块由第一个条指令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 并启动调试

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

免费评分

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

查看全部评分

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

沙发
GuiXiaoQi 发表于 2021-8-5 08:29
虽然不懂,但是还是要抢一楼
3#
芽衣 发表于 2021-8-5 09:18
4#
你就是我的阳光 发表于 2021-8-5 09:35
5#
nj001 发表于 2021-8-5 22:27
ollvm混淆是一种技术,所有指令集都可以用,只是经常用于安卓上混淆而已,pc上有更强的
6#
wuxiping101 发表于 2021-8-9 20:50
大神,这个 ollvm_test.exe没法运行

image.png (40.59 KB, 下载次数: 0)

image.png
7#
 楼主| Shocker 发表于 2021-8-9 21:35 |楼主
wuxiping101 发表于 2021-8-9 20:50
大神,这个 ollvm_test.exe没法运行

原理很简单,我是在win10用mingw编译的,具体编译方法可以参考这篇文章
https://zhuanlan.zhihu.com/p/366022834
8#
sabercys 发表于 2021-8-17 22:07
没懂,没明白
9#
梦想总要有的 发表于 2021-9-14 11:20
Shocker 发表于 2021-8-9 21:35
原理很简单,我是在win10用mingw编译的,具体编译方法可以参考这篇文章
https://zhuanlan.zhihu.com/p/366 ...

那到底要怎么才能在windows下调试运行呢...
10#
batstying 发表于 2022-8-29 11:54
mark,等会学习看看~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2022-9-26 08:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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