首页
社区
课程
招聘
[原创]IDA 驱动vmp变异 去花指令 IDC脚本
发表于: 2022-9-6 07:00 15389

[原创]IDA 驱动vmp变异 去花指令 IDC脚本

2022-9-6 07:00
15389

变异1:

变异2:

变异3:

这三种变异都是伪跳转,阻碍IDA静态识别的主要特征模型

**看代码前先给大家讲一下IDC脚本代码中的几个函数
FindBinary 搜索二进制
MinEA 最小地址
MakeCode 转换为代码
PatchByte 字节补丁
Byte 读取字节
Dword 读取整数
AnalyzeArea 分析指定块

去花指令后效果
**

IDC脚本代码

 
 
 
#include <idc.idc>
static memset(x,val,len)
{
    auto i;
    for(i = 0; i < len; i++)
    {
        PatchByte(x + i,val);
    }
}
//是否为堆栈平衡 0不为堆栈平衡  为堆栈平衡返回代码字节数
static IsStackBalance(x)
{
    auto bsx;
    bsx = Byte(x);
    if(bsx == 0x48 && Dword(x + 1) == 0x0824648D)//lea rsp,[rsp+8]
    {
        return 5;
    }
    else if(bsx >= 0x58 && bsx <= 0x5F)//pop rax -> rdi
    {
        return 1;
    }
    else if(bsx == 0x41 && Byte(x + 1) >= 0x58 && Byte(x + 1) <= 0x5F)//pop r8 -> r15
    {
        return 2;
    }
    return 0;
}
static IsFalseJump(x)
{
    auto bsx,op,base,len;
    bsx = Byte(x);
    op = Byte(x + 1);
    if((bsx == 0x48 || bsx == 0x49)&& op >= 0xB8 && op <= 0xBF &&
    (
    (Byte(x + 10) >= 0x50 && Byte(x + 10) <= 0x57 && Byte(x + 11) == 0xC3) ||
    (Byte(x + 10) == 0x41 && Byte(x + 11) >= 0x50 && Byte(x + 11) <= 0x57 && Byte(x + 12) == 0xC3)
    )
     )//mov rax -> r15  push rax -> r15  ret
    {
 
        base = Dword(x + 2);
        base = base + (Dword(x + 2 + 4) << 32);
        if(base > x)
        {
            len = base - x ;
            if(len <= (9 + 12))
            {
                return len;
            }
            else
            {
               //Message("find base:%X \n",x);
            }
        }
    }
    return 0;
}
static main() {
    auto x,FBin,ProcRange,StaclBytelen;
    FBin = "E8 04 00 00 00"//call +4
    for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin))
    {
           StaclBytelen = IsStackBalance(x + 9);
           if(StaclBytelen != 0)
           {
                MakeCode(x+9+StaclBytelen);
                memset(x,0x90,9+StaclBytelen);
           }
    }
    FBin = "E9 04 00 00 00"//jmp +4
    for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin))
    {
        MakeCode(x+9);
        memset(x,0x90,9);
    }
    FBin = "C3"//mov rax -> r15
    for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin))
    {
        StaclBytelen = IsFalseJump(x - 11);
        if(StaclBytelen != 0)
        {
            MakeCode(x-11+StaclBytelen);
            memset(x-11,0x90,StaclBytelen);
 
        }
        StaclBytelen = IsFalseJump(x - 12);
        if(StaclBytelen != 0)
        {
            MakeCode(x-12+StaclBytelen);
            memset(x-12,0x90,StaclBytelen);
        }
    }
    AnalyzeArea (MinEA(),MaxEA());
}
#include <idc.idc>
static memset(x,val,len)
{
    auto i;
    for(i = 0; i < len; i++)
    {
        PatchByte(x + i,val);
    }
}
//是否为堆栈平衡 0不为堆栈平衡  为堆栈平衡返回代码字节数
static IsStackBalance(x)
{
    auto bsx;
    bsx = Byte(x);
    if(bsx == 0x48 && Dword(x + 1) == 0x0824648D)//lea rsp,[rsp+8]
    {
        return 5;
    }
    else if(bsx >= 0x58 && bsx <= 0x5F)//pop rax -> rdi
    {
        return 1;
    }
    else if(bsx == 0x41 && Byte(x + 1) >= 0x58 && Byte(x + 1) <= 0x5F)//pop r8 -> r15
    {
        return 2;
    }
    return 0;
}
static IsFalseJump(x)
{
    auto bsx,op,base,len;
    bsx = Byte(x);
    op = Byte(x + 1);
    if((bsx == 0x48 || bsx == 0x49)&& op >= 0xB8 && op <= 0xBF &&
    (
    (Byte(x + 10) >= 0x50 && Byte(x + 10) <= 0x57 && Byte(x + 11) == 0xC3) ||
    (Byte(x + 10) == 0x41 && Byte(x + 11) >= 0x50 && Byte(x + 11) <= 0x57 && Byte(x + 12) == 0xC3)
    )
     )//mov rax -> r15  push rax -> r15  ret
    {
 
        base = Dword(x + 2);
        base = base + (Dword(x + 2 + 4) << 32);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2022-9-6 09:50
0
雪    币: 10023
活跃值: (4416)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2022-9-6 10:50
0
雪    币: 676
活跃值: (937)
能力值: ( LV4,RANK:42 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2022-9-6 22:50
0
雪    币: 3204
活跃值: (5429)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错!
2022-9-19 21:39
0
雪    币: 290
活跃值: (705)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
说实话吧  变异一般都+虚拟的,  这个教程作用不大,,至于我目前没有遇到过单独使用变异的!
2022-9-19 22:07
0
雪    币: 212
活跃值: (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好久没学过花指令了,复习一下。
2024-11-5 20:32
0
雪    币: 214
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢大佬的分享
2024-11-13 10:30
0
游客
登录 | 注册 方可回帖
返回
//