调用dll和编写dll的几种格式


title: 调用dll和编写dll的几种格式
date: 2019-08-27 19:11:22
tags:
- dll
categories: 编程

dll的写法

一共两种

全部写在dllmain函数内

extern "C" _declspec(dllexport)DWORD Sum(int nArg1,char*nArgv2)
{
	MessageBox(0,"this Sum call",0,MB_OK);
	return nArg1;
}

extern "C" 表示使用C的编译方式编译,C++格式

_declspec(dllexport)将一个函数申明为导出函数

就申明了一个导出函数

但是这中创建的dll的导出函数序号是连续的,我们不可控的。
也就是Base是1,然后符号表从1 开始。

2

项目新建
在这里插入图片描述
添加一个def文件
def中的代码

LIBRARY	"def导出函数Demo"
EXPORTS

test1 @1
test2 @5
test3 @8

dllmain中的代码

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"

void test3()
{
	MessageBox(0,"test3",0,MB_OK);
}

void test2()
{
	MessageBox(0,"test2",0,MB_OK);
}

void test1()
{
	MessageBox(0,"test1",0,MB_OK);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}


def里面定义的就是函数名和序号对应关系

在PE解析工具中,在AddressOfNameOrdinals 中对应的是减去Base的值,可以用这个值直接去AddressOfFunction 表中找到这个偏移,就能拿到这个函数在dll中的地址了

加载dll的几种方式

Demo1

创建空项目

main.c代码

#include "stdio.h"
#include <Windows.hc

int main()
{
	typedef void (*func)();
	HMODULE hMo = LoadLibrary("dll.dll");
	func T3 = (func)(GetProcAddress(hMo,"test3"));
	//func T3 = (func)(GetProcAddress(hMo,MAKEINTRESOURCE(8)));
	T3();
} 

Demo2

main.c代码

#include "stdio.h"
#include <Windows.h>

int main()

{
	int(*func)();
	HMODULE hMo = LoadLibrary("dll.dll");
	(FARPROC*)func = GetProcAddress(hMo,"test3");
	//(FARPROC*)func = GetProcAddress(hMo, MAKEINTRESOURCE(8));
	func();
}

以序号查找导出函数地址 使用关键字 MAKEINTRESOURCE()括号中值填序号表中对应值+Base
例如你要导入上面dll 序号为8的函数
这里假如基值为1

  • 第一步,找到序号表的VA,遍历序号表
  • 第二步,当序号表对应的值+1=8时,这里面的值7就是你要找到的函数符号了
  • 第三步,拿这个符号表中的值(7),在地址表中对应偏移就是这个函数地址了(地址表VA+4*7,这个地址你要找以8为序号导出函数的地址)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值