卸载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好了,删掉后福瑞没了,说明这个还真不能卸载掉