今天读了一篇 如何寻找未导出函数的函数地址的文章,重在思路吧,万一以后用到了呢?
why?
内核里有些函数直接导出了,那我们可以直接通过函数名调用它,未导出函数也不是不可以调用,我们需要自己找到函数名称所对应的地址即可。
How?
文章涉及3个函数:
- PsTerminateSystemThread
- PspTerminateThreadByPointer
- PspExitThread
这3个函数的关系是,1调用了2,2调用了3。我们的目标是获得函数3的地址,以便我们直接调用它。其中PsTerminateSystemThread是已导出函数,这一以为着在我们的代码中可以直接通过PsTerminateSystemThread
来得到函数地址。那该如何下手呢?
思路来了:通过反汇编导出函数,找到调用未导出函数之前的字节码作为特征,从导出函数地址开始,搜索特征码,可以得到未导出函数的地址。以从函数1找到函数2地址为例来说。
lkd> uf nt!PsTerminateSystemThread
nt!PsTerminateSystemThread:
805d2c36 8bff mov edi,edi
805d2c38 55 push ebp
805d2c39 8bec mov ebp,esp
805d2c3b 64a124010000 mov eax,dword ptr fs:[00000124h]
805d2c41 f6804802000010 test byte ptr [eax+248h],10h
805d2c48 7507 jne nt!PsTerminateSystemThread+0x1b (805d2c51)
nt!PsTerminateSystemThread+0x14:
805d2c4a b80d0000c0 mov eax,0C000000Dh
805d2c4f eb09 jmp nt!PsTerminateSystemThread+0x24 (805d2c5a)
nt!PsTerminateSystemThread+0x1b:
805d2c51 ff7508 push dword ptr [ebp+8]
805d2c54 50 push eax
805d2c55 e828fcffff call nt!PspTerminateThreadByPointer (805d2882) //注意这里
nt!PsTerminateSystemThread+0x24:
805d2c5a 5d pop ebp
805d2c5b c20400 ret 4
那么我们通过找特征码 ff 75 08 50 e8
就能找到接下来的28fcffff
通过地址计算,就能找到PspTerminateThreadByPointer.公式如下:
0x805d2c56 + 0xfffffc28 + 4 = 0x805d2882(nt!PspTerminateThreadByPointer)
再通过nt!PspTerminateThreadByPointer函数,找到PspExitThread