帮忙看看这段win32 汇编代码.
;**************************************************
;函数功能:查找 Kernel32.dll 的基地址
;**************************************************
GetKernelBase proc uses esi edi dwKernelRet:DWORD
LOCAL dwReturn: DWORD
mov edi, dwKernelRet ; edi = 堆栈顶
and edi, 0ffff0000h ; 用 AND 获得初始页
.while TRUE
.if word ptr [edi] == IMAGE_DOS_SIGNATURE ; 等于“MZ”吗?
mov esi, edi ; Yes, next...
add esi, [esi + IMAGE_DOS_HEADER.e_lfanew] ; 就是 esi + 3ch
.if word ptr [esi] == IMAGE_NT_SIGNATURE ; 等于“PE”吗?
mov dwReturn, edi ; Yes, we got it.
.break
.endif
.endif
;以下等同于sub edi, 010000h,即每次减少64k:
dec edi
xor di, di
.break .if edi < 070000000h ; 基地址一般不可能小于70000000h
.endw
mov eax, dwReturn
ret
GetKernelBase endp
问题:
//此代码如何就找到了kernel32.dll的基地址了???
//按理应该有和"kernel32.dll"字符串比较的代码吧? 难道内存映射空间中第一个PE格式的文件就是kernel32.dll?
原文地址: http://www.luocong.com/articles/show_article.asp?Article_ID=23