Board logo

标题: 去简单花指令的IDC脚本 [打印本页]

作者: 柔肠寸断    时间: 2009-5-13 18:32     标题: 去简单花指令的IDC脚本

发现手改花指令太无聊,于是简单学了下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");
}
作者: EndTo偌枫    时间: 2009-7-6 01:37

学习了,LZ辛苦了




欢迎光临 【3.A.S.T】网络安全爱好者 (http://3ast.com./) Powered by Discuz! 7.2