帮忙看看这段win32 汇编代码.

redmond1245 2007-07-11 05:12:19
;**************************************************
;函数功能:查找 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
...全文
244 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
feimingbiao 2007-07-13
  • 打赏
  • 举报
回复
哦,另外这种技术Vista上不灵了,XP以前Known DLLs都是装载到固定地址,Vista就是为了防止这个随机了。所以不同进程Kernel32.dll的地址是不同的。
feimingbiao 2007-07-13
  • 打赏
  • 举报
回复
你的程序肯定是Kernel32的某个函数启动的,(比如BaseThreadIntThunk), 所以调用你main函数的肯定是在Kernel32的地址空间里面。 (你可以随便Debug一个程序,看看是谁调用的__mainCRTStartup就知道了,你这个是汇编程序,所以没有CRT这些东西,那么main的底下一定是Kernel32了)

所以,我估计调用应该类似:
main()
{
。。。。。
mov edi, [esp]
call GetKernelBase
}

这样edi就是InitThunk的地址,后16位清零,然后慢慢往回找。通常Known DLL装载时候都是64K对齐,所以几次就找到了。

combojiang 2007-07-12
  • 打赏
  • 举报
回复
呵呵,暴力搜索法,内存映射空间中第一个PE格式的文件不是kernel32.dll,因为暴力搜索法是从栈顶指向的内容开始找的。不需要有"kernel32.dll"字符串比较,根据windows 的特性来找的。
redmond1245 2007-07-12
  • 打赏
  • 举报
回复
楼上说的 "windows的特性"是指什么特性?
从栈顶找为什么第一个找到的不是其他PE文件? 比如说 user32.dll, 而是kernel32.dll?

谢谢!

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧