卸载dll
在注入dll后,类似于火绒剑这种安全软件,肯定会查到注入,所以这里肯定要卸载dll来防止被发现
自加自卸载
对于自己的程序自己添加,自己卸载dll还是比较轻松,只需要一个FreeLibrary的API就好了下面直接上源代码
#include"vs_plugin_charu.h"
#include<Windows.h>
#include<stdio.h>
typedef void(*p)();
int main()
{
HMODULE hModule = LoadLibrary("vs_plugin_charu_dll");
if (hModule == NULL)
{
MessageBox(NULL, TEXT("加载dll出错"), TEXT("加载dll"), MB_OK);
return -1;
}
p msg = (p)GetProcAddress(hModule,"charu_dll_test");
msg();
FreeLibrary(hModule);
getchar();
return 0;
}
加载dll后用FreeLibrary直接卸载掉自己的dll
卸载任意的dll
这里的原理是利用到了远程注入dll和FreeLibrary函数来处理。
首先需要的是远程注入dll,然后再执行FreeliBrary函数,但是FreeLibrary函数需要的参数是句柄,所以这里采用CE来查找dll的地址来处理,这里其实是涉及到了多进程的处理,具体的可以查看下在visual下写多线程的教程
void UnInjectDLL(int pid)
{
//获取进程句柄,得到进程的所有权限,不用在进程中创建子进程来获取句柄所以第二个参数传NULL就好
//第三个表示进程的ID
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
//获取要卸载的函数句柄charu_dll_test
//获取LoadLibraryA的dll
HMODULE hModule = LoadLibrary(TEXT("Kernel32.dll"));
//将kernel32.dll中的LoadLibraryA函数的地址获取
//获取kernel32.dll中的FreeLibrary函数的I值
LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "FreeLibrary");
LPTHREAD_START_ROUTINE pReturnAddress = 0x00000;//这里写函数的地址
//申请一块虚拟内存的地址给传入的函数参数来处理,然后还需要给参数赋值
//相当于申明一个变量后还要给变量赋值才能使用
// LPVOID pReturnAddress = VirtualAllocEx(hProcess, NULL, strlen(path) + 1, MEM_COMMIT, PAGE_READWRITE);
// WriteProcessMemory(hProcess, pReturnAddress, path, strlen(path) + 1, NULL);
//创建远程线程
//第一个参数表示进程句柄,第二个第三个采用默认值处理
//第四个参数表示要调用的函数地址
//第五个参数表示第四个参数要调用的函数的参数
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, pReturnAddress, 0, NULL);
}
卸载Foxit阅读器dll
首先查看Foxit有哪些dll
就选这个ntdll.dll好了,删掉后福瑞没了,说明这个还真不能卸载掉