致注入進程崩潰
// test.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include "windows.h"
#include <conio.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
// ========== 傳給注入線程的參數結構 ============
struct MyData
{
char srcfile[64]; //源文件地址
char destfile[64];//目標文件地址
DWORD dwCopyFile; // CopyFileA()的地址
};
// ========== 遠程線程的函數 ==============================
DWORD __stdcall RMTFunc(MyData *pData)
{
typedef int(__stdcall*_tCopyFile)(LPCSTR, LPCSTR, bool);
_tCopyFile copyfile = (_tCopyFile)pData->dwCopyFile;
copyfile(pData->srcfile, pData->destfile, true);
return 0;
}
//============空函數,其作用是方便獲取注入線程函數的體積======
static void AfterMyFunc (void) {
}
//根據進程名獲取進程id
DWORD processtopid(char *processname)
{
DWORD lpidprocesses[1024],cbneeded,cprocesses;
HANDLE hprocess;
HMODULE hmodule;
UINT i;
char normalname[MAX_PATH]=_T("UnknownProcess");
if(!EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded))
{
OutputDebugString(_T("EnumProcesses Error\n"));
return -1;
}
cprocesses=cbneeded/sizeof(DWORD);
for(i=0;i<cprocesses;i++)
{
hprocess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]);
if(hprocess)
{
if(EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded))
{
GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));
if(!strcmp(normalname,processname))
{
CloseHandle(hprocess);
return (lpidprocesses[i]);
}
}
}
}
CloseHandle(hprocess);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
// ===== 獲得需要創建REMOTETHREAD的進程句柄 ===============================
DWORD dwProcessId = processtopid("notepad.exe");
HANDLE hProcess = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
dwProcessId);
// ========= 代碼結構 ================================================
MyData data;
ZeroMemory(&data, sizeof (MyData));
strcpy(data.srcfile, "c:\\aaa.txt");
strcpy(data.destfile, "c:\\bbb.txt");
HINSTANCE hKernel32 = LoadLibrary("kernel32.dll");
if (! hKernel32)
{
printf("Can not load library.\n");
return 0;
}
data.dwCopyFile = (DWORD)GetProcAddress(hKernel32, "CopyFileA");
FreeLibrary(hKernel32);
if (! data.dwCopyFile)
return 0;
// ======= 爲注入線程分配空間 =============================
DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) RMTFunc);
void *pRemoteThread = VirtualAllocEx(hProcess, 0, cbCodeSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//if (! pRemoteThread)
// return 0;
//========將線程函數寫入宿主進程===========================
WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, cbCodeSize, 0);
//if (! WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, cbCodeSize, 0))
// return 0;
// ======= 爲參數分配空間 =============================
MyData *pData
= (MyData*)VirtualAllocEx(hProcess, 0,
sizeof (MyData), MEM_COMMIT,
PAGE_READWRITE);
if (!pData)
return 0;
//========將參數寫入宿主進程===========================
if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0))
return 0;
// =========== 創建遠程線程 ===========================================
HANDLE hThread
= CreateRemoteThread(hProcess, 0,
0, (LPTHREAD_START_ROUTINE)pRemoteThread,
pData, 0, 0);
if (! hThread)
{
printf("遠程線程創建失敗");
return 0;
}
//===========收尾=============================
CloseHandle(hThread);
VirtualFreeEx(hProcess, pRemoteThread, 1024*3, MEM_RELEASE);
VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE);
CloseHandle(hProcess);
printf("Hello World!\n");
return 0;
}
//
#include "stdafx.h"
#include "windows.h"
#include <conio.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
// ========== 傳給注入線程的參數結構 ============
struct MyData
{
char srcfile[64]; //源文件地址
char destfile[64];//目標文件地址
DWORD dwCopyFile; // CopyFileA()的地址
};
// ========== 遠程線程的函數 ==============================
DWORD __stdcall RMTFunc(MyData *pData)
{
typedef int(__stdcall*_tCopyFile)(LPCSTR, LPCSTR, bool);
_tCopyFile copyfile = (_tCopyFile)pData->dwCopyFile;
copyfile(pData->srcfile, pData->destfile, true);
return 0;
}
//============空函數,其作用是方便獲取注入線程函數的體積======
static void AfterMyFunc (void) {
}
//根據進程名獲取進程id
DWORD processtopid(char *processname)
{
DWORD lpidprocesses[1024],cbneeded,cprocesses;
HANDLE hprocess;
HMODULE hmodule;
UINT i;
char normalname[MAX_PATH]=_T("UnknownProcess");
if(!EnumProcesses(lpidprocesses,sizeof(lpidprocesses),&cbneeded))
{
OutputDebugString(_T("EnumProcesses Error\n"));
return -1;
}
cprocesses=cbneeded/sizeof(DWORD);
for(i=0;i<cprocesses;i++)
{
hprocess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,lpidprocesses[i]);
if(hprocess)
{
if(EnumProcessModules(hprocess,&hmodule,sizeof(hmodule),&cbneeded))
{
GetModuleBaseName(hprocess,hmodule,normalname,sizeof(normalname));
if(!strcmp(normalname,processname))
{
CloseHandle(hprocess);
return (lpidprocesses[i]);
}
}
}
}
CloseHandle(hprocess);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
// ===== 獲得需要創建REMOTETHREAD的進程句柄 ===============================
DWORD dwProcessId = processtopid("notepad.exe");
HANDLE hProcess = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
dwProcessId);
// ========= 代碼結構 ================================================
MyData data;
ZeroMemory(&data, sizeof (MyData));
strcpy(data.srcfile, "c:\\aaa.txt");
strcpy(data.destfile, "c:\\bbb.txt");
HINSTANCE hKernel32 = LoadLibrary("kernel32.dll");
if (! hKernel32)
{
printf("Can not load library.\n");
return 0;
}
data.dwCopyFile = (DWORD)GetProcAddress(hKernel32, "CopyFileA");
FreeLibrary(hKernel32);
if (! data.dwCopyFile)
return 0;
// ======= 爲注入線程分配空間 =============================
DWORD cbCodeSize=((LPBYTE) AfterMyFunc - (LPBYTE) RMTFunc);
void *pRemoteThread = VirtualAllocEx(hProcess, 0, cbCodeSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//if (! pRemoteThread)
// return 0;
//========將線程函數寫入宿主進程===========================
WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, cbCodeSize, 0);
//if (! WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, cbCodeSize, 0))
// return 0;
// ======= 爲參數分配空間 =============================
MyData *pData
= (MyData*)VirtualAllocEx(hProcess, 0,
sizeof (MyData), MEM_COMMIT,
PAGE_READWRITE);
if (!pData)
return 0;
//========將參數寫入宿主進程===========================
if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0))
return 0;
// =========== 創建遠程線程 ===========================================
HANDLE hThread
= CreateRemoteThread(hProcess, 0,
0, (LPTHREAD_START_ROUTINE)pRemoteThread,
pData, 0, 0);
if (! hThread)
{
printf("遠程線程創建失敗");
return 0;
}
//===========收尾=============================
CloseHandle(hThread);
VirtualFreeEx(hProcess, pRemoteThread, 1024*3, MEM_RELEASE);
VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE);
CloseHandle(hProcess);
printf("Hello World!\n");
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.