- 帖子
- 3852
- 积分
- 13044
- 威望
- 16780
- 金钱
- 36761
- 在线时间
- 1139 小时
|
发现手改花指令太无聊,于是简单学了下IDC,觉得不爽,但是为了稍微节省些体力,还是硬着头皮写了一个,可能有bug,能改的花指令也很有限,我只为了应付我碰到的情况,有和我同样情况的可以直接用,效果应该还行,但是做的不完全,只是把一些无用的花指令替换成0x90,没有重新分析,如果碰到IDA提示红字的地方,按D再按C,呵呵.
代码:
#include <idc.idc>
static matchBytes(StartAddr, Match)
{
auto Len, i, PatSub, SrcSub;
Len = strlen(Match);
while (i < Len)
{
PatSub = substr(Match, i, i+1);
SrcSub = form("%02X", Byte(StartAddr));
SrcSub = substr(SrcSub, i % 2, (i % 2) + 1);
if (PatSub != "?" && PatSub != SrcSub)
{
return 0;
}
if (i % 2 == 1)
{
StartAddr++;
}
i++;
}
return 1;
}
static main()
{
auto StartVa, SavedStartVa, StopVa, Size, i, j;
StartVa = 0x000102A0;
StopVa = 0x000120A0;
Size = StopVa - StartVa;
SavedStartVa = StartVa;
for (i = 0; i < Size; i++)
{
// 0F 82 07 00 00 00 0F 83 01 00 00 00
// jz xxxx + jnz xxxx + 0xE8
// 0F 84 07 00 00 00 0F 85 01 00 00 00 E8
// jo xxxx + jno xxxx + 0xE8
// 0F 80 07 00 00 00 0F 81 01 00 00 00 E8
// js xxxx + jns xxxx + 0xE8
// 0F 88 07 00 00 00 0F 89 01 00 00 00 E8
if (matchBytes(StartVa, "0F8?070000000F8?01000000E8"))
{
for (j = 0; j < 13; j++)
{
PatchByte(StartVa, 0x90);
MakeCode(StartVa);
StartVa++;
}
}
// jb short near xxxx + jnb short near xxxx + 0xE8
// 72 03 73 01 E8
// jo short near xxxx + jno short near xxxx + 0xE8
// 70 03 71 01 E8
// jz short near xxxx + jnz short near xxxx + 0xE8
// 74 03 75 01 E8
if (matchBytes(StartVa, "7?037?01E8"))
{
for (j = 0; j < 5; j++)
{
PatchByte(StartVa, 0x90);
MakeCode(StartVa);
StartVa++;
}
}
StartVa++;
}
AnalyzeArea(SavedStartVa, StopVa);
Message("Clear Fake-Jmp Opcode Ok\n");
} |
|