定位API的原理

参考:0Day 安全

  所有的win_32程序都会加载ntdll.dll和kerner32.dll这两个最基础的动态链接库。如果想要在win_32平台下定位kernel32.dll中的API地址

  1,首先通过段选择字FS在内存中找到当前的线程环境快TEB。

  2,线程环境快偏移位置为0x30的地方存放着指向进程环境块PEB的指针。

  3,进程环境块中偏移位置为0x0C的地方存放着指向PEB_LDR_DATA结构体的指针,其中,存放着已经被进程装在的动态链接库的信息。

  4,PEB_LDR_DATA结构体偏移位置为0x1C的地方存放着指向模块初始化链表的头指针InInitizationOrderModuleList.

  5,模块初始化链表InInitizationOrderModuleList中按顺序存放着PE装入运行时初始化模块信息,第一个链表结点是ntdll.dll,第二个链表结点就是kernel32.dll。

  6,找到属于kernel32.dll的结点后,在其基础上再偏移0x08就是kernel32.dll在内存中的加载基地址。

  7,从kernel32.dll的加载基址算起,偏移0x3C的地方就是其PE头。

  8,PE头偏移0x78的地方存放着指向函数导出表的指针。

  9,导出表0x1C处的指针指向存储导出函数偏移地址(RVA)的列表->导出表偏移0x20处的指针指向存储导出函数函数名的列表->函数的RVA地址和名字按照顺序存放在上述两个列表中,我们可以在名称列表中定位到所需的函数是第几个,然后在地址列表中找到对应的RVA—>获得RVA后,再加上前面已经得到的动态链接库的加载基址,就获得了所需API此刻在内存中的虚拟地址。

posted @ 2017-03-06 21:27  SenberHu  阅读(565)  评论(0编辑  收藏  举报