#include <Windows.h>
#include <stdio.h>
#include "tlhelp32.h"
void
Inject(
int
pID,
char
* Path)
{
HANDLE
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
LPVOID
pReturnAddress = VirtualAllocEx(hProcess, NULL,
strlen
(Path) + 1, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pReturnAddress, Path,
strlen
(Path) + 1, NULL);
HMODULE
hModule = LoadLibrary(
"KERNEL32.DLL"
);
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);
}
HMODULE
GetProcessModuleHandleByName(
DWORD
pid,
LPCSTR
ModuleName)
{
MODULEENTRY32 ModuleInfo;
HANDLE
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
if
(!hSnapshot)
{
return
0;
}
ZeroMemory(&ModuleInfo,
sizeof
(MODULEENTRY32));
ModuleInfo.dwSize =
sizeof
(MODULEENTRY32);
if
(!Module32First(hSnapshot, &ModuleInfo))
{
return
0;
}
do
{
if
(!lstrcmpi(ModuleInfo.szModule, ModuleName))
{
CloseHandle(hSnapshot);
return
ModuleInfo.hModule;
}
}
while
(Module32Next(hSnapshot, &ModuleInfo));
CloseHandle(hSnapshot);
return
0;
}
DWORD
GetProcessIDByName(
const
char
* pName)
{
HANDLE
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if
(INVALID_HANDLE_VALUE == hSnapshot) {
return
NULL;
}
PROCESSENTRY32 pe = {
sizeof
(pe) };
for
(
BOOL
ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {
if
(
strcmp
(pe.szExeFile, pName) == 0) {
CloseHandle(hSnapshot);
return
pe.th32ProcessID;
}
}
CloseHandle(hSnapshot);
return
0;
}
void
UnInject(
int
pID,
char
* Path)
{
HANDLE
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID);
LPVOID
pReturnAddress = GetProcessModuleHandleByName(GetProcessIDByName(
"代码注入器.exe"
),
"mydll.dll"
);
HMODULE
hModule = LoadLibrary(
"KERNEL32.DLL"
);
LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule,
"FreeLibrary"
);
HANDLE
hThread = CreateRemoteThread(hProcess, NULL, 0, lpStartAddress, pReturnAddress, 0, NULL);
WaitForSingleObject(hThread, 2000);
CloseHandle(hThread);
CloseHandle(hProcess);
}
int
main()
{
const
char
* a =
"C:\\Users\\86186\\Desktop\\mydll.dll"
;
HANDLE
hToken = NULL;
int
hRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
if
(hRet)
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp,
sizeof
(tp), NULL, NULL);
CloseHandle(hToken);
}
DWORD
addrfun = GetProcAddress(LoadLibrary(
"ntdll.dll"
),
"ZwUnmapViewOfSection"
);
printf
(
"%x \n\n"
, addrfun);
DWORD
dwOldProtect;
VirtualProtectEx(OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcessIDByName(
"代码注入器.exe"
)), addrfun, 6, PAGE_EXECUTE_READWRITE, &dwOldProtect);
BYTE
shellcode[] = { 0xc2, 0x08 , 0x00 , 0x90 , 0x90 };
WriteProcessMemory(OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcessIDByName(
"代码注入器.exe"
)), addrfun, shellcode, 5, NULL);
UnInject(GetProcessIDByName(
"代码注入器.exe"
), (
char
*)a);
BYTE
Oldcode[] = { 0xB8, 0x27 , 0x00 , 0x00 , 0x00 };
WriteProcessMemory(OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetProcessIDByName(
"代码注入器.exe"
)), addrfun, Oldcode, 5, NULL);
getchar
();
return
0;
}