参考
https://blog.csdn.net/weixin_44352049/article/details/85567929
----"miasm的安装确实费劲,几十个报错到最后也没处理完。"
去花指令只要找到里面夹杂的"垃圾",直接nop,或者按照自己想法来替换还是比较好办的。
IDC当时是想用来解决llvm指令替换的。。。但拖着拖着就没后续了。
直接对在ida中对程序操作,idc是真的好用;最好的是类c语言~
分析程序是很出名的 [MSLRH].exe
查壳
peid在很早就不更新了,detect it easy 查壳显示是upx的修改版。(其实就是自己写的壳)
简单看下汇编代码,就可以发现代表是壳的pushad汇编指令。向下翻就能看到很多重复出现的汇编代码。
idc载入
这种一条龙下来,还能查出有壳的程序,一般就是加花了。
ida会因为加入了过多的“辣鸡”指令而造成反编译失败。
将反编译代码转换成机器码来看。
机器码
其中
E8 对应指令 call
EB 对应指令 JMP
当ida把E8 识别为call时,EB 0C 00 00 便会被看作地址。此地址不存在便会报错,所以在此处应是JMP
那么重新变为汇编便能看到 箭头两处便是此处的"花"。
跳转将此处代码隔了过去,并没有意义。
找到所有为花指令的部分,如果是无意义操作。便全部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);
}
}
这种花指令是最普通的。