首页
社区
课程
招聘
[求助]去除驱动花指令--编写IDC脚本-问题
2008-5-31 17:44 16875

[求助]去除驱动花指令--编写IDC脚本-问题

2008-5-31 17:44
16875
俺在看一个驱动,其中加了大量的花指令。但基本模式是这样的:

jz  @F
  jnz  @F
  db 0E8h
  @@:


在IDA的图片如下:



--------------------------------------------------------------------

在网上搜了下,好象可以用winhex修改sys,或IDA中调用自己编写的IDC脚本来去掉花指令。

偶用winhex改了下,发现很烦琐;
换用IDC,偶又不是很会,了解了下简单的语法,发现和C语言很像.

偶不知道确切的该如何编写IDC,能看懂里面的内容,但自己写不出来。
偶想把上面那样的花指令改为nop。附件中是前人写的一个IDC去花指令。还忘对这些了解的同学帮忙改动一下,看能否适用于偶的这个情况

另外驱动带反动态调试 - -

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (22)
雪    币: 709
活跃值: (2255)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2008-5-31 17:57
2
0
大牛冒泡啊~~~
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2008-5-31 18:09
3
0
[QUOTE=;]...[/QUOTE]
PatchByte(EA, Value)
雪    币: 32401
活跃值: (18840)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2008-5-31 18:47
4
0
供参考,你根据情况再调整一下。
#include <idc.idc>

static main()
{
   auto i,j,from,size; 
   from=0x401000; //起始地址,你指定一下
   size=0x100;//扫描数据块大小

   for ( i=0; i < size;i++ ) { 

//查找 0F 82 07 ?? ?? ??,替换90
      if ((Byte(from)==0x0f)&&(Byte(from+1)==0x82)&&(Byte(from+2)==0x07))
     {
           for(j=0;j<5;j++)
          {
               PatchByte(from,0x90);
               from++;
            }
            continue;
       }

//查找 0F 83 01 ?? ?? ??,替换90
      if ((Byte(from)==0x0f)&&(Byte(from+1)==0x83)&&(Byte(from+2)==0x01))
     {
          for(j=0;j<5;j++)
          {
               PatchByte(from,0x90);
               from++;
            }
            continue;
       }
         from++;
    }
    Message("\n" + "OK\n");
 }
雪    币: 709
活跃值: (2255)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2008-5-31 19:53
5
0
偶用winhex 和IDA一边看jz 、jnz/ jo、jno/js、jns。。。/call

然后一一个替换的。。。

好累啊。

感谢LS几位的热心帮助
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cpuArt 2008-7-10 15:32
6
0
#include <idc.idc>

static main()
{       
        auto i,j,from,size,fromend,address;
        from=0x1BF15D0; //起始地址,你指定一下
        fromend=0x01BF1C28;//结束地址

        while (from<=fromend)
        {

                //查找 74 ?? 75 ?? jz jnz
                if ((Byte(from)==0x74)&&(Byte(from+2)==0x75))
                {
                        if (Byte(from+1)==(Byte(from+3)+2)) //确认是跳到同一地址
                        {
                                j = Byte(from+3);
                                from = from + 4;
                                for (i = 0;i<j;i++)
                                {
                                        PatchByte(from,0x90);
                                        from++;       
                                }
                        }
                        continue;
                }

                //查找 68 ?? ?? ?? ?? C3 push ret

                if ((Byte(from)==0x68)&&(Byte(from+5)==0xc3))
                {
                        address = Dword(from+1);
                        from = from +6;
                        while (from < address)
                        {
                                PatchByte(from,0x90);
                                from ++;
                        }
                        continue;
                }

                from ++; //这里用跳到下一条指令会更准确 但我不知道用什么函数
        }

        Message("\n" + "OK\n");
}
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老纳 2008-7-10 16:02
7
0

from ++; //这里用跳到下一条指令会更准确 但我不知道用什么函数


from = NextHead(from, BADADDR);
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2008-7-10 16:48
8
0
NextNotTail(ea)
雪    币: 8191
活跃值: (4268)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2008-7-10 16:53
9
0
『外壳开发』组长啥juhua都懂啊
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老纳 2008-7-10 17:08
10
0
long    FindBinary      (long ea,long flag,string str);
                // str - a string as a user enters it for Search Text in Core
                //      example:  "41 42" - find 2 bytes 41h,42h
                // The default radix depends on the current IDP module
                // (radix for ibm pc is 16)

其实用FindBinary不更好,还支持通配符呢
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2008-7-10 19:17
11
0
我更喜欢写插件

to ccfer: 因为组长是我们的导师
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cpuArt 2008-7-11 14:24
12
0
哈哈 都是高手啊 FindCode(ea,1) 也可以
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cpuArt 2008-7-11 19:52
13
0
花指令去除后 很多的nop 看起来还是不方便 怎么把他们在图形视图里都隐藏掉?
雪    币: 8863
活跃值: (2374)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2008-7-11 21:53
14
0
......貌似花不是太邪恶的~
上次一个壳加密后到处看起来都是花,结果去完花就彻底崩溃了,去了花,但是那些花就是VMCODE,所以去了花,关键代码都消失了....
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zzsx 2008-7-12 02:01
15
0
你可以用HideArea()将这些NOP隐藏起来
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
simonlx 2008-7-14 11:52
16
0
关注 学习!
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Aleaxander 1 2008-10-15 01:27
17
0
顶起!
请问大牛有没有更方便方法?
貌似我不能用WinDbg调试sys文件
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk 2008-10-15 10:10
18
0
ultraedit 的正则表达式也相当好用的,
经常用它来做比较复杂的替换
雪    币: 141
活跃值: (1125)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
mavermaver 3 2008-10-15 10:23
19
0
关键是将jb xxxx jnb xxxx 改为jmp xxxx。根据lz提供的图片jb和jnb要跳转的是同一个地址,那不就等于无条件跳转JMP了吗。
雪    币: 709
活跃值: (2255)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2008-10-15 11:49
20
0
人家做花指令就是干扰静态反汇编的,改成NOP撒...
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Aleaxander 1 2008-10-15 12:07
21
0
有什么工具可以动态调试SYS文件么?
WinDbg行么?怎么貌似我的不行?
雪    币: 709
活跃值: (2255)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2008-10-15 13:12
22
0
好多都可以.
syser.windbg.softice...
你的不行就是RPWT了.
雪    币: 141
活跃值: (1125)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
mavermaver 3 2008-10-15 13:44
23
0
根据图片信息用IDA模拟结果如下:
10460   E9 17 01 00 00 90 90 90 90 90 8D 85 38 FF FF FF
10470   50 6A 14 68 40 22 01 00 E8 23 FE FF FF 0F 82 07
10480   00 00 00 0F 83 01 00 00 00 E8 8D 85 38 FF FF FF
10490   50 8D 85 98 FD FF FF 50 FF 15 B4 20 01 00 8D 85
104A0   78 FD FF FF 50 8D 85 98 FD FF FF 50 FF 15 AC 20

seg000:00010460 E9 17 01 00 00                                jmp     loc_1057C
seg000:00010460                               ; ---------------------------------------------------------------------------
seg000:00010465 90                                            db  90h ;
seg000:00010466 90                                            db  90h ;
seg000:00010467 90                                            db  90h ;
seg000:00010468 90                                            db  90h ;
seg000:00010469 90                                            db  90h ;
seg000:0001046A                               ; ---------------------------------------------------------------------------
seg000:0001046A 8D 85 38 FF FF FF                             lea     eax, [ebp-0C8h]
seg000:00010470 50                                            push    eax
seg000:00010471 6A 14                                         push    14h
seg000:00010473 68 40 22 01 00                                push    offset unk_12240
seg000:00010478 E8 23 FE FF FF                                call    loc_102A0
seg000:0001047D 0F 82 07 00 00 00                             jb      near ptr loc_10489+1
seg000:00010483 0F 83 01 00 00 00                             jnb     near ptr loc_10489+1
seg000:00010489
seg000:00010489                               loc_10489:                        
seg000:00010489                                                                     
seg000:00010489 E8 8D 85 38 FF                                call    near ptr 0FF398A1Bh
seg000:00010489                               ; ---------------------------------------------------------------------------
seg000:0001048E FF                                            db 0FFh
seg000:0001048F FF                                            db 0FFh
seg000:00010490                               ; ---------------------------------------------------------------------------
seg000:00010490 50                                            push    eax
seg000:00010491 8D 85 98 FD FF FF                             lea     eax, [ebp-268h]
seg000:00010497 50                                            push    eax
seg000:00010498 FF 15 B4 20 01 00                             call    ds:dword_120B4  ; RtlInitUnicodeString
seg000:0001049E 8D 85 78 FD FF FF                             lea     eax, [ebp-288h]
seg000:000104A4 50                                            push    eax
seg000:000104A5 8D 85 98 FD FF FF                             lea     eax, [ebp-268h]
seg000:000104AB 50                                            push    eax
seg000:000104AC FF 15 AC 20 xx xx                             call    dword ptr ds:xxxx20ACh

其关键代码为:

seg000:0001047D 0F 82 07 00 00 00                             jb      near ptr loc_10489+1
seg000:00010483 0F 83 01 00 00 00                             jnb     near ptr loc_10489+1
seg000:00010489
seg000:00010489                               loc_10489:        
seg000:00010489                                                        
seg000:00010489 E8 8D 85 38 FF                                call    near ptr 0FF398A1Bh
seg000:00010489                               ; ---------------------------------------------------------------------------
seg000:0001048E FF FF                                         dw 0FFFFh
seg000:00010490                               ; ---------------------------------------------------------------------------
seg000:00010490 50                                            push    eax

将00010489处的call指令取消(U命令),从其下一个字节0001048A开始编码(C命令)得到以下结果:

seg000:0001047D 0F 82 07 00 00 00                             jb      loc_1048A
seg000:00010483 0F 83 01 00 00 00                             jnb     loc_1048A
seg000:00010483                               ; ---------------------------------------------------------------------------
seg000:00010489 E8                                            db 0E8h ; ?
seg000:0001048A                               ; ---------------------------------------------------------------------------
seg000:0001048A
seg000:0001048A                               loc_1048A:         
seg000:0001048A                                                         
seg000:0001048A 8D 85 38 FF FF FF                             lea     eax, [ebp-0C8h]
seg000:00010490 50                                            push    eax

可见call指令是假的,即E8为费字节,也就是所谓的“花指令”。
游客
登录 | 注册 方可回帖
返回