能力值:
( LV2,RANK:10 )
|
-
-
76 楼
看了一篇LZ的代码,竟然看懂了!内核重载原来是这么一回事!
试运行了一下,发现有错误:
if (!strcmp((char*)PsGetCurrentProcess()+0x174,"cheatengine-i38"))
{
return pNewSSDT->ServiceTableBase[FuncIndex];
}
在return pNewSSDT->ServiceTableBase[FuncIndex];这里出错了
b85c0550 8b11 mov edx,dword ptr [ecx]
1: kd> r ecx
ecx=00000000
怎么回事?
|
能力值:
( LV4,RANK:50 )
|
-
-
77 楼
完整的重定位应该是介样子的吧。
kd> u IoCreateFile la
nt!IoCreateFile:
8057791c 8bff mov edi,edi
8057791e 55 push ebp
8057791f 8bec mov ebp,esp
80577921 83ec0c sub esp,0Ch
80577924 53 push ebx
80577925 56 push esi
80577926 33f6 xor esi,esi
80577928 8975fc mov dword ptr [ebp-4],esi
8057792b 8b1db8a05580 mov ebx,dword ptr [nt!ExHotpSyncRenameSequence (8055a0b8)]
80577931 f6c301 test bl,1
kd> u 0xe2ad591c la
e2ad591c 8bff mov edi,edi
e2ad591e 55 push ebp
e2ad591f 8bec mov ebp,esp
e2ad5921 83ec0c sub esp,0Ch
e2ad5924 53 push ebx
e2ad5925 56 push esi
e2ad5926 33f6 xor esi,esi
e2ad5928 8975fc mov dword ptr [ebp-4],esi
e2ad592b 8b1db880abe2 mov ebx,dword ptr ds:[0E2AB80B8h]
e2ad5931 f6c301 test bl,1
你用了原内核的基址来重定位才会变成
8b1db8a05580 mov ebx,dword ptr [nt!ExHotpSyncRenameSequence (8055a0b8)]
介个介个,是不是内核初始化的时候还有些数据我们重载的没有才这样做呢?还是导入表就懒得自己去加载? 介样子好像会在新内核跟原内核之间跳来跳去的,有可能有些函数还没hook了
|
能力值:
( LV2,RANK:10 )
|
-
-
78 楼
*uRelocAddress=*uRelocAddress+(OrigImage-OriginalImageBase);中OriginalImageBase 是imagebase但是OrigImage这个是什么?看你的源码是定义的是804D8000
|
能力值:
( LV12,RANK:400 )
|
-
-
79 楼
我用的测试机是XP,估计你是用的win7吧?
|
能力值:
( LV12,RANK:400 )
|
-
-
80 楼
自己加载 的内核文件因为没有运行,所以全局变量这些都没得到初始化,因此只能用老内核的全局变量。
|
能力值:
( LV12,RANK:400 )
|
-
-
81 楼
这个是原来的内核文件加载的地址,因为我发现XP下这个地址不会变,就没有用其它方法去获取 ,win7下就不行了,win7下需要动态获取这个加载 地址。
|
能力值:
( LV2,RANK:10 )
|
-
-
82 楼
原来的内核文件地址减imagebase不明白什么意思?
|
能力值:
( LV12,RANK:400 )
|
-
-
83 楼
就是为了获得相对地址。
|
能力值:
( LV2,RANK:10 )
|
-
-
84 楼
LZ我研究了一个下午,我的是xp sp3的系统,出错的地方只是开了CE就出错了,全局的pNewSSDT竟是空的!
0: kd> dd pNewSSDT
b85e5290 00000000 805cc3fc 8054260a 00000000
但是我明明检查过不是空的,真是搞不明。
你的openprocess被调用一次后就被你还原了。所以只有CE是用新内核。如果不崩那说明重载的内核正常运行了!
这个BUG我再研究下
|
能力值:
( LV2,RANK:10 )
|
-
-
85 楼
应该是原内核加载地址和新内核加载地址的差值吧。获得需要重定位地址处的值加上这个差值就是重定位后的值。
|
能力值:
( LV2,RANK:10 )
|
-
-
86 楼
Mark… ^O^。
|
能力值:
( LV4,RANK:50 )
|
-
-
87 楼
学习了。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
88 楼
LZ的代码终于运行正常了!原来是我用了别的内核~~~而LZ的内核是写死的
写个hook验证是否成功了用了很多时间~~~真是太强大了重载内核!!无视Hook啊!重载内核,用pchunter也只看到一个hook,就查不到别的痕迹了!
那这个kifastcallentry应该是兵家必争之地啊,那检测内核重载,是不是只能检测kifastcallentry是否被hook了?
|
能力值:
( LV2,RANK:10 )
|
-
-
89 楼
LZ你好,请教 一个问题,我发现你的代码,没有对NT的导入和导出表进行处理啊,为什么这样都能正常运行?难道ntopenprocess,ntreadvirtualmemory这些函数都没有用到别的模块的?
我发现nt也有用到别的模块 啊,好像hal.dll,kdcom.dll ,不用处理的吗百思不得其解啊
|
能力值:
( LV12,RANK:400 )
|
-
-
90 楼
呵呵,你真是用心了。其实 很多问题我也在继续学习中,还得向各位大牛请教。
|
能力值:
( LV2,RANK:10 )
|
-
-
91 楼
绝世好文!!!
|
能力值:
( LV3,RANK:20 )
|
-
-
92 楼
mark。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
93 楼
HOOK KiFastCallEntry,让RING3进程调用走新内核!!如果安装了360安全卫士,除了卸载,又该怎么办呢?
|
能力值:
( LV12,RANK:400 )
|
-
-
94 楼
还有其它方法可以实现这个功能的,不一定非要hook KiFastCallEntry,具体方法你自己在网上找一下吧。
|
能力值:
( LV5,RANK:60 )
|
-
-
95 楼
楼主可以再考虑下,导入表,导出表,ntos中全局变量的最后会落实到那个模块这些问题。。重载个内核不难,究竟哪些东西走的新内核才是要思考的地方啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
96 楼
虽然看不懂 还是先留个名吧
|
能力值:
( LV2,RANK:10 )
|
-
-
97 楼
非常不错的文章,试了下,有效果。但是不是只有ssdt表中的函数才会走新内核?如果其它未导致出的函数也要走新内核要怎么做?
|
能力值:
( LV2,RANK:10 )
|
-
-
98 楼
好学习资料啊 mark一下
|
能力值:
( LV2,RANK:10 )
|
-
-
99 楼
mark一下,以后再看
|
能力值:
( LV7,RANK:100 )
|
-
-
100 楼
好文章,学习了,目前正在学习这块,楼主的文章正好解疑了,谢谢楼主
|
|
|