嗨大家好我是Andy,今天來到了第十九天,我們今天要繼續昨天的強制卸載DLL,由於看到一個蠻新奇的東西所以加增一集,今天突然好像變得有點熱?!把鐵人賽排在最後一個行程果然是不明智的選擇,好了廢話不多說直接進入今天的主題。
#include <Windows.h>
#include <stdio.h>
#include <iostream>
void inject(int PID, char* Path) {
//獲取進程句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
//申請一個記憶體給Path
LPVOID Return = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEM_COMMIT, PAGE_READWRITE);
//寫入到VirtualAllocEx申請的記憶體內
WriteProcessMemory(hProcess, Return, Path, strlen(Path) + 1, NULL);
//LoadLibrary的函數庫
HMODULE hModule = LoadLibrary("Kernel32.dll");
LPTHREAD_START_ROUTINE lpStartAddress = LPTHREAD_START_ROUTINE(GetProcAddress(hModule, "LoadLibraryA"));
CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, Return, 0, NULL);
}
void Del(int PID) {
//獲取進程句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
//申請一個記憶體給Path
LPVOID Return = (LPVOID)0x7C590000;
//LoadLibrary的函數庫
HMODULE hModule = LoadLibrary("Kernel32.dll");
LPTHREAD_START_ROUTINE lpStartAddress = LPTHREAD_START_ROUTINE(GetProcAddress(hModule, "FreeLibrary"));//77609040
CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, Return, 0, NULL);
}
int main() {
int a,pid;
pid = 17352;
const char* p = "D:\\鐵人賽DLL\\Dll5\\Debug\\Dll5.dll";
while (std::cin >> a) {
if (a == 1)
inject(pid, (char*)p);
else if (a == 2)
Del(pid);
}
return 0;
}
這是之後會使用到的,雖然還沒完全打完哈哈哈
首先我們先看到LPTHREAD_START_ROUTINE(GetProcAddress(hModule, "FreeLibrary"));//77609040這串
為甚麼我會在後面打上77609040呢
因為前幾天我們講過CE如何去操作觀測DLL那這次我們可以利用這個功能去找在DLL裡面FreeLibrary被分布在哪個記憶體
而在程式碼的部分我們可以直接省略那行在最後面CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, Return, 0, NULL);的lpStartAddress地方直接換成(LPTHREAD_START_ROUTINE)0x77609040就可以調用FreeLibrary函數了
其他的部分大家也可以試試看
鐵人賽已經快要最後10天了,前面辛苦了許多天,這時候說放棄也不是說繼續也沒時間,哀時間在走壓力要有,今天的部分我們就先到這裡了,感謝大家觀看,我們明天見。