能力值:
( LV12,RANK:1010 )
|
-
-
2 楼
你的注释没有什么问题. 这份代码也没什么问题.
if(tempAddr&0x10000000)
看此时地址的高位是否存在;
若存在,表明地址大概是 0xFFXXX 左右的,与之对应的是0xFFFFFFFB
若不存在,表明地址大概是0x0XXX 左右,与之对应的是5
我看过类似的代码,但也不是很清楚.模糊的知道一些
|
能力值:
( LV12,RANK:1010 )
|
-
-
3 楼
另外,call类型的Inline Hook很好检测了,不管多深或者未导出,和磁盘文件一对比,就检测出来了...
|
能力值:
( LV12,RANK:1010 )
|
-
-
4 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
谢谢sudami的热心帮助 ,但是我的问题 还没有得到回答。
----------------------------------------------------------------------------------------
if(tempAddr&0x10000000)
看此时地址的高位是否存在;
若存在,表明地址大概是 0xFFXXX 左右的,与之对应的是0xFFFFFFFB
若不存在,表明地址大概是0x0XXX 左右,与之对应的是5
-----------------------------------------------------------------------------------------
也许是我太笨了?能详细点说说吗 ? 为什么对应的数值会变?
0xFFFFFFFB 表示有符号数"-5"
谢谢 。
对了,你那份驱动感染的代码我在修改。
直接用 RING3程序感染 SYS,感染后的SYS会调用未导出函数加载ROOTKIT驱动
不需要修改注册表 就可以加载
|
能力值:
( LV12,RANK:1010 )
|
-
-
6 楼
啊,好强悍,私下交流交流啊.
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我很菜的,我只是把你的驱动感染代码看明白了,(也许还有不明白的地方 -_-)你说的那个很“强悍”的东西, 现在只是在构思阶段,不过理论是可行的,应该 可以在 RING3实现。
至于,调用未导出函数不修改注册表 加载驱动,ROOTKIT.COM有文章介绍 ,并不复杂.
我到时候可能还有问题要麻烦你呢
|
能力值:
( LV12,RANK:1010 )
|
-
-
8 楼
- -
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
哎,时代炎凉啊,没人帮助下我吗?
|
能力值:
( LV12,RANK:600 )
|
-
-
10 楼
楼主很不尊重别人,我记得发这份代码的时候就说别外传,如今……还有你不明白的地方Sudami已经说了,计算call地址不只是那个
|
能力值:
( LV12,RANK:760 )
|
-
-
11 楼
驱动无止境,ws无止境~~
搞来搞去还是hook,深是没有用的,只有更邪恶才行...
|
能力值:
( LV12,RANK:760 )
|
-
-
12 楼
常规驱动写起来非常难,非常难~
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
冤枉啊,我只是贴出了一小部分代码呀。只是为了解决我的疑问 而已。
如果非要说泄露了些什么,也就是告诉大家 HOOK的 未导出 API名字而已 。不能说外传代码啊
我 把代码的 API名字相关部分做了修改
|
能力值:
( LV12,RANK:760 )
|
-
-
14 楼
可惜一丁点信息足够这些WS的人写出来一个类似的了~
|
能力值:
( LV12,RANK:1010 )
|
-
-
15 楼
又不是什么秘密的高不可攀的东西,懂点儿Inline Hook的,写出来不是问题.
关键是写个强大的通用的够猥琐的引擎不是很容易....
|
能力值:
( LV3,RANK:20 )
|
-
-
16 楼
信息还是应该交流的,藏着掖着不利于对抗,再说了,没有什么函数是王道
|
能力值:
( 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)//★ 这是什么含义
请师傅指点
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
这个不是神秘的代码,已经有人在用了
|
|
|