首页
社区
课程
招聘
[求助]一份HOOK 内核未导出函数的不明之处(代码本身工作正常)
发表于: 2008-9-30 15:41 9338

[求助]一份HOOK 内核未导出函数的不明之处(代码本身工作正常)

2008-9-30 15:41
9338
收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
你的注释没有什么问题. 这份代码也没什么问题.

if(tempAddr&0x10000000)
看此时地址的高位是否存在;
   若存在,表明地址大概是 0xFFXXX 左右的,与之对应的是0xFFFFFFFB
   若不存在,表明地址大概是0x0XXX 左右,与之对应的是5

我看过类似的代码,但也不是很清楚.模糊的知道一些
2008-9-30 16:55
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
3
另外,call类型的Inline Hook很好检测了,不管多深或者未导出,和磁盘文件一对比,就检测出来了...
2008-9-30 16:56
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
看到了 ObpAllocateObject,嘿嘿,这个函数可以用来禁止很多东西.

高端调试 网站的 wy大牛以前分析过.:
http://hi.baidu.com/keenjoy95/blog/item/2e5401ef49eb8f13fcfa3cec.html
2008-9-30 16:58
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢sudami的热心帮助 ,但是我的问题 还没有得到回答。

----------------------------------------------------------------------------------------
if(tempAddr&0x10000000)
看此时地址的高位是否存在;
   若存在,表明地址大概是 0xFFXXX 左右的,与之对应的是0xFFFFFFFB
   若不存在,表明地址大概是0x0XXX 左右,与之对应的是5
-----------------------------------------------------------------------------------------
也许是我太笨了?能详细点说说吗 ? 为什么对应的数值会变?
0xFFFFFFFB 表示有符号数"-5"
谢谢 。
对了,你那份驱动感染的代码我在修改。
直接用 RING3程序感染 SYS,感染后的SYS会调用未导出函数加载ROOTKIT驱动
不需要修改注册表 就可以加载
2008-9-30 19:03
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
6
啊,好强悍,私下交流交流啊.
2008-9-30 19:18
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我很菜的,我只是把你的驱动感染代码看明白了,(也许还有不明白的地方 -_-)你说的那个很“强悍”的东西, 现在只是在构思阶段,不过理论是可行的,应该 可以在 RING3实现。
至于,调用未导出函数不修改注册表  加载驱动,ROOTKIT.COM有文章介绍 ,并不复杂.

我到时候可能还有问题要麻烦你呢
2008-9-30 19:37
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
8
- -

2008-9-30 19:50
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
哎,时代炎凉啊,没人帮助下我吗?
2008-10-1 09:59
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
10
楼主很不尊重别人,我记得发这份代码的时候就说别外传,如今……还有你不明白的地方Sudami已经说了,计算call地址不只是那个
2008-10-1 11:59
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
11
驱动无止境,ws无止境~~

搞来搞去还是hook,深是没有用的,只有更邪恶才行...
2008-10-1 12:26
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
12
常规驱动写起来非常难,非常难~
2008-10-1 12:34
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
冤枉啊,我只是贴出了一小部分代码呀。只是为了解决我的疑问 而已。

如果非要说泄露了些什么,也就是告诉大家 HOOK的 未导出 API名字而已 。不能说外传代码啊
我 把代码的 API名字相关部分做了修改
2008-10-1 17:45
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
可惜一丁点信息足够这些WS的人写出来一个类似的了~
2008-10-1 18:33
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
15
又不是什么秘密的高不可攀的东西,懂点儿Inline Hook的,写出来不是问题.

关键是写个强大的通用的够猥琐的引擎不是很容易....
2008-10-1 19:43
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
信息还是应该交流的,藏着掖着不利于对抗,再说了,没有什么函数是王道
2008-10-1 22:54
0
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
百度快照中的内容;

代码的目的是HOOK一个内核函数的内部调用函数,该内部函数未导出。
在内核函数 call 内部函数时,将内部函数的 call地址修改为我们自己的函数地址。
即将:   call 内部函数
替换为   call 我们的函数(我们的函数,下面称为 替换函数)

//tempAddr 为我们搜索得到的 内部函数地址(这是个跳转地址,即:call 内部函数, 中的call地址)
if(tempAddr&0x10000000)//★ 这是什么含义  //0x10000000这个地址在内核中表示什么含义呢?
  {   //0xFFFFFFFB 表示有符号数"-5"
      NewOffset = (ULONG)Fake_ObpAllocateObject+0xFFFFFFFB-(ULONG)(CurrentAddress+1);
    //NewOffset 表示我们的替换函数地址(该地址作为 call 的操作数,所以是一个相对地址)
    //CurrentAddress +1  是内核函数中, “call 内部函数” 指令的地址,精确点,即call 指令 的地址
    //NewOffset  = 替换函数的绝对地址 -5 - (CurrentAddress +1);   因为 "call 内部函数" 指令本身占5个字节
    HookAddress=*(ULONG*)((BYTE*)(CurrentAddress+2))+(ULONG)(CurrentAddress+1)-0xFFFFFFFB;
    //HookAddress 表示被替换的内部函数原始地址;注意,这是个绝对地址。
    //HookAddress = 内部函数的跳转地址 +  "call 内部函数"指令的地址(当前地址) +5( "call 内部函数"的指令本身占5字节)
    g_TargetMmExchangeValue = (ULONG*)((BYTE*)(CurrentAddress+2));
    //g_TargetMmExchangeValue 表示 "call 内部函数"指令中 ,内部函数的相对地址
    MmExchangeValue((ULONG*)((BYTE*)(CurrentAddress+2)),NewOffset);
    //替换
  }
  else
  {
    NewOffset = (ULONG)Fake_ObpAllocateObject-(ULONG)(CurrentAddress+1)-5;
    //g_OldObpAllocateObjectOffset = *(ULONG*)((BYTE*)(CurrentAddress+2));
    HookAddress=*(ULONG*)((BYTE*)(CurrentAddress+2))+(ULONG)(CurrentAddress+1)+5; //当前地址 + 偏移量 +5
    g_TargetMmExchangeValue = (ULONG*)((BYTE*)(CurrentAddress+2));
    MmExchangeValue((ULONG*)((BYTE*)(CurrentAddress+2)),NewOffset);
  }
代码我尽量添加了注释,不能理解的部分是星号部分,即一开始的:
if(tempAddr&0x10000000)//★ 这是什么含义  
请师傅指点
2008-10-3 23:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
这个不是神秘的代码,已经有人在用了
2008-10-7 15:20
0
游客
登录 | 注册 方可回帖
返回
//