手过简单花指令

参考
https://blog.csdn.net/weixin_44352049/article/details/85567929

----"miasm的安装确实费劲,几十个报错到最后也没处理完。"

去花指令只要找到里面夹杂的"垃圾",直接nop,或者按照自己想法来替换还是比较好办的。

IDC当时是想用来解决llvm指令替换的。。。但拖着拖着就没后续了。
直接对在ida中对程序操作,idc是真的好用;最好的是类c语言~

分析程序是很出名的 [MSLRH].exe

手过简单花指令_第1张图片
图片.png

查壳


手过简单花指令_第2张图片
图片.png

手过简单花指令_第3张图片
图片.png

peid在很早就不更新了,detect it easy 查壳显示是upx的修改版。(其实就是自己写的壳)
手过简单花指令_第4张图片
图片.png

简单看下汇编代码,就可以发现代表是壳的pushad汇编指令。向下翻就能看到很多重复出现的汇编代码。

手过简单花指令_第5张图片
图片.png

idc载入

手过简单花指令_第6张图片
图片.png

这种一条龙下来,还能查出有壳的程序,一般就是加花了。

手过简单花指令_第7张图片
图片.png

ida会因为加入了过多的“辣鸡”指令而造成反编译失败。


手过简单花指令_第8张图片
图片.png

将反编译代码转换成机器码来看。

机器码

其中
E8 对应指令 call
EB 对应指令 JMP

当ida把E8 识别为call时,EB 0C 00 00 便会被看作地址。此地址不存在便会报错,所以在此处应是JMP


手过简单花指令_第9张图片
图片.png

那么重新变为汇编便能看到 箭头两处便是此处的"花"。

手过简单花指令_第10张图片
图片.png

手过简单花指令_第11张图片
图片.png

跳转将此处代码隔了过去,并没有意义。

找到所有为花指令的部分,如果是无意义操作。便全部nop掉。

E8                byte_4560FA     db 0E8h
0A                                db  0Ah
00                                db    0
00                                db    0
00                                db    0
E8                                db 0E8h
EB                byte_456100     db 0EBh
0C                                db  0Ch
00                                db    0
00                                db    0
E8                                db 0E8h
F6                                db 0F6h
FF                                db 0FFh
FF                                db 0FFh
FF                                db 0FFh


74                                db 74h
04                                db    4
75                                db 75h
02                                db    2
EB                                db 0EBh
02                                db    2
EB                                db 0EBh
01                                db    1
81                                db 81h


50                byte_45613A     db 50h
E8                                db 0E8h
02                                db    2
00                                db    0
00                                db    0
00                                db    0
29                                db 29h
5A                                db 5Ah
58                                db 58h
6B                                db 6Bh
C0                                db 0C0h
03                                db    3
E8                                db 0E8h
02                                db    2
00                                db    0
00                                db    0
00                                db    0
29                                db 29h
5A                                db 5Ah
83                                db 83h
C4                                db 0C4h
04                                db    4



EB                                db 0EBh
01                                db    1
68                                db 68h
EB                                db 0EBh
02                                db    2
CD                byte_4561A6     db 0CDh
20                                db  20h
EB                                db 0EBh
01                                db    1
E8                                db 0E8h

使用IDC处理函数

ida函数作用
FindBinary(long addr,long flags,string binary):从给定的地址处搜索一个字节。字符串binary指定一个十六字节序列。
MinEA:给定的地址
//FindBinary(MinEA(),0x03,FBin)
PatchByte(long addr,long val):设置虚拟地址val,一个addr处一个字节值
#include 
static PatchCode() 
{
    auto x,FBin,ProcRange;
    FBin = "E8 0A 00 00 00 E8 EB 0C 00 00 E8 F6 FF FF FF";
    for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin))
    {
        x=x+5; 
          
        PatchByte (x,0x90);
        x = x + 3;
        PatchByte (x,0x90);
        x++; 
        PatchWord (x,0x9090);
        x =x +2 ; 
        PatchDword (x,0x90909090);
    }
    for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin))
    {
        x = x + 4; 
        PatchWord (x,0x9090);
        x = x + 4; 
        PatchByte (x,0x90);
    }

    for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin))
    {
        x = x + 6;
        PatchWord (x,0x9090);
        x = x + 11;
        PatchWord (x,0x9090);
    }
    for (x = FindBinary(MinEA(),0x03,FBin);x != BADADDR;x = FindBinary(x,0x03,FBin))
    {
        x = x+2;
        PatchByte (x,0x90);
        x = x+3; 
        PatchWord (x,0x9090);
        x = x+4; 
        PatchByte (x,0x90);
    }
}

这种花指令是最普通的。

你可能感兴趣的:(手过简单花指令)