核心函数:
CreateRemoteThread 创建一个在其它进程地址空间中运行的线程(也称:创建远程线程).
#include <windows.h>
#include <Tlhelp32.h>#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"user32.lib")
BOOL EnableDebugPriv( LPCTSTR szPrivilege )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if ( !OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken ) )
{
return FALSE;
}
if ( !LookupPrivilegeValue( NULL, szPrivilege, &sedebugnameValue ) )
{
CloseHandle( hToken );
return FALSE;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
{
CloseHandle( hToken );
return FALSE;
}
return TRUE;
}
typedef struct sARGVDATA
{
DWORD OpenProcessAddr ;
DWORD WaitForSingleObjectAddr ;
DWORD DeleteFileAddr ;
DWORD TerminateProcessAddr ;
char File[MAX_PATH] ;
DWORD pid ;
} ARGVDATA ;
DWORD WINAPI func(ARGVDATA *pArgv)
{
typedef HANDLE (__stdcall *MyOpenProcess)(DWORD,BOOL,DWORD) ;
typedef DWORD (__stdcall *MyWaitForSingleObject)(HANDLE,DWORD) ;
typedef BOOL (__stdcall *MyDeleteFile)(LPCSTR) ;
typedef BOOL (__stdcall *MyTerminateProcess)(HANDLE, UINT) ;
HANDLE hProc ;
MyOpenProcess pOpenProcess ;
MyWaitForSingleObject pWaitForSingleObject ;
MyDeleteFile pDeleteFile ;
MyTerminateProcess pTerminateProcess ;
pOpenProcess = (MyOpenProcess)pArgv->OpenProcessAddr ;
pWaitForSingleObject = (MyWaitForSingleObject)pArgv->WaitForSingleObjectAddr ;
pDeleteFile = (MyDeleteFile)pArgv->DeleteFileAddr ;
pTerminateProcess = (MyTerminateProcess)pArgv->TerminateProcessAddr ;
hProc = pOpenProcess(PROCESS_ALL_ACCESS,FALSE,pArgv->pid) ;
if (hProc!=NULL)
{
pTerminateProcess(hProc, 0);
pWaitForSingleObject(hProc,INFINITE) ;
pDeleteFile(pArgv->File) ;
}
else
{
//删除文件
pDeleteFile(pArgv->File) ;
}
return 0 ;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ARGVDATA argc_data ;
ARGVDATA *p_data ;
HANDLE hSnap ;
HANDLE hExp ;
HINSTANCE hKernel ;
FARPROC p_remote_thread ;
PROCESSENTRY32 ps ;
BOOL bRet ;
hKernel = LoadLibrary("kernel32.dll") ;
//填写远程线程参数
argc_data.OpenProcessAddr = (DWORD)GetProcAddress(hKernel,"OpenProcess") ;
argc_data.WaitForSingleObjectAddr = (DWORD)GetProcAddress(hKernel,"WaitForSingleObject") ;
argc_data.DeleteFileAddr = (DWORD)GetProcAddress(hKernel,"DeleteFileA") ;
argc_data.TerminateProcessAddr = (DWORD)GetProcAddress(hKernel,"TerminateProcess");
argc_data.pid = GetCurrentProcessId() ;
GetModuleFileName(NULL,argc_data.File,MAX_PATH) ;
//打开目标进程,写入远程线程参数
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) ;
bRet = Process32First(hSnap,&ps) ;
while (bRet)
{
if (!strcmp(ps.szExeFile,"explorer.exe")) //要注入的进程
{
break ;
}
bRet = Process32Next(hSnap,&ps) ;
}
EnableDebugPriv("SeDebugPrivilege");
hExp = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ps.th32ProcessID) ;
if (NULL==hExp)
{
MessageBox(0,"打开EXPLORER失败!","DEBUG",0) ;
return -1 ;
}
p_data = (ARGVDATA *)VirtualAllocEx(hExp,
NULL,
sizeof(ARGVDATA),
MEM_COMMIT,
PAGE_READWRITE) ;
if (NULL==p_data)
{
MessageBox(0,"给参数分配内存失败!","DEBUG",0) ;
CloseHandle(hExp) ;
return -1 ;
}
if (FALSE==WriteProcessMemory(hExp,p_data,&argc_data,sizeof(ARGVDATA),NULL))
{
MessageBox(0,"参数写入内存失败!","DEBUG",0) ;
CloseHandle(hExp) ;
return -1 ;
}
//写入远程线程代码
p_remote_thread = (FARPROC)VirtualAllocEx(hExp,NULL,1024*5,MEM_COMMIT,PAGE_EXECUTE_READWRITE) ;
if (NULL==p_remote_thread)
{
MessageBox(0,"给线程分配内存失败!","DEBUG",0) ;
CloseHandle(hExp) ;
return -1 ;
}
if (FALSE==WriteProcessMemory(hExp,p_remote_thread,(FARPROC)&func,1024*5,NULL))
{
MessageBox(0,"线程写入失败!","DEBUG",0) ;
CloseHandle(hExp) ;
return -1 ;
}
CreateRemoteThread(hExp,NULL,0,(LPTHREAD_START_ROUTINE)p_remote_thread,p_data,0,NULL) ;
WaitForSingleObject(p_remote_thread,INFINITE) ;
FreeLibrary(hKernel) ;
CloseHandle(hExp) ;
MessageBox(NULL,"远程线程自删除演示","ADH-CN",0) ;
while (1)
{
Sleep(3000);
}
}