首页
社区
课程
招聘
[原创]贴个简单的特征码搜索函数
发表于: 2008-12-5 21:23 14799

[原创]贴个简单的特征码搜索函数

2008-12-5 21:23
14799

没什么写的了,感觉以前的特征码搜索内核未导出函数效率不高,所以用KMP算法写了个,权当给大家省点敲代码的时间吧。
#define MAXKEYCODE 13//这是特征码的大小
ULONG Index_KMP(unsigned char* S,unsigned char* T,int pos,int next[])
{
  int i=0,j=1,Len=next[0];//这里的串的第1个元素下标是1
  DbgPrint("Seach:%x",S);
  while(i<pos&& j<=Len)//i<=strlen((char*)S) &&
  {
    if(j==0 || S[i]==T[j])
  {
    ++i;++j;//注意到这里的j==0,和++j的作用就知道为什么规定next[1]=0的好处了
  }
    else
  {
    j=next[j];//i不变(不回溯),j跳动
  }
  }
  if(j>Len)
  {
    DbgPrint("Find !%x\n",S+i-Len);
    return (ULONG)(S+i-Len);//匹配成功
  }
  else
    DbgPrint("Seach End:%x",&S[i]);
    return 0;
}
void Get_next(unsigned char Sub[],int next[])
{
  int i=1,j=0;
  next[1]=0;
  while(i<next[0])
  {
       if(j == 0 || Sub[i] == Sub[j])
     {
        ++i;
        ++j;
         next[i] = j;  
     }
       else
     {
          j=next[j];
     }
  }
}
ULONG FindIoWriteCrashDump()//,PDRIVER_OBJECT pDriverObj
{
  NTSTATUS status = STATUS_SUCCESS;
  UNICODE_STRING ustrLinkName;
  UNICODE_STRING ustrDevName;   
  PDEVICE_OBJECT pDevObj;
  ULONG i, curAddr;
  PUCHAR FileContent;
  DWORD dwRet,dwSize;
  PVOID pTmp;
                ULONG uRet=0;
  int next[MAXKEYCODE+1]={MAXKEYCODE};
  unsigned char KeyCode[MAXKEYCODE+1]=
  {
    0x1,                                                //这个不是特征码,随便写个就行。
   0x8B ,0xFF,                                     //mov     edi, edi
    0x55,                                              //push    ebp
    0x8B ,0xEC,                                    //mov     ebp, esp
    0x81,0xEC,0x94,0x00,0x00,0x00,  //sub     esp, 94h
    0x53,                                              //push    ebx
    0x56,                                              //push    esi
//     0xE8,0x77,0xE7,0xFF,0xFF,            //call    KdCheckForDebugBreak
//     0x8B,0x4D,0x24,                             //mov     ecx, [ebp+arg_1C]
//     0x33,0xDB,                                     //xor     ebx, ebx
  };//特征码的数组
  
  NtoskrnlBase = (ULONG)GetModlueBaseAdress( "ntoskrnl.exe",0 );
  //DbgPrint("ntoskrnl.exe: 0x%08lx\n", (PVOID)g_ntoskrnl_base);
  
  if ( 0 == NtoskrnlBase  ) {
    DbgPrint("ERROR: NtoskrnlBase  == 0\n");
    goto _x_;
  }
  
  Get_next(KeyCode, next);

    uRet=Index_KMP((unsigned char* )NtoskrnlBase +0x50000,KeyCode,0x100000,next);//搜索特征码,从NtoskrnlBase +0x50000搜索起,一直搜索0x100000个字节
_x_:
  return uRet;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这个我得顶。。。
2008-12-6 22:54
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
KMP高效!~
2008-12-6 22:57
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
4
内核函数搜索要的是准确!而不是高效!

哎~现在的小孩子~真是本末倒置~!
2008-12-7 00:20
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
就1楼搜索的代码,多跑几台机器能蓝死你~
2008-12-7 00:28
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
6
我搜索了几次和几个函数都没事。无非是在搜索到不可读的地方吧?
大牛见教得是~~
1.我没注意地址可不可读
2.内核函数搜索要的是准确
回头我改进了
2008-12-7 00:38
0
雪    币: 342
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
1楼给我们说的是方法,我们学到了东西,很支持
至于准确,大牛们能否爆料点?
2008-12-7 00:40
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
嘿嘿,暴搜确实不稳定, 跑几台机器,跑几个环境,就BSOD了.还是放弃这个方法吧~~~
2008-12-7 07:37
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
先hook一下int 0x2e,然后自己判断一下,如果XX了,就goto去自己的处理~~,如果没XX就交给原始的0x2e
2008-12-7 09:17
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
10
是int 0xe吧~
2008-12-7 11:25
0
雪    币: 86
活跃值: (56)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
11
用栈回溯~~~呵呵
2008-12-7 11:57
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
12
最近hook 0x2e次数多了,顺手写成0x2e了~~~

搞Trap0E~~~

不过最好的方法是hook下kebugcheck
2008-12-7 13:06
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
13


V大你不是说可以注册CallBack的吗?
2008-12-7 14:26
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
Callback有些时候回不来了~~~
唉~
2008-12-7 19:20
0
游客
登录 | 注册 方可回帖
返回
//