概述
取得 KERNEL32.DLL 位置的一种方法
2009-10-7编辑
在代码插入运行时,常常要知道 kernel32.dll 的位置,进而获得 GetProcAddress 的地址,最近看了以前的一篇《从 PEB 中取出 MODULENAME 》的文章,想想可以通过这种方法获得 kernel32.dll 的地址。下面是 delphi7 下 BASM 编写的一个过程。
function GetKernel32Base: ULONG; stdcall; asm PUSH EBX PUSH ESI PUSH EDI
// 设置 DLL 名称的地址。 CALL @APINAME DB 'k', 0, 'e', 0, 'r', 0, 'n', 0, 'e', 0, 'l', 0, '3', 0, '2', 0, '.', 0, 'd', 0, 'l', 0, 'l', 0 @APINAME: POP EDX
// 取 PET 表中的加载模块名 MOV EAX, FS:[$30] MOV EAX, [EAX + 12] //EAX = PEB_LDR_DATA
MOV EBX, EAX + 12 //EBX 为 PEB_LDR_DATA 的 InLoadOrderModuleList MOV EAX, [EBX] // 第一个 LDR_MODULE
@NEXTMODULE: CMP EAX, EBX JZ @GETERROR
// 下面字符串进行比较。 XOR ECX, ECX MOV CX, [EAX + 44] // 获得 NAME 的长度。 SHR ECX, 1 // 由于是 WCHAR, 长度减半。 MOV ESI, [EAX + 48] // 名称地址。 MOV EDI, EDX CLD REPZ CMPSW JCXZ @GETOK
MOV EAX, [EAX] // 下一个模块。 JMP @NEXTMODULE
@GETERROR: XOR EAX, EAX JMP @GETOVER @GETOK: MOV EAX, [EAX + 24]
@GETOVER: POP EDI POP ESI POP EBX end; |
2009-10-7补充:
其实网络上早就有这种方法了,只不过它更特别,因为按初始化顺序链表( InInitializationOrderModuleList )中,第一个模块为NTDLL.DLL,第二个为KERNEL32.DLL,所以它省去了我上面的比较名称的过程,直接将第二个链表单元的地址返回就是了。下面为BASM代码片段:
asm
mov eax, fs:$30
mov eax, [eax + $c]
mov eax, [eax + $1c]
mov eax, [eax]
mov eax, [eax + 8]
mov a, eax
end;
最后
以上就是俊逸大地为你收集整理的取得KERNEL32.DLL位置的一种方法的全部内容,希望文章能够帮你解决取得KERNEL32.DLL位置的一种方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复