程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Windos_Hook_動態鏈接庫-CreateDllDemo ——第一課 _Po學校,-createdlldemo_po

Windos_Hook_動態鏈接庫-CreateDllDemo ——第一課 _Po學校,-createdlldemo_po

編輯:C++入門知識

Windos_Hook_動態鏈接庫-CreateDllDemo ——第一課 _Po學校,-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老師課講得非常好 通俗易懂而且非常詳細!

   看這麼多視頻 , 就聽mark老師的課不會犯困  哈哈

 

歡迎加 c++討論群484983958  免費領視頻哦  來 編程/黑客 愛好者

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved