linux脚本打不开文件夹,为什么这个程序向文件地址和内存地址不一样的文件加入shellcode会导致文件打不开...
[C] 纯文本查看 复制代码#include "iostream"
#include
#define size_shellcode 0x12
#define messagebox_add 0x76c9fdf6
BYTE shellcode[] = {
0x6A,00,0x6A,00,0x6A,00,0x6A,00,
0XE8,00,00,00,00,
0XE9,00,00,00,00
};
char file_path[] = "C:\\Windows\\system32\\notepad.exe";
char write_file_path[] = "C:\\notepad.exe";
// exe->filebuffer 返回值为计算所得文件大小
int ReadPEFile(char* file_path,PVOID* pFileBuffer)
{
FILE* pfile = NULL; // 文件指针
DWORD file_size = 0;
LPVOID pTempFilebuffer = NULL;
// 打开文件
pfile = fopen(file_path,"rb"); // 如果有新的指针,就要进行判断
if(!pfile)
{
printf("打开exe文件失败!\n");//如果分配失败就要关闭文件、释放动态内存、指针指向NULL
return 0;
}
// 读取文件大小
fseek(pfile,0,SEEK_END);
file_size = ftell(pfile);
fseek(pfile,0,SEEK_SET);
// 分配空间
pTempFilebuffer = malloc(file_size); // 如果有新的指针,就要进行判断
if(!pTempFilebuffer)
{
printf("分配空间失败!\n");//如果分配失败就要关闭文件、释放动态内存、指针指向NULL
fclose(pfile);
return 0 ;
}
// 将数据读取到内存中
size_t n = fread(pTempFilebuffer,file_size,1,pfile);
if(!n)
{
printf("数据读取到内存中失败!\n"); //如果分配失败就要关闭文件、释放动态内存、指针指向NULL
fclose(pfile);
free(pTempFilebuffer);
return 0 ;
}
// 关闭文件(已经读取到内存了)
*pFileBuffer = pTempFilebuffer;
pTempFilebuffer = NULL;
fclose(pfile);
return file_size;
}
// filebuffer -> imagebuffer
DWORD CopyFileBufferToImageBuffer(PVOID pFileBuffer,PVOID* pImageBuffer)
{
// 初始化PE头部结构体
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
// 初始化IMAGE_BUFFER指针(temparay)
LPVOID pTempImagebuffer = NULL;
if(!pFileBuffer)
{
printf("(2pimagebuffer阶段)读取到内存的pfilebuffer无效!\n");
return 0 ;
}
// 判断是否是可执行文件
if(*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE) // IMAGE_DOS_SIGNATURE是4字节,将pFileBuffer强制类型转换为4字节指针类型(PWORD)
{
printf("(2pimagebuffer阶段)不含MZ标志,不是exe文件!\n");
return 0;
}
//强制结构体类型转换pDosHeader
pDosHeader = PIMAGE_DOS_HEADER(pFileBuffer);
//判断是否含有PE标志
if(*((PDWORD)((DWORD)pFileBuffer+pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE) // 注意指针的加法是:去掉一个*后的类型相加。必须转换为DWORD类型再加减。
{ //相加后的和 强制类型转换为4字节指针类型(PWORD) IMAGE_NT_SIGNATURE 4BYTES
printf("(2pimagebuffer阶段)不是有效的PE标志!\n");
return 0;
}
// 强制结构体类型转换
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader+4);
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader+pPEHeader->SizeOfOptionalHeader);
// 分配动态内存
pTempImagebuffer = malloc(pOptionHeader->SizeOfImage);
if(!pTempImagebuffer)
{
printf("分配动态内存失败!\n");
free(pTempImagebuffer);
return 0;
}
// 初始化动态内存
memset(pTempImagebuffer,0,pOptionHeader->SizeOfImage);
// 拷贝头部
memcpy(pTempImagebuffer,pDosHeader,pOptionHeader->SizeOfHeaders);
// 循环拷贝节表
PIMAGE_SECTION_HEADER pTempSectionHeader = pSectionHeader;
for(DWORD i = 0;iNumberOfSections;i++,pTempSectionHeader++)
{
memcpy((void*)((DWORD)pTempImagebuffer+pTempSectionHeader->VirtualAddress),(void*)((DWORD)pFileBuffer+pTempSectionHeader->PointerToRawData),pTempSectionHeader->SizeOfRawData);
}
// 返回数据
*pImageBuffer = pTempImagebuffer;
pTempImagebuffer = NULL;
return pOptionHeader->SizeOfImage;
}
//imagebuffer->newbuffer
DWORD CopyImageBufferToNewBuffer(PVOID pImageBuffer,PVOID* pNewBuffer)
{
// 初始化PE头部结构体
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
// 初始化NEW_BUFFER指针(temparay)
LPVOID pTempNewbuffer = NULL;
// 判断pImageBuffer是否有效
if(!pImageBuffer)
{
printf("(2pnewbuffer阶段)读取到内存的pimagebuffer无效!\n");
return 0;
}
//判断是不是exe文件
if(*((PWORD)pImageBuffer) != IMAGE_DOS_SIGNATURE)
{
printf("(2pnewbuffer阶段)不含MZ标志,不是exe文件!\n");
return 0;
}
// 强制结构体类型转换
pDosHeader = (PIMAGE_DOS_HEADER)pImageBuffer;
if(*((PDWORD)((DWORD)pImageBuffer+pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)
{
printf("(2pnewbuffer阶段)不是有效的PE标志!\n");
return 0;
}
// 强制结构体类型转换
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pImageBuffer+pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader+4); // 这里必须强制类型转换
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader+pPEHeader->SizeOfOptionalHeader);
//获取new_buffer的大小
int new_buffer_size = pOptionHeader->SizeOfHeaders;
for(DWORD i = 0;iNumberOfSections;i++)
{
new_buffer_size += pSectionHeader[i].SizeOfRawData; // pSectionHeader[i]另一种加法
}
// 分配内存(newbuffer)
pTempNewbuffer = malloc(new_buffer_size);
if(!pTempNewbuffer)
{
printf("(2pnewbuffer阶段)分配Newbuffer失败!\n");
return 0;
}
memset(pTempNewbuffer,0,new_buffer_size);
// 拷贝头部
memcpy(pTempNewbuffer,pDosHeader,pOptionHeader->SizeOfHeaders);
// 循环拷贝节区
PIMAGE_SECTION_HEADER pTempSectionHeader = pSectionHeader;
for(DWORD j = 0;jNumberOfSections;j++,pTempSectionHeader++)
{ //PointerToRawData节区在文件中的偏移,VirtualAddress节区在内存中的偏移地址,SizeOfRawData节在文件中对齐后的尺寸
memcpy((PDWORD)((DWORD)pTempNewbuffer+pTempSectionHeader->PointerToRawData),(PDWORD)((DWORD)pImageBuffer+pTempSectionHeader->VirtualAddress),pTempSectionHeader->SizeOfRawData);
}
//返回数据
*pNewBuffer = pTempNewbuffer; //暂存的数据传给参数后释放
pTempNewbuffer = NULL;
return new_buffer_size; // 返回计算得到的分配内存的大小
}
//newbuffer->存盘
int newbuffer_write2_exe(PVOID NewFileBuffer,DWORD FileSize, char* FilePath)
{
FILE* fp1 = fopen(FilePath,"wb");
if(fp1 != NULL)
{
fwrite(NewFileBuffer,FileSize,1,fp1);
}
fclose(fp1);
return 1;
}
int add_section(PVOID* pNewFileBuffer,PVOID pImageBuffer,DWORD FileSize)
{
// 初始化PE头部结构体
PIMAGE_DOS_HEADER pDosHeader = NULL;
PIMAGE_NT_HEADERS pNTHeader = NULL;
PIMAGE_FILE_HEADER pPEHeader = NULL;
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
PIMAGE_SECTION_HEADER pSectionHeader = NULL;
// 判断pImageBuffer是否有效
if(!pImageBuffer)
{
printf("读取到内存的pfilebuffer无效!\n");
return 0;
}
//判断是不是exe文件
if(*((PWORD)pImageBuffer) != IMAGE_DOS_SIGNATURE)
{
printf("不含MZ标志,不是exe文件!\n");
return 0;
}
// 强制结构体类型转换
pDosHeader = (PIMAGE_DOS_HEADER)pImageBuffer;
if(*((PDWORD)((DWORD)pImageBuffer+pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)
{
printf("不是有效的PE标志!\n");
return 0;
}
// 强制结构体类型转换
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pImageBuffer+pDosHeader->e_lfanew);
pPEHeader = (PIMAGE_FILE_HEADER)((DWORD)pNTHeader+4); // 这里必须强制类型转换
pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader+pPEHeader->SizeOfOptionalHeader);
// 判断代码区大小够不够
if(size_shellcode>(pSectionHeader->SizeOfRawData-pSectionHeader->Misc.VirtualSize))
{
printf("代码区空间不足!\n");
free(pImageBuffer);
return 0;
}
printf("pSectionHeader->PointerToRawData:%#x pSectionHeader->Misc.VirtualSize:%#x\n",pSectionHeader->PointerToRawData,pSectionHeader->Misc.VirtualSize);
printf("pImageBuffer:%#x\n",pImageBuffer);
// 将代码复制到空白区
PBYTE code_begin = (PBYTE)((DWORD)pImageBuffer+pSectionHeader->VirtualAddress+pSectionHeader->Misc.VirtualSize);
printf("pSectionHeader->VirtualAddress:%#X\n",pSectionHeader->VirtualAddress);
printf("code_begin:%#x\n",code_begin);
memcpy(code_begin,shellcode,size_shellcode);
// 修改E8 跳到messagebox
DWORD callAddr = (messagebox_add-(pOptionHeader->ImageBase+((DWORD)(code_begin+0xD)-(DWORD)pImageBuffer))); //(DWORD)code_begin+0xoD-(DWORD)pImageBuffer是E8下一条指令的地址的相对偏移
printf("callAddr:%#X\n",callAddr);
*(PDWORD)(code_begin+0x09) = callAddr; //填充数据
// 修改E9 跳回程序开始
DWORD jmpAddr = ((pOptionHeader->ImageBase + pOptionHeader->AddressOfEntryPoint)-(pOptionHeader->ImageBase+((DWORD)code_begin+size_shellcode-(DWORD)pImageBuffer)));
*(PDWORD)(code_begin+0x0E) = jmpAddr;
// 修改OEP
pOptionHeader->AddressOfEntryPoint = (DWORD)code_begin - (DWORD)pImageBuffer;
// imagebuffer->newfilebuffer
int size = CopyImageBufferToNewBuffer(pImageBuffer,pNewFileBuffer);
if(size = 0 || !pNewFileBuffer)
{
printf("imagebuffer->newfilebuffer失败!\n");
free(pImageBuffer);
free(pNewFileBuffer);
}
// 存盘
int ret4 = newbuffer_write2_exe(*pNewFileBuffer,FileSize, write_file_path);
if(!ret4)
{
printf("存盘失败!\n");
return 0;
}
return 1;
}
void operate_pe()
{
// 初始化操作
PVOID pFileBuffer = NULL;
PVOID pNewFileBuffer = NULL;
PVOID pImageBuffer = NULL;
DWORD NewFileBufferSize = 0;
// exe->filebuffer
int ret1 = ReadPEFile(file_path,&pFileBuffer); // &pFileBuffer(void**类型) 传递地址对其值可以进行修改
printf("exe->filebuffer 返回值为计算所得文件大小:%#x\n",ret1);
// filebuffer -> imagebuffer
int ret2 = CopyFileBufferToImageBuffer(pFileBuffer,&pImageBuffer);
printf("filebuffer -> imagebuffer返回值为计算所得文件大小:%#x\n",ret2);
// add_section
int ret3 = add_section(&pNewFileBuffer,pImageBuffer,ret1);
printf("%d",ret3);
free(pFileBuffer);
free(pNewFileBuffer);
free(pImageBuffer);
}
int main()
{
operate_pe();
return 0;
}
linux脚本打不开文件夹,为什么这个程序向文件地址和内存地址不一样的文件加入shellcode会导致文件打不开...相关推荐
- 计算机用户名和密码在哪个文件夹,登陆邮箱、论坛等的帐号和密码存放在电脑中的哪个文件夹中?...
├─WINDOWS │ ├─system32(存放Windows的系统文件和硬件驱动程序) │ │ ├─config(用户配置信息和密码信息) │ │ │ └─systemprofile(系统配置信息 ...
- 计算机开始里怎么没有运行程序,启动文件夹没有了? 解决电脑启动文件夹消失或程序开机自启失效的教程...
电脑开机后开始菜单里的启动文件夹没有了该怎么办?熟悉Windows系统的各位,应该都知道其自带的启动文件夹是方便让用户设置开机自启程序的目录,一般我们将要让其开机自动启动的程序的快捷方式直接放到启动文 ...
- android shell强制删除文件夹_别再乱清手机内存了,删除这3个“特殊”文件夹!空间释放8GB...
这样您就可以继续免费收到文章了. 完全都是免费订阅,请放心关注! 绝大部分的"爱国人士",都比较喜欢用安卓手机,尤其是华为手机,然而我们的安卓手机,因为系统的问题,在使用了一段时间 ...
- c语言prog1已停止工作,1.在考生文件夹下,要求程序PROG.C的功能是.doc
1.在考生文件夹下,要求程序PROG.C的功能是.doc 1.在考生文件夹下,要求程序PROG.C的功能是: 将字符串中所有的大写字母转换为小写,其它字符不变(不使用转换函数). 例如,当字符串为&q ...
- android 图片内存缓存文件在哪个文件夹,别再用手机管家清理内存了!1分钟删掉这些文件夹,内存多出几个G...
原标题:别再用手机管家清理内存了!1分钟删掉这些文件夹,内存多出几个G 你的手机内存还剩多少G?我们在使用手机时,都会产生大量的缓存数据,如果不定期清理,就会积少成多,导致手机内存空间爆满. 你有定期 ...
- 文件夹变成计算机程序,win7系统的文件夹显示成应用程序怎么办?电脑文件夹变成应用程序的修复教程...
win10 X64 游戏体验版 V2020.06 (64位)" class="fl" height="94" src="/upfiles/i ...
- java 文件夹文件改名_Java实现批量给文件或文件夹改名窗口程序
Java实现批量给文件或文件夹改名窗口程序 Java实现批量给文件或文件夹改名窗口程序 Java对文件夹或文件夹进行批量改名 说明 程序演示 操作前 对文件进行改名 对文件夹改名 代码区 说明 本人也 ...
- linux 文件夹tar.bz2压缩命令,使用tar命令提取(或解压缩)tar.bz2和tbz2文件的方法...
本文介绍使用tar命令提取(或解压缩)tar.bz2和tbz2文件的方法.tar命令允许你创建和提取tar归档文件,它支持各种压缩程序,例如gzip.bzip2.lzip.lzma.lzop.xz和c ...
- dll放在unity哪个文件夹下_程序丨如何将你的Unity代码整理到一个DLL中?
原标题:程序丨如何将你的Unity代码整理到一个DLL中? 翻译:林政(玄猫大人) 审校:沈晓霖 代码复用的重要性 这里有一则故事也是你听过类似的: 你下载好Unity,看完Youtube上的一些教程 ...
最新文章
- SAP模块常用增强总结
- 【11_83】Remove Duplicates from Sorted List
- linux服务器不会中毒,[转载]ubuntu 不会中毒的原因(转)
- JS动态插入HTML后不能执行后续JQUERY操作
- 计算机部门 消防安全隐患,市计算机:消防隐患勿轻视,安全意识常在心
- Spring mvc 重定向
- G++和C++区别和评测注意事项
- python的数据库操作_Python对数据库操作
- .Net转Java自学之路—基础巩固篇二十二(XML)
- centos转换linux格式,CentOS 下转换网易云音乐ncm格式为mp3
- oracle 18c suse,Installing Oracle Database 18c Using RPM Packages
- cad2012打开后闪退_win10系统打开CAd2012出现闪退的恢复方法
- 怎样查找计算机死机日志,怎么查看电脑死机记录
- [18调剂]上海海洋大学2018年硕士研究生调剂政策与规则
- 洛谷 U19159 采摘毒瘤
- 概率论:古典概型与伯努利概型
- Let's Use Chinaese in Flex Successfully
- 【汽车配件管理系统-管理员-配件管理模块】配件管理分类
- 《算法图解》学习笔记(五):哈希表,小名散列表(附代码)
- 计算机毕业设计php_thinkphp_vue的校园论坛网站
热门文章
- linux 目录权限 鸟哥,《鸟哥的Linux私房菜》第六章 Linux的文件权限与目录配置...
- 海外流量宝是个好产品吗?
- java 多关联字联合搜索_【lucene】高级搜索篇
- 汽车上的IG-on 和 ACC 有什么区别?
- 贩妖记 第七十九章,人质
- PixiJS 实现娃娃机
- 论文阅读:Dense Depth Priors for Neural Radiance Fields from Sparse Input Views
- 支付宝当面付D1/T1转D0实时到账的解决方案
- 使用PreScan构建交通场景——轨迹同步
- 你的副业是什么?有什么故事?