Loading

寻找未导出函数的函数地址

今天读了一篇 如何寻找未导出函数的函数地址的文章,重在思路吧,万一以后用到了呢?

why?

内核里有些函数直接导出了,那我们可以直接通过函数名调用它,未导出函数也不是不可以调用,我们需要自己找到函数名称所对应的地址即可。

How?

文章涉及3个函数:

  1. PsTerminateSystemThread
  2. PspTerminateThreadByPointer
  3. 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

posted @ 2016-04-19 13:50  Lnju  阅读(1827)  评论(0)    收藏  举报