69,371
社区成员
发帖
与我相关
我的任务
分享
/************************************************************************/
/* 无DLL注入,由于编译器优化可能导致错误,因此请用Relase优化 */
/* 2009年12月10日 */
/* By Poss */
/************************************************************************/
#include <windows.h>
#include <TLHELP32.H>
#include "resource.h"
struct ProcessMsg
{
HANDLE (WINAPI *MyCreateToolhelp32Snapshot)(DWORD,DWORD); //创建系统快照
BOOL (WINAPI *MyProcess32First)(HANDLE, LPPROCESSENTRY32); //枚举进程
BOOL (WINAPI *MyProcess32Next)(HANDLE, LPPROCESSENTRY32);
UINT (WINAPI *MyWinExec)(LPCSTR, UINT); //启动程序,郁闷,他没有ASCII
VOID (WINAPI *MySleep)(DWORD); //暂停
int (WINAPI *MyMessageBox)(HWND, LPCTSTR, LPCTSTR, UINT); //消息框
int (WINAPI *MyComperString)(LPCTSTR, LPCTSTR); //比较字符串
char szFilePath[MAX_PATH];
TCHAR szFileName[MAX_PATH];
HANDLE hSnapshot;
bool isRun;
PROCESSENTRY32W pe32;
};
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
struct ProcessMsg *msg = (struct ProcessMsg*)lpParam;
// msg->pe32.dwSize = sizeof(msg->pe32);
while (true)
{
msg->isRun = true;
msg->hSnapshot = msg->MyCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
msg->MyProcess32First(msg->hSnapshot, &msg->pe32);
do
{
// msg->MyMessageBox(NULL, msg->pe32.szExeFile, msg->szFileName, MB_OK);
if (!msg->MyComperString(msg->szFileName, msg->pe32.szExeFile))
{
msg->isRun = false;
}
msg->MySleep(100);
} while(msg->MyProcess32Next(msg->hSnapshot, &msg->pe32));
if (msg->isRun)
{
// msg->MyMessageBox(NULL, NULL, NULL, 0);
msg->MyWinExec(msg->szFilePath, SW_SHOWNORMAL);
}
msg->MySleep(1000);
}
return 0;
}
BOOL EnablePriv()
{
HANDLE hToken;
if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
{
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid );//修改进程权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
return( (GetLastError()==ERROR_SUCCESS) );
}
return TRUE;
}
DWORD GetProcessID(TCHAR *szProcess)
{
EnablePriv();
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);
Process32First(hSnapshot, &pe32);
do
{
if (!wcsicmp(szProcess, pe32.szExeFile))
{
return pe32.th32ProcessID;
}
} while(Process32Next(hSnapshot, &pe32));
return 0;
}
HANDLE GetProcessHandle(TCHAR *szProcess)
{
DWORD dwProcess = GetProcessID(szProcess);
if (dwProcess == 0)
{
return NULL;
}
HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, FALSE, dwProcess);
return hProcess;
}
void SetFunAddress(struct ProcessMsg *msg)
{
HMODULE hKernel32 = GetModuleHandle(TEXT("Kernel32.dll"));
(FARPROC&)msg->MyCreateToolhelp32Snapshot = GetProcAddress(hKernel32, "CreateToolhelp32Snapshot");
(FARPROC&)msg->MyProcess32First = GetProcAddress(hKernel32, "Process32FirstW");
(FARPROC&)msg->MyProcess32Next = GetProcAddress(hKernel32, "Process32NextW");
(FARPROC&)msg->MySleep = GetProcAddress(hKernel32, "Sleep");
(FARPROC&)msg->MyWinExec = GetProcAddress(hKernel32, "WinExec");
(FARPROC&)msg->MyComperString = GetProcAddress(hKernel32, "lstrcmp");
(FARPROC&)msg->MyMessageBox = GetProcAddress(GetModuleHandle(TEXT("User32.dll")), "MessageBoxW");
GetModuleFileNameA(GetModuleHandle(NULL), msg->szFilePath, MAX_PATH);
lstrcpy(msg->szFileName, TEXT("CreateRemoteThread.exe"));
msg->pe32.dwSize = sizeof(PROCESSENTRY32W);
}
bool InsertThread(TCHAR *szProcess)
{
HANDLE hProcess = GetProcessHandle(szProcess);
if (hProcess == NULL)
{
return false;
}
struct ProcessMsg msg;
SetFunAddress(&msg);
DWORD dwSize = sizeof(msg);
LPVOID lpParam = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
if (lpParam == NULL)
{
CloseHandle(hProcess);
return false;
}
DWORD dwWrite;
if (!WriteProcessMemory(hProcess, lpParam, &msg, dwSize, &dwWrite))
{
VirtualFreeEx(hProcess, lpParam, dwSize, MEM_DECOMMIT);
CloseHandle(hProcess);
return false;
}
/*函数大小。除汇编外,其他语言设置这个十分麻烦,因此我这架设一个比较大的内容*/
DWORD dwThread = 1024 * 4;
LPVOID lpThread = VirtualAllocEx(hProcess, NULL, dwThread, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (lpThread == NULL)
{
VirtualFreeEx(hProcess, lpParam, dwSize, MEM_DECOMMIT);
CloseHandle(hProcess);
return false;
}
if (!WriteProcessMemory(hProcess, lpThread, ThreadProc, dwThread, &dwWrite))
{
VirtualFreeEx(hProcess, lpParam, dwSize, MEM_DECOMMIT);
VirtualFreeEx(hProcess, lpThread, dwThread, MEM_DECOMMIT);
CloseHandle(hProcess);
return false;
}
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpThread, lpParam, 0, 0);
return true;
}
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BTN_BEGIN:
if (BN_CLICKED == HIWORD(wParam))
{
TCHAR szProcess[MAX_PATH];
GetDlgItemText(hwndDlg, IDC_EDIT_PROCESS, szProcess, MAX_PATH);
InsertThread(szProcess);
}
return true;
}
return true;
case WM_INITDIALOG:
return true;
case WM_CLOSE:
EndDialog(hwndDlg, 0);
return true;
}
return false;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, (DLGPROC)DialogProc);
return 0;
}