如何动态获得程序加载地址

如何动态获得程序加载地址,第1张

一、需要的API函数分步阅读

1

/2

LoadLibrary函数的声明如下,它只有一个参数,指明要加载的动态库。

2

/2

GetProcAddress函数的声明如下,它有两个参数,一个是LoadLibrary函数返回的模块句柄,一个是要获取的函数名称。

二、动态加载动态库的实例

1

/7

这里以user32.dll中的MessageBox函数为例,开发环境使用vs2017。首先点击“文件”——“新建”——“项目”建立一个win32控制台程序。

2

/7

正常的使用MessageBox代码如下,直接调用即可。

//vs2017中的代码

#include <tchar.h>

#include <windows.h>

int main(){

MessageBox(0, _T("hello world!"), _T("MessageBox"), MB_OK)

return 0

}

3

/7

如果使用动态加载,则需要首先用LoadLibrary函数加载user32.dll。

4

/7

然后定义一个函数指针类型,用定义的函数指针类型定义函数指针。用于保存GetProcAddress()获取的MessageBox函数地址。

5

/7

然后通过GetProcAddress()获取其函数地址。

6

/7

最后通过函数指针调用MessageBox()函数即可。

好久没回答问题了 尝试一下

打开文件的办法

CHAR lpExeFilename[MAX_PATH] = ""

HINSTANCE hInstance = GetModuleHandle(NULL)

GetModuleFileName(hInstance, lpExeFilename, MAX_PATH)

HANDLE hFile = CreateFile(lpExeFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTES_NORMAL, NULL)

//todo:判断是否打开成功

CHAR lpBuffer[100]

ReadFile(hFile, ...)

//todo:处理固定偏移

CloseHandle(hFile)

以上是比较稳妥的办法 事实上如果对于进程的创建有一定理解的话

就应该知道GetModuleHandle(NULL)调用返回的就是进程文件加载到内存的地址了

完全可以这样得到首地址:

LPCSTR lpcBuffer = (LPCSTR)GetModuleHandle(NULL)

然后lpcBuffer[1] 就是你说的0x000000001了

手头没有调试器 个别地方可能有笔误 见谅


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7820026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存