一些函数的使用

删除文件

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

int main()
{
BOOL a;
char Path_File[] = "C:\\Users\\政政真厉害\\Desktop\\111.txt";

a = DeleteFileA(Path_File);

printf("返回值:%d\n扩展错误信息%d\n", a, GetLastError());

//getchar();
return 0;
}
这里的DeleteFileA函数

image-20221124151936488

BOOL类型的返回值

image-20221124152036336

PS:这里写路径的时候不是”/“,这里要用”//“

image-20221124152247299

PS:GetLastError函数没有参数,所以括号内不填

image-20221124152522523

DLL程序1

#include "pch.h"

void ccc()
{
MessageBox(NULL, "导出函数被调用成功!", "信息:", MB_YESNO);
}

void aaa()
{
MessageBox(NULL, "加载成功!", "信息:", MB_YESNO);
}

void jiewei()
{
MessageBox(NULL, "卸载成功!", "信息:", MB_YESNO);
}

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//加载时要做的事
aaa();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
//结尾是要做的事

break;
}
return TRUE;
}

MessageBox函数

image-20221124152950137

image-20221124153212220

第一个参数一般是NULL

第二个参数为对话框要显示的内容

第三个是对话框的标题

第四个相当于取消和确定(一般选用画圈的)

image-20221124154209458

DLL程序2

#include "pch.h"


//main

//声明导出函数->把这个ccc函数导出去
extern "C" __declspec(dllexport) void ccc();


//用作导出函数:接口
void ccc()
{
MessageBox(NULL, "导出函数调用成功!", "信息:", MB_YESNO);
}

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;
}

一般我们用c++写代码的时候,有时需要用到c的格式,并且这个工程要作为一个动态库输出,这是后就要用到extern “C” __declspec(dllexport),这里也就是用C的形式声明导出函数->把这个ccc函数导出去

DLL程序3

#include<Windows.h>

/*
本程序是DLL导出函数和应用程序通讯的例子
*/


//调用静态库,从本目录调用 例如:D:\删除文件\Project1\x64\Debug
//#pragma comment(lib,"FirstDll")

//extern "C" void ccc();

//指向函数的指针
typedef void (*PMessage_Box)();


int main()
{

//将指定的模块加载到调用进程的地址空间中
HMODULE hModule = LoadLibrary("FirstDll.dll");

//判断句柄是否为空
if(hModule == NULL)
{
MessageBox(NULL, "句柄出错!", "标题:", MB_OK);
return -1;
}
//GetProcAddress从指定的动态链接库 (DLL) 检索导出函数ccc的地址
PMessage_Box pMsg = (PMessage_Box)GetProcAddress(hModule, "ccc");
//这里的(PMessage_Box)时进行类型的强制转换
//执行函数
pMsg();

return 0;
}
GetProcAddress函数

image-20221124154710022

第一个参数是HMODULE类型的DLL模块中的句柄

第二个参数是函数或变量名称

image-20221124154906969

LoadLibrary函数

image-20221124155916799

返回值类型为HMODULE

image-20221124160009475

image-20221124160725236

关于通讯

image-20221124160814982

image-20221124160848357

image-20221124160907538

注入DLL

#include<Windows.h>

void Inject(int pID, char* Path)
{
//LoadLibrary


//创建在另一个进程的虚拟地址空间中运行的线程;

//获取进程句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);

//申请一块内存给DLL路径
//指向要传递给线程函数的变量的指针
LPVOID pReturnAddress = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEM_COMMIT, PAGE_READWRITE);

//写入路径到上一行代码申请的内存中
WriteProcessMemory(hProcess, pReturnAddress, Path, strlen(Path) + 1, NULL);

//获取LoadLibraryA函数的地址
HMODULE hModule = LoadLibrary("Kernel32.dll");//Kernel32.dll是LoadLibraryA的库
LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "LoadLibraryA");

//创建远程线程并获取线程句柄
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, pReturnAddress, 0, NULL);

//等待线程事件
WaitForSingleObject(hThread, 2000);

//防止内存泄漏
CloseHandle(hThread);
CloseHandle(hProcess);

}

int main()
{
const char* a = "D:\\删除文件\\SecondDll\\x64\\Debug\\SecondDll.dll";
Inject(19604, (char*)a);//第一个参数是进程ID

return 0;
}