取得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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值