首页
社区
课程
招聘
未解决 [求助]假设我将PE文件拉伸后然后创建线程,将线程函数设置为程序入口点,但是为什么执行不起来呢,是需要修复IAT表吗?,求解答
发表于: 2020-11-17 21:18 2272

未解决 [求助]假设我将PE文件拉伸后然后创建线程,将线程函数设置为程序入口点,但是为什么执行不起来呢,是需要修复IAT表吗?,求解答

2020-11-17 21:18
2272

```
插入代码

 

#include<Windows.h>

 

#include<stdio.h>

 

#include<stdlib.h>

 

#pragma warning(disable:4996)

 

#define path "E:\Desktop\winmine.exe"

 

int main(int argc, char argv[])
{
FILE
fp;
int FileSize = 0;
fp = fopen(path, "rb");

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//计算文件大小
fseek(fp, 0, SEEK_END);
FileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
 
//申请空间
PVOID pFileBuffer = malloc(FileSize);
//memset(pTempFileBuffer, NULL, FileSize);
 
 
if (pFileBuffer == NULL)
{
    printf("pTempFileBuffer申请空间失败!\n");
    return 0;
}
if (!fread(pFileBuffer, FileSize, 1, fp))
{
    printf("文件读取失败\n");
    return 0;
}
 
PIMAGE_DOS_HEADER pDos = NULL;
PIMAGE_NT_HEADERS pNt = NULL;
PIMAGE_FILE_HEADER pFile = NULL;
PIMAGE_OPTIONAL_HEADER pOptional = NULL;
PIMAGE_SECTION_HEADER pSection = NULL;
 
pDos = (PIMAGE_DOS_HEADER)pFileBuffer;
if (pDos->e_magic != IMAGE_DOS_SIGNATURE)
{
    printf("不是有效的MZ标志\n");
    return 0;
}
 
pNt = (PIMAGE_NT_HEADERS)((DWORD)pDos + pDos->e_lfanew);
if (pNt->Signature != IMAGE_NT_SIGNATURE)
{
    printf("不是有效的PE标志\n");
    return 0;
}
 
pFile = (PIMAGE_FILE_HEADER)((DWORD)pDos + pDos->e_lfanew + 4);
pOptional = (PIMAGE_OPTIONAL_HEADER)((DWORD)pFile + IMAGE_SIZEOF_FILE_HEADER);
pSection = (PIMAGE_SECTION_HEADER)((DWORD)pOptional + pFile->SizeOfOptionalHeader);
 
//为拉伸后的Pe文件申请空间
PVOID pImageBuffer = malloc(pOptional->SizeOfImage);
memset(pImageBuffer, 0, pOptional->SizeOfImage);
//拷贝PE头部
memcpy(pImageBuffer, pFileBuffer, pOptional->SizeOfHeaders);
 
//循环拷贝节表
PIMAGE_SECTION_HEADER pTempScetion = pSection;
for (size_t i = 0; i < pFile->NumberOfSections; i++)
{
    memcpy((PVOID)((DWORD)pImageBuffer + pTempScetion->VirtualAddress), (PVOID)((DWORD)pFileBuffer + pTempScetion->PointerToRawData), pTempScetion->Misc.VirtualSize);
    pTempScetion = (PIMAGE_SECTION_HEADER)((DWORD)pTempScetion + IMAGE_SIZEOF_SECTION_HEADER);
}
 
//创建线程
HANDLE hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)((DWORD)pImageBuffer + pOptional->AddressOfEntryPoint), NULL, NULL, NULL);
 
if (hThread == NULL)
{
 
    printf("线程创建失败\n");
    return 0;
}
 
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
 
free(pFileBuffer);
free(pImageBuffer);
while (1);
return 0;

}


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
2
你代码有三个问题
1.堆内存不可执行
2.需要修复导入表
3.很大概率需要修复重定位表(如果目标程序没有重定位表,需要申请相应imagebase位置内存)
2020-11-17 22:08
2
雪    币: 789
活跃值: (1819)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
2l说的对啊!
2020-11-17 22:10
0
雪    币: 360
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
需要修复IAT和RELOC吧
2020-11-17 23:40
0
雪    币: 350
活跃值: (547)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那就是说当我远程注入到其他进程的空间内,然后修复IAT和重定位表,然后在创建一个线程,那么这个dll就能在目标进程空间跑了对吗?
这种注入方法有什么缺点吗?
2020-11-18 11:12
0
雪    币: 12078
活跃值: (5639)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
论坛内存加载的代码随便搜都一大堆,缺点是这堆代码基本已经跟不上巨硬更新的步伐了,越来越多的dll需要更多的兼容性代码才能正常加载
2020-11-18 12:35
0
游客
登录 | 注册 方可回帖
返回
//