//App.cpp
#include "stdafx.h"
#include <windows.h>
#define MAX_SIZE 1024*16
#define DLL "D:/Code/TestCode/UnloadDll/UnloadDll/Debug/demo.dll" // 需要完整路径
HMODULE LoadRemoteLibrary(HANDLE hProcess,const char *pcLibraryName);
BOOL FreeRemoteLibrary(HANDLE hProcess, HMODULE hRemoteLibrary);
int main(int argc, char* argv[])
{
DWORD dwPID = 0;
HANDLE hNewHandle = NULL;
HMODULE hRemoteHandle = NULL;
int i=0;
if( argc < 2 )
{
return -1;
}
dwPID = atoi(argv[1]);
hNewHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID);
if( NULL == hNewHandle )
{
printf("[-] OpenProcess failed.../r/n");
return -2;
}
hRemoteHandle = LoadRemoteLibrary(hNewHandle,DLL);
if( NULL == hRemoteHandle )
{
printf("[-] LoadRemoteLibaray failed.../r/n");
return -3;
}
printf("[+] LoadRemoteLibaray succeed!/r/n");
for(i=0;i<=20;i++)
{
printf(".");
Sleep(100);
}
printf("/r/n");
if( FreeRemoteLibrary(hNewHandle,hRemoteHandle) == NULL )
{
printf("[-] FreeRemoteLibaray failed.../r/n");
return -4;
}
printf("[+] FreeRemoteLibrary succeed!/r/n");
return 0;
}
HMODULE LoadRemoteLibrary(HANDLE hProcess,const char *pcLibraryName)
{
void* pvRemoteMem=NULL;
DWORD dwBytesWritten;
HMODULE nRet=NULL;
DWORD dwRemoteThreadId;
HANDLE hRemoteThread=NULL;
__try
{
pvRemoteMem=VirtualAllocEx(hProcess,NULL,strlen(pcLibraryName)+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if (NULL == pvRemoteMem)
{
printf("[-] VirtualAllocEx failed.../r/n");
__leave;
}
if (FALSE == WriteProcessMemory(hProcess,pvRemoteMem,(void*)pcLibraryName,strlen(pcLibraryName)+1,&dwBytesWritten))
{
printf("[-] WriteProcessMemory failed.../r/n");
__leave;
}
hRemoteThread=CreateRemoteThread(hProcess,NULL,MAX_SIZE,(LPTHREAD_START_ROUTINE)
#ifdef UNICODE
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW"),
#else
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"),
#endif
pvRemoteMem,0,&dwRemoteThreadId);
if (NULL == hRemoteThread)
{
printf("[-] CreateRemoteThread failed.../r/n");
__leave;
}
else
{
__try
{
WaitForSingleObject(hRemoteThread,INFINITE);
GetExitCodeThread(hRemoteThread,(DWORD*)&nRet);
printf("ErrorCode:%d/r/n",GetLastError() );
}
__finally
{
CloseHandle(hRemoteThread);
}
}
}
__finally
{
if (NULL != pvRemoteMem)
VirtualFreeEx(hProcess,pvRemoteMem,0,MEM_RELEASE);
}
return nRet;
}
BOOL FreeRemoteLibrary(HANDLE hProcess, HMODULE hRemoteLibrary)
{
DWORD dwRemoteThreadId;
HANDLE hRemoteThread;
BOOL nRet;
hRemoteThread=CreateRemoteThread(hProcess,NULL,MAX_SIZE,
(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"), "FreeLibrary"),(void*)hRemoteLibrary,0,&dwRemoteThreadId);
if (NULL == hRemoteThread)
return FALSE;
WaitForSingleObject(hRemoteThread,INFINITE);
GetExitCodeThread(hRemoteThread,(DWORD*)&nRet);
return nRet;
}
Code:
#include "stdafx.h"
#include <windows.h>
#define MAX_SIZE 1024*16
#define DLL "D:/Code/TestCode/UnloadDll/UnloadDll/Debug/demo.dll" // 需要完整路径
HMODULE LoadRemoteLibrary(HANDLE hProcess,const char *pcLibraryName);
BOOL FreeRemoteLibrary(HANDLE hProcess, HMODULE hRemoteLibrary);
int main(int argc, char* argv[])
{
DWORD dwPID = 0;
HANDLE hNewHandle = NULL;
HMODULE hRemoteHandle = NULL;
int i=0;
if( argc < 2 )
{
return -1;
}
dwPID = atoi(argv[1]);
hNewHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPID);
if( NULL == hNewHandle )
{
printf("[-] OpenProcess failed.../r/n");
return -2;
}
hRemoteHandle = LoadRemoteLibrary(hNewHandle,DLL);
if( NULL == hRemoteHandle )
{
printf("[-] LoadRemoteLibaray failed.../r/n");
return -3;
}
printf("[+] LoadRemoteLibaray succeed!/r/n");
for(i=0;i<=20;i++)
{
printf(".");
Sleep(100);
}
printf("/r/n");
if( FreeRemoteLibrary(hNewHandle,hRemoteHandle) == NULL )
{
printf("[-] FreeRemoteLibaray failed.../r/n");
return -4;
}
printf("[+] FreeRemoteLibrary succeed!/r/n");
return 0;
}
HMODULE LoadRemoteLibrary(HANDLE hProcess,const char *pcLibraryName)
{
void* pvRemoteMem=NULL;
DWORD dwBytesWritten;
HMODULE nRet=NULL;
DWORD dwRemoteThreadId;
HANDLE hRemoteThread=NULL;
__try
{
pvRemoteMem=VirtualAllocEx(hProcess,NULL,strlen(pcLibraryName)+1,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
if (NULL == pvRemoteMem)
{
printf("[-] VirtualAllocEx failed.../r/n");
__leave;
}
if (FALSE == WriteProcessMemory(hProcess,pvRemoteMem,(void*)pcLibraryName,strlen(pcLibraryName)+1,&dwBytesWritten))
{
printf("[-] WriteProcessMemory failed.../r/n");
__leave;
}
hRemoteThread=CreateRemoteThread(hProcess,NULL,MAX_SIZE,(LPTHREAD_START_ROUTINE)
#ifdef UNICODE
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW"),
#else
GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"),
#endif
pvRemoteMem,0,&dwRemoteThreadId);
if (NULL == hRemoteThread)
{
printf("[-] CreateRemoteThread failed.../r/n");
__leave;
}
else
{
__try
{
WaitForSingleObject(hRemoteThread,INFINITE);
GetExitCodeThread(hRemoteThread,(DWORD*)&nRet);
printf("ErrorCode:%d/r/n",GetLastError() );
}
__finally
{
CloseHandle(hRemoteThread);
}
}
}
__finally
{
if (NULL != pvRemoteMem)
VirtualFreeEx(hProcess,pvRemoteMem,0,MEM_RELEASE);
}
return nRet;
}
BOOL FreeRemoteLibrary(HANDLE hProcess, HMODULE hRemoteLibrary)
{
DWORD dwRemoteThreadId;
HANDLE hRemoteThread;
BOOL nRet;
hRemoteThread=CreateRemoteThread(hProcess,NULL,MAX_SIZE,
(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32.dll"), "FreeLibrary"),(void*)hRemoteLibrary,0,&dwRemoteThreadId);
if (NULL == hRemoteThread)
return FALSE;
WaitForSingleObject(hRemoteThread,INFINITE);
GetExitCodeThread(hRemoteThread,(DWORD*)&nRet);
return nRet;
}
Code:
|