我是靠谱客的博主 俊逸大地,最近开发中收集的这篇文章主要介绍取得KERNEL32.DLL位置的一种方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

取得 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位置的一种方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部