Windos_Hook_动态链接库-CreateDllDemo ——第一课 _Po学校

第一课:来源于_ Po学校 
动态链接库

extern "C"//把c++函数转换成c的方式 (也就是函数名不惨料)

概念 :

(窗口)
findwindow ---存在于 Uer32.dll
kernel32.dll (内核)

当代码用到dll的时候 用它的copy指向 达到节约内存

dll是一个能被其他程序加载的程序 (如可以让QQ加载自己写的dll)
操作系统对任何的动态链接库,只会保存一份 (修改将会是全局的)

dll能进行动态调节、动态进行加载

/////////////

Dllmain //打破只能被调用的命运,从此掌握主动大权
主动:
case DLL_PROCESS_ATTACH: //被其他程序加载的时候
case DLL_THREAD_ATTACH: //当其他程序有新线程启动的时候
case DLL_THREAD_DETACH: //当其他程序某个线程终止(卸载)的时候
case DLL_PROCESS_DETACH: //被其他程序卸载

由于ascii不能表示中文,所以就有了unicode,utf-8之类的多字节的字符 L宏就是把ascii的字符串转成多字节的。

MessageBox(NULL, L"DLL被加载!被线程加载", L"I Love..!", MB_OK); //这句是创建小对话框的

因为dll只能被其他程序加载, 所以不能直接按F5调试 或设为启动项目即可

注意: //先找当前文件夹-》如果当前文件夹没有-》我们就去system32下查找-》64位 windows/system32 // 32位 windows/SysWoW64

360检测不到SysWOW64

//user32.dll -> 如果我在他的本地文件里建立一个假的user32.dll -》 他会不会加载这个假的dll
//这是DLL劫持 据说以前用的很多

------------------
DLL导出函数 、 内部函数

DLL导出函数----》 新建一个项目 dll 勾选导出

加载里面的int fnDllExportDemo(void)函数 HMODULE hModule=::LoadLibrary(L"DllExprotDemo.dll"); //加载的时候写上名字就可以了

使用fnDllExportDemo(void)函数的两种方法:

=======================================================================================
1.动态链接---
typedef int(*FUNC)(void);//这是一个函数类型
先要知道它的原型:

//HMODULE相当于当前这个dll的身份证号 定位到dll上面 //L宏就是把ascii的字符串转成多字节的。
HMODULE hModule=::LoadLibrary(L"DllExprotDemo.dll"); //加载的时候写上名字就可以了
//先找当前文件夹-》如果当前文件夹没有-》我们就去system32下查找-》64位 windows/system32 // 32位 windows/SysWoW64

if (hModule == NULL) //当加载不到dll的时候 hModule的值会为空
{
MessageBox(NULL, L"加载DLL失败!", L"I Love mark!",MB_OK);
}

FUNC dllFunc=(FUNC)::GetProcAddress(hModule, "fnDllExprotDemo");//使用windows的API:GetProcAddress 获得句柄(把要使用的函数名传进去 会返回一个指针,用刚定义的接住),强转
printf("%d", dllFunc()); //调用 :比如printf 跟普通函数一毛一样

//当前使用的是c++编译出来的, 它有一个命名粉碎机制
//也就是 c++支持重载,它将你所有的函数名称都加点料
//要使用 得用c的方式进行编译 在

//DLLEXPROTDEMO_API int fnDllExprotDemo(void); //(DLLEXPROTDEMO_H目录下)
//更改成:
extern "C" DLLEXPROTDEMO_API int fnDllExprotDemo(void);

========================================================================================
2.静态链接---

1.拷贝它的头文件 ,放在要使用它的工程下面 (当前的也就是LoadDllDemo)
2.拷贝它的.lib ,也放在要使用它的工程下面
3.包含头文件 #include"DllExportDemo.h" #pragma comment(lib,"DllExportDemo.lib")
然后就可以直接调用了 printf("%d",fnDllExportDemo());

typedef int(*FUNC)(void);//这是一个函数类型

//当前使用的是c++编译出来的, 它有一个命名粉碎机制

//也就是 c++支持重载,它将你所有的函数名称都加点料
//要使用 得用c的方式进行编译 在

//DLLEXPROTDEMO_API int fnDllExprotDemo(void);
//更改成:
extern "C" DLLEXPROTDEMO_API int fnDllExprotDemo(void);

------------------------------------------------------------------------------------------------
CreateProcess function //创建进程函数
-----

//当前使用的是c++编译出来的, 它有一个命名粉碎机制
//也就是 c++支持重载,它将你所有的函数名称都加点料
//要使用 得用c的方式进行编译 在

//DLLEXPROTDEMO_API int fnDllExprotDemo(void);
//更改成:
extern "C" DLLEXPROTDEMO_API int fnDllExprotDemo(void);

---------------------------------
小结:导出函数 无论用哪种方式 都要用extern "C"方式编译

extern"C"  EXPORTDLL_API int fnExportDll(void);	//c模式

#include "stdafx.h"
#include<Windows.h>
#include"ExportDll.h"
#pragma comment(lib,"ExportDll.lib")

typedef int(*FUNC)(void);	//
int main()
{
	//HMODULE hModule = ::LoadLibrary(L"Practicedll_1.dll");	//加载 (这个呢,是没有导出的)
	HMODULE hModule=::LoadLibrary(L"ExportDll.dll");	//加载	(导出的)
	if (hModule == NULL) {
		MessageBox(NULL, L"加载失败", L"Mark", MB_OK);
	}
	//printf("%d", fnExportDll());	//静态导出的 (.h 和lib拷贝到执行程序下)

	//********以下是动态链接
	FUNC dllFunc = (FUNC)::GetProcAddress(hModule, "fnExportDll");// 使用windows的API:GetProcAddress 获得句柄 (会返回一个指针)
	printf("%d", dllFunc());
    return 0;
}

  

感谢鹿鸣老师,还有Linda老师 ,还有Mark老师课讲得非常好 通俗易懂而且非常详细!

欢迎加 c++讨论群484983958

时间: 2024-11-06 09:56:24

Windos_Hook_动态链接库-CreateDllDemo ——第一课 _Po学校的相关文章

【Linux探索之旅】开宗明义+第一部分第一课:什么是Linux?

内容简介 1.课程大纲 2.第一部分第一课:什么是Linux? 3.第一部分第二课预告:下载Linux,免费的噢!   开宗明义 我们总听到别人说:Linux挺复杂的,是给那些追求逼格的程序员用的.咱们老百姓呀,用用Windows就高兴. 但事实并非如此,Linux不是那么“难于上青天”的. 不少学编程的朋友看过<鸟哥的Linux私房菜>,是台湾的鸟哥写的,非常棒. 小编也开始写一个系列教程,希望对自己对别人都有帮助.但我会非常认真的,不会乱来. 在这个教程中,小编会向您证明:Linux并不复

【C语言探索之旅】 第三部分第一课:SDL开发游戏之安装SDL

内容简介 1.课程大纲 2.第三部分第一课: SDL开发游戏之安装SDL 3.第三部分第二课预告: SDL开发游戏之创建窗口和画布 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串

于航特训课:第一课

[主办单位] 蓝桥杯全国软件和信息技术专业人才大赛组委会 [课程时间] 3月4号-3月31号 [特训内容] 7次算法课,大赛特邀专家精讲历届真题及高频算法 直至赛前,资深算法老师群内作业辅导和答疑 全国参赛小伙伴互助带打 第2次课<递归原理与构造技巧>开课时间:2018年3月7日晚上7:30 [课程简介] <2018蓝桥杯大赛算法特训>是应广大考生需求,由蓝桥杯全国软件和信息技术专业人才大赛组委会主办,聘请大赛资深顾问专家团成员之一于航老师,通过"图文+音视频"

sql第一课笔记

这是我看了imooc的视频教程之后重新写的笔记. 虽然之前也是学习过SQL Server数据库,但是也是忘记得差不多了.现在重新捡起来,安装一次数据库练习,使用的是mysql. 第一课是最简单的创建,修改,查看,删除数据库: mysql 有密码之后在命令行登陆 用的是 shell>mysql -u root -p; 提示输入密码: 登陆成功之后,把提示符mysql变成以当前计算机帐户名@主机名 当前数据库的格式:prompt \[email protected]\h \d> prompt命令下

OpenCV 第一课(安装与配置)

OpenCV 第一课(安装与配置) win10,opencv-2.4.13, 安装, vs2013, 配置 下载安装软件 官网OpenCV下载地址下载最新版本,我下载的是opencv.2.4.13,然后解压安装,我写的路径是D:\Program Files.注意本文中绿色标注的要换成你自己的安装路径. 这里得说一点,可能是因为网速太差的原因,昨天晚上下载了几次安装时都提示说"cannott open file'opencv-2.4.13.exe' as archive".我当时一直不明

读书笔记 - 《格鲁夫给经理人的第一课》

这本书对我的启发远远超过其它的企业管理类图书,不愧是资深前辈写的书.虽然名为第一课,实际上对于中层经理人来说,已经不再需要第二课了.这本书从简单的早餐店开始,讲解了管理杠杆率.开会.决策.规划.矩阵组织.激励.绩效.招人.薪酬.培训,以浅显的语言讲解了几乎是一个中层经理人所需理解的全部工作,使我对工作的认识有了大幅度提高,已经基本可以摆脱漫无头绪的状态!这本书准备丢在公司,没事就翻看思考一下,在实践中继续深入领悟!

VC++编程之第一课笔记

第一课 Windows程序内部运行原理 API 操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用.这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API. 如Create Window就是一个API函数,应用程序调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口. MSG(消息结构体) 结构体定义如下: typedef s

EasyUI入门第一课

首先下载easyUI,最好是最新的,然后新建一个空web程序或是网站,不废话,代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="JqueryEasyUI.WebForm1" %> <!DOCTYPE html> <html xmlns="http://ww

第一课 C语言简明教程

1序言: 1与Java.C#等高级语言相比,C语言却非常简单,学习简单,使用也简单,但是也非常重要,到目前为止基本上操作系统的内核代码超过百分之九十使用C语言完成,因此学好C语言是学好计算机这门课程的基础,特别是进入系统编程尤为明显. 今天是本人复习C语言课程的第一课,主要重新记录一下C语言的基础知识,这节课涉及到C语言的结构.变量以及类型.输入输出.条件判断以及循环知识. 2知识点: 2.1 C语言的结构 2.1.1 通常情况下C语言程序是由: 1.相关的代码注释,使用/* ··· */可注释