最烦打代码了,但是貌似代码是最高效的方式……
之前手动往PE文件中注入代码添加ShellCode,最近手动往PE文件中注入代码,貌似就是捆绑吧………………
工具:一个想添加ShellCode的程序,VS2013
步骤为VS中的注释
-/******************************************************************************************/
//步骤分为五个 */
//1,将文件读取到缓冲区,用pFileBuffer接收吗,构造ShellCode(); */
//2,根据对齐的情况来,将接收的FileBuffer 手动转换为ImageBuffer; */
//3,向已经转换完成的ImageBuffer的代码空白区; */
//4,补充完ShellCode; */
//5,更改OEP; */
/*******************************************************************************************/
ps:貌似PE文件的类型在这两个头文件中
#include <atlbase.h>
#include <atlstr.h>
这里我用的程序是win自带的notepad;
首先将文件读入缓冲区;
<input type="checkbox">1
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
DWORDReadPEFile(INLPSTRlpszFile,OUTLPVOID*FileBuffer)
{
FILE*pFile=NULL;
DWORDfileSize=0;
//定义一个可以含有内存空间的类型
LPVOIDpFileBuffer=NULL;
//打开文件
fopen_s(&pFile,lpszFile,"rb");
if(!pFile)
{
printf("无法打开EXE文件!");
returnNULL;
}
else
{
printf("Successful!\n");
}
//读取文件大小
fseek(pFile,0,SEEK_END);
fileSize=ftell(pFile);
fseek(pFile,0,SEEK_SET);
//分配缓冲区
pFileBuffer=malloc(fileSize);
if(!pFileBuffer)
{
printf("分配空间失败!");
fclose(pFile);
returnNULL;
}
//将文件数据读取到缓冲区
size_tn=fread(pFileBuffer,fileSize,1,pFile);
if(!n)
{
printf("读取数据失败!");
free(pFileBuffer);
fclose(pFile);
returnNULL;
}
//关闭文件
*FileBuffer=pFileBuffer;
fclose(pFile);
pFileBuffer=NULL;
returnfileSize;
};
这个是单独的函数路径是在头文件中定义的,将文件读到内存中之后用FileBuffer接收。返回的文件的长度,注意的地方是要把在本函数中使用的空间最后变为NULL;这个时候的数据是按文件对齐排列在内存中的,需要把文件对齐拉伸为内存对齐。
第二个函数为FileBufferToImageBuffer;文件对齐转换为内存对齐,起始位置的地址从0转换为ImageBase;
转换时需要先复制头信息,节表信息,PE文件头部没有对齐 只是起始位置改变。当复制节表表示的内容时需要每个节每个节填充;
这个地方需要注意RVA ROA FOA一些乱七八糟的概念;
FileBuffer转换为ImageBuffer之后就可以添加ShellCode了,这个地方用到一个概念,需要先把让OEP指向ShellCode然后再跳转回到原始OEP执行原始代码;代码如下
每个函数都有独立的功能,貌似就是那六个字:高内聚,低耦合;
这里是将ShellCode存放在一个数组中然后直接将数组整体添加到应该添加的地方。
剩下的就是将已经添加过ShellCode的文件从内存对齐状态转换为文件对齐,然后保存文件,这个是之前从FileBuffer转换成ImageBuffer的逆过程;
就不添加代码了,太多了。
感谢滴水逆向的教程。