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

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

2008-5-31 17:44
17601

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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
大牛冒泡啊~~~
2008-5-31 17:57
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=;]...[/QUOTE]
PatchByte(EA, Value)
2008-5-31 18:09
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
供参考,你根据情况再调整一下。
#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");
 }
2008-5-31 18:47
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
5
偶用winhex 和IDA一边看jz 、jnz/ jo、jno/js、jns。。。/call

然后一一个替换的。。。

好累啊。

感谢LS几位的热心帮助
2008-5-31 19:53
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
#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");
}
2008-7-10 15:32
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

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


from = NextHead(from, BADADDR);
2008-7-10 16:02
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
8
NextNotTail(ea)
2008-7-10 16:48
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
9
『外壳开发』组长啥juhua都懂啊
2008-7-10 16:53
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
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不更好,还支持通配符呢
2008-7-10 17:08
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
11
我更喜欢写插件

to ccfer: 因为组长是我们的导师
2008-7-10 19:17
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
哈哈 都是高手啊 FindCode(ea,1) 也可以
2008-7-11 14:24
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
花指令去除后 很多的nop 看起来还是不方便 怎么把他们在图形视图里都隐藏掉?
2008-7-11 19:52
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
......貌似花不是太邪恶的~
上次一个壳加密后到处看起来都是花,结果去完花就彻底崩溃了,去了花,但是那些花就是VMCODE,所以去了花,关键代码都消失了....
2008-7-11 21:53
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你可以用HideArea()将这些NOP隐藏起来
2008-7-12 02:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
关注 学习!
2008-7-14 11:52
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
顶起!
请问大牛有没有更方便方法?
貌似我不能用WinDbg调试sys文件
2008-10-15 01:27
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
18
ultraedit 的正则表达式也相当好用的,
经常用它来做比较复杂的替换
2008-10-15 10:10
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
19
关键是将jb xxxx jnb xxxx 改为jmp xxxx。根据lz提供的图片jb和jnb要跳转的是同一个地址,那不就等于无条件跳转JMP了吗。
2008-10-15 10:23
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
20
人家做花指令就是干扰静态反汇编的,改成NOP撒...
2008-10-15 11:49
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
有什么工具可以动态调试SYS文件么?
WinDbg行么?怎么貌似我的不行?
2008-10-15 12:07
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
22
好多都可以.
syser.windbg.softice...
你的不行就是RPWT了.
2008-10-15 13:12
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
23
根据图片信息用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为费字节,也就是所谓的“花指令”。
2008-10-15 13:44
0
游客
登录 | 注册 方可回帖
返回
//