首先把dll调起来看看
方法一
自己写loadlibrary()和GetProcAddress()来加载dll。
编写有一个导出函数的测试 的 A.dll
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
extern "C" _declspec(dllexport)DWORD Sum(int nArg1,char*nArgv2)
{
MessageBox(0,"this Sum call",0,MB_OK);
return nArg1;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0,"The DLL_PROCESS_ATTACH...",0,MB_OK);
break;
case DLL_THREAD_ATTACH:
MessageBox(0,"The DLL_THREAD_ATTACH...",0,MB_OK);
break;
case DLL_THREAD_DETACH:
MessageBox(0,"The DLL_THREAD_DETACH...",0,MB_OK);
break;
case DLL_PROCESS_DETACH:
MessageBox(0,"The DLL_PROCESS_DETACH:...",0,MB_OK);
break;
}
return TRUE;
}
编译后到ida中看看他的导入表
双击看看结构
注意这里的个call的方法
我们这里编写一个load.exe来加载上面的A.dll
#include "windows.h"
//定义dll中要用的函数
typedef unsigned int (*Sum)(int nArg1, char *nArgv2);
int main()
{
//加载dll
HMODULE Hmo = LoadLibraryA("A.dll");
//获取函数地址
Sum Abo = (Sum)GetProcAddress(Hmo,"Sum");
//调用函数
Abo(1,NULL);
return 0;
}
我们可以使用OD或x64dbg来调试看看
调试前可以先把exe的地址随机化关了。
用010edit打开load.exe十六进制搜索40 81,改为 00 81,保存就OK了
执行到main函数,看到了这个load dll的地方
loadLibrary()返回地址在eax中
获取到函数地址后
开始真正调用执行这个dll中的函数了,接着F7进去就是DLL中的代码了。
方法二
直接拖进OD,这样只能调试dll的入口函数。