发布时间:2014-07-15 11:50:28作者:知识屋
/*获取进程模块镜像*/ module = GetModuleHandle(NULL); /*获取PE头信息*/ PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)module +((PIMAGE_DOS_HEADER)module)->e_lfanew); /*获取代码长度*/ DWORD moduleSize = headers->OptionalHeader.SizeOfImage;
/*在目标进程中新申请内存的偏移*/ delta = (DWORD_PTR)((LPBYTE)distantModuleMemorySpace – headers->OptionalHeader.ImageBase); /* 当前进程的镜像偏移量 */ olddelta = (DWORD_PTR)((LPBYTE)module – headers->OptionalHeader.ImageBase);
typedef struct _IMAGE_BASE_RELOCATION { ULONG VirtualAddress; ULONG SizeOfBlock; } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;
LPTHREAD_START_ROUTINE remoteThread = (LPTHREAD_START_ROUTINE)((LPBYTE)injectedModule + (DWORD_PTR)((LPBYTE)callRoutine – (LPBYTE)module)); thread = CreateRemoteThread(proc, NULL, 0, remoteThread, NULL, 0, NULL);
#include <stdafx.h> #include <.h> #include <tlhelp32.h> #include <process.h> #include <stdio.h> #pragma comment (lib, “winmm.lib”) #pragma comment (lib, “kernel32.lib”) /*获取进程ID号*/ DWORD GetProcessIdByName(LPWSTR name) { PROCESSENTRY32 pe32; HANDLE snapshot = NULL; DWORD pid = 0; snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (snapshot != INVALID_HANDLE_VALUE) { pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(snapshot, &pe32)) { do { if (!lstrcmp(pe32.szExeFile, name)) { pid = pe32.th32ProcessID; break; } } while (Process32Next(snapshot, &pe32)); } CloseHandle(snapshot); } return pid; } DWORD main(); extern “C” void mainCRTStartup(); /** * 远程进程内存中注入PE */ HMODULE injectModule(HANDLE proc, LPVOID module) { DWORD i = 0; DWORD_PTR delta = NULL; DWORD_PTR olddelta = NULL; /* 获取模块PE头 */ PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)module + ((PIMAGE_DOS_HEADER)module)->e_lfanew); PIMAGE_DATA_DIRECTORY datadir; /* 计算注入代码长度 */ DWORD moduleSize = headers->OptionalHeader.SizeOfImage; LPVOID distantModuleMemorySpace = NULL; LPBYTE tmpBuffer = NULL; BOOL ok = FALSE; if (headers->Signature != IMAGE_NT_SIGNATURE) return NULL; if (IsBadReadPtr(module, moduleSize)) return NULL; distantModuleMemorySpace = VirtualAllocEx(proc, NULL, moduleSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (distantModuleMemorySpace != NULL) { tmpBuffer = (LPBYTE)VirtualAlloc(NULL, moduleSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (tmpBuffer != NULL) { RtlCopyMemory(tmpBuffer, module, moduleSize); datadir = &headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; if (datadir->Size > 0 && datadir->VirtualAddress > 0) { delta = (DWORD_PTR)((LPBYTE)distantModuleMemorySpace – headers->OptionalHeader.ImageBase); olddelta = (DWORD_PTR)((LPBYTE)module – headers->OptionalHeader.ImageBase); PIMAGE_BASE_RELOCATION reloc = (PIMAGE_BASE_RELOCATION)(tmpBuffer + datadir->VirtualAddress); while (reloc->VirtualAddress != 0) { if (reloc->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION)) { DWORD relocDescNb = (reloc->SizeOfBlock – sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD); LPWORD relocDescList = (LPWORD)((LPBYTE)reloc + sizeof(IMAGE_BASE_RELOCATION)); for (i = 0; i < relocDescNb; i++) { if (relocDescList[i] > 0) { DWORD_PTR *p = (DWORD_PTR *)(tmpBuffer + (reloc->VirtualAddress + (0x0FFF & (relocDescList[i])))); *p -= olddelta; *p += delta; } } } reloc = (PIMAGE_BASE_RELOCATION)((LPBYTE)reloc + reloc->SizeOfBlock); } tmpBuffer[(DWORD)main - (DWORD)module] = 0×55; ok = WriteProcessMemory(proc, distantModuleMemorySpace, tmpBuffer, moduleSize, NULL); } VirtualFree(tmpBuffer, 0, MEM_RELEASE); } if (!ok) { VirtualFreeEx(proc, distantModuleMemorySpace, 0, MEM_RELEASE); distantModuleMemorySpace = NULL; } } return (HMODULE)distantModuleMemorySpace; } /** * 获取DEBUG权限 */ BOOL EnableDebugPrivileges(void) { HANDLE token; TOKEN_PRIVILEGES priv; BOOL ret = FALSE; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)) { priv.PrivilegeCount = 1; priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &priv.Privileges[0].Luid) != FALSE && AdjustTokenPrivileges(token, FALSE, &priv, 0, NULL, NULL) != FALSE) { ret = TRUE; } CloseHandle(token); } return ret; } BOOL peInjection(DWORD pid, LPTHREAD_START_ROUTINE callRoutine) { HANDLE proc, thread; HMODULE module, injectedModule; BOOL result = FALSE; proc = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, FALSE, pid); if (proc != NULL) { module = GetModuleHandle(NULL); injectedModule = (HMODULE)injectModule(proc, module); if (injectedModule != NULL) { LPTHREAD_START_ROUTINE remoteThread = (LPTHREAD_START_ROUTINE)((LPBYTE)injectedModule + (DWORD_PTR)((LPBYTE)callRoutine – (LPBYTE)module)); thread = CreateRemoteThread(proc, NULL, 0, remoteThread, NULL, 0, NULL); if (thread != NULL) { CloseHandle(thread); result = TRUE; } else { VirtualFreeEx(proc, module, 0, MEM_RELEASE); } } CloseHandle(proc); } return result; } DWORD WINAPI entryThread(LPVOID param) { DWORD newModuleD = (DWORD)param; MessageBox(NULL, L”Injection success. Now initializing runtime library.”, NULL, 0); mainCRTStartup(); MessageBox(NULL, L”This will never be called.”, NULL, 0); return 0; } DWORD main() { MessageBox(NULL, L”In Main “, NULL, 0); printf(“This printf can work because runtime library is now initialized.n”); MessageBox(NULL, L”In main end”, NULL, 0); ExitThread(0); return 0; } void entryPoint() { MessageBox(NULL, L”entryPoint”, NULL, 0); EnableDebugPrivileges(); peInjection(GetProcessIdByName(L”explorer.exe”), entryThread); }
2011-06-17
电脑开机时出现lass.exe进程是病毒吗?
自拍须谨慎!教你如何通过照片定位查看拍摄地点
电脑病毒最基础知识
黑客学员必须了解的C语言技术
精典详细内网渗透专题文章
教你破解Tp-Link的无线路由密码
解决SecureCRT中文显示乱码
QQ电脑管家和360哪个好?横评实测对比
攻防实战:无线网络路由入侵过程