可执行程序调用dll过程的反编译

本文通过一个具体的C++示例介绍了如何加载DLL文件并调用其中的函数。重点讲解了使用LoadLibraryA和GetProcAddress的过程,并展示了对应的反汇编代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先来一段C++的调用dll源代码

	HINSTANCE hInstance=::LoadLibraryA("D:\\project\\dll\\Release\\dll.dll");
	typedef int(*fun)();
	fun hun=(fun)GetProcAddress(hInstance,"hehe");
	hun();
	int a=GetLastError();
	a++;
	

例子中的dll是我事先已经写好的,其反汇编代码是

.text:004017A0 ; void __thiscall CreverseDlg__OnBnClickedButton1(CreverseDlg *this)
.text:004017A0 ; void __thiscall CreverseDlg__OnBnClickedButton1(CreverseDlg *this)
.text:004017A0 ?OnBnClickedButton1@CreverseDlg@@QAEXXZ proc near
.text:004017A0                                         ; DATA XREF: .rdata:00403774o
.text:004017A0 this = ecx
.text:004017A0                 push    offset LibFileName ; "D:\\project\\dll\\Release\\dll.dll"
.text:004017A5                 call    ds:__imp__LoadLibraryA@4 ; LoadLibraryA(x)
.text:004017AB                 push    offset ProcName ; "hehe"
.text:004017B0                 push    eax             ; hModule
.text:004017B1                 call    ds:__imp__GetProcAddress@8 ; GetProcAddress(x,x)
.text:004017B7                 call    eax
.text:004017B7                 jmp     ds:__imp__GetLastError@0 ; GetLastError()
.text:004017B7 ?OnBnClickedButton1@CreverseDlg@@QAEXXZ endp

这样我们就知道了,对于一些不太理解的ds:__imp_LoadLibrary过程实际上是在调用库函数,其中有一个我们需要注意的是call eax 可以看出,GetProcAddress的返回值是在eax

当中而call  eax则是执行了库中的函数,反汇编的结果是在执行我们自己写的函数时是跟调用在可执行程序当中定义的函数是相同的,所以,我们怎么自己写,才会有

ds:__imp_Loadlibrary有待于我进一步学习,看来自己知道的还是太少啊,继续学习ing。。。至于没有a++,应该是被编译器优化掉了...

一、简介   AheadLib 是用来生成一个特洛伊DLL的工具,用于分析DLL中的函数参数调用(比如记录Socket send了什么等等)、更改函数功能(随心所欲了:)、更改界面功能(比如在Hook里面生成一个按钮,截获事件等等)。 二、使用   1.用 AheadLib 打开要模拟的 DLL,生成一个 CPP 文件。   2.用 Visual Studio 6.0/.NET 建立一个 DLL 工程,把这个 CPP 文件加入到项目中。   3.使用 Release 方式编译,生成的 DLL 将和原来的 DLL 具有一模一样的导出函数,并且能顺利把这些函数转发到原来的函数中。   4.AheadLib 还可以生成 Hook 代码,用于截取当前进程的所有消息,这样就可以随心所欲地处理各种消息了 (修改第三方程序界面功能的好助手)。 三、备注   1.如果导出函数过多,在 Visual Studio 6.0 中,如果出现编译错误,请在项目属性关闭与编译头功能。   2.如果是 C++ 、C __stdcall、C __fastcall 的方式导出的话,生成的函数声明将会还原成原代码级别(可能需要修改才能编译,比如导出C++类的情况)。此时使用 __declspec(dllexport) 导出 ——不能指定导出序号。   3.如果是 NONAME 或者 C _CDECL 方式导出(比如 DEF 导出,大多数Windows DLL都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/EXPORT:...)导出,且指定导出序号。   4.如果系统中没有 DbgHelp.dll,将无法识别 C++ 模式的导出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值