之前工作的时候,遇到过病毒需要使用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