|     
 帖子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");
 }
 | 
 |