首页 > 编程语言 >逆向技巧——从混淆说明IDA Python脚本的使用

逆向技巧——从混淆说明IDA Python脚本的使用

时间:2023-01-25 22:34:32浏览次数:63  
标签:__ 逆向 addr 混淆 Python ea int asm IDA

之前工作的时候,遇到过病毒需要使用IDA python进行反混淆的问题,但是由于病毒的工作量较大、前置步骤多,没有很好的总结。

闲下来了,有空了,根据网上的Demo做个实验记录一下。

 

一、代码部分

混淆程序如下,VS编译即可:

源代码中asm需要添加斜杠表达连接,原文中未加入反斜杠,报错了。

#include <stdio.h>
#include <stdint.h>

#define JUNKCODE __asm{\
__asm jmp junk1        \
__asm __emit 0x12      \
__asm junk2:           \
__asm ret              \
__asm __emit 0x34      \
__asm junk1:           \
__asm call junk2       \
}

void encrypt(int* v, int* k) {
    int v0 = v[0], v1 = v[1], sum = 0, i;           /* set up */
    int delta = 0x9e3779b9;                     /* a key schedule constant */
    int k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];   /* cache key */
    for (i = 0; i < 32; i++) {
        JUNKCODE
        sum += delta;
        v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
        v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
    }                                              /* end cycle */
    v[0] = v0; v[1] = v1;
}

int main() {
    int a = 1;
    int flag[] = { 1234,5678 };
    int key[] = { 9,9,9,9 };
    __asm {
        _emit 075h
        _emit 2h
        _emit 0E9h
        _emit 0EDh
    }
    encrypt(flag, key);
    printf("%d,%d", flag[0], flag[1]);
    return 0;
}

 

使用以下脚本进行修改,可以进行对照参考:

其中,原文未导入idc_bc695 库,源代码IDA7.0以下可以正常运行,IDA在7.5或者7.6下,需要导入库。

from idc_bc695 import *

def nop(addr, endaddr) :
    while addr < endaddr :
        PatchByte(addr, 0x90)      #修改程序字节
        addr += 1

def undefine(addr, endaddr) :
    while addr < endaddr :
        MakeUnkn(addr, 0)
        addr += 1

def dejunkcode(addr, endaddr) :
    while addr < endaddr :
        MakeCode(addr)
        # 匹配模板
        if GetMnem(addr) == 'jmp' and GetOperandValue(addr, 0) == addr + 5 and Byte(addr + 2) == 0x12:
            next = addr + 10
            nop(addr, next)
            addr = next
            continue
        addr += ItemSize(addr)

nop(0x004549BC, 0x004549BC+4)
dejunkcode(0x00454710, 0x00454844)

 

 函数解析:

MakeCode(ea) #分析代码区,相当于ida快捷键C
ItemSize(ea) #获取指令或数据长度
GetMnem(ea) #得到addr地址的操作码
GetOperandValue(ea,n) #返回指令的操作数的被解析过的值
PatchByte(ea, value) #修改程序字节
Byte(ea) #将地址解释为Byte
MakeUnkn(ea,0) #MakeCode的反过程,相当于ida快捷键U
MakeFunction(ea,end) #将有begin到end的指令转换成一个函数。如果end被指定为BADADDR(-1),IDA会尝试通过定位函数的返回指令,来自动确定该函数的结束地址

 

 

二、第一段混淆

第一段混淆是main函数里的,通过jnz $+2的方法进行,这段代码一定会跳到eip+4的地方,面对这样的整块地址,我们可以简单的nop掉,nop函数可以调用PatchByte函数进行修复。

图1-1:修改前

 

 图1-2:由于IDA使用的是从上而下的调用,所以一定分析的有问题。

 

 图1-3:修改后的汇编区

 图1-4:修改后,可以正常分析

 

三、第二段混淆

第二段是增加了无用的跳转,通过retn和call制作无用跳转。

这里采用混淆的方式让反汇编引擎失去作用。

图2-1:无法正常反汇编

 

图2-2:修改后汇编区

 

图2-3:正常翻译

sum是减号,不过数值和原文件相反,反汇编引擎问题。

 

四、混淆步骤

图3-1:选择上面的执行执行py文件,下面的执行命令。

 

图3-2:由于要使用导入库,我们以执行文件的方式执行。

 

Reference:

[1] https://www.anquanke.com/post/id/208682

[2] https://blog.csdn.net/qq_46106285/article/details/127166299

 

标签:__,逆向,addr,混淆,Python,ea,int,asm,IDA
From: https://www.cnblogs.com/XLRH/p/17067373.html

相关文章

  • python之pip安装
    pip是最为广泛使用的Python包管理器,可以帮助我们获得最新的Python包并进行管理。1pip常用命令pip常用命令如下:命令说明pipinstall[package-name]安装......
  • 3、python中的两大函数(pytorch中可用)
    1、dir():可以提供打开操作,让你看到里面有什么东西例子:查看torch下面会有哪些函数使用dir(torch),会出来函数名字,如果想细看函数里面是否还有东西可以使用dir(torch.函数名字......
  • 你如何使用Python制作网站?
    在本文中,我们将讨论如何使用Python制作网站。Python是一种1991年的编程语言,在过去十年中越来越受欢迎。如今,Python编码器在计算机行业中的需求量很大。Python是一种通用......
  • Python程序来计算球体的体积和面积
    球体(实体)通常被认为是二维图形,即使该图形从其中心在三个平面上可见。造成这种情况的主要原因是,球体仅使用其半径进行测量。然而,空心球体被认为是三维图形,因为它在其球壁内包......
  • Python程序来计算锥体的体积和面积
    圆锥体是通过将公共点的无限线段连接到圆形底中的所有点而形成的三维图形。这个共同点也称为顶点。圆锥体使用三个维度进行测量:其圆形底部的半径、高度和横向高度。圆锥体的......
  • 编写一个 Python 代码以按第 n 列对 NumPy 中的数组进行排序?
    在本文中,我们将向您展示如何在python中按升序和降序按第n列对NumPy中的数组进行排序。NumPy是一个Python库,旨在有效地处理Python中的数组。它快速、简单易学且存储高......
  • 如何在Python Plotly中使用Plotly Express绘制多折线图?
    Plotly是Python中的开源绘图库。Python用户可以使用Plotly生成不同类型的交互式基于Web的图表,包括科学图表,3D图形,统计图表,财务图表等。在本教程中,我们将展示如何使用Plotly......
  • 如何在Python Plotly中将饼图绘制为具有自定义大小的子图?
    Plotly是一个开源的,交互式的,基于浏览器的Python图表库。Python用户可以使用Plotly生成不同类型的图表,包括科学图表,3D图形,统计图表,财务图表等。在本教程中,我们将展示如何使用......
  • 用python求三个数中最大的奇数,主要用branching语法
    #Findthelargestoddnumberamong3numbersnum1=int(input("请输入第一个数:"))num2=int(input("请输入第二个数:"))num3=int(input("请输入第三个数:"))ifnum1%2==0......
  • tensorflow不同版本对应的Python 版本,cuDNN版本,CUDA版本
    ​​welcometomyblog​​​​原图地址​​Linux下的对应版本macOS下的对应版本......