首页 > 其他分享 >使用010进行手动加壳

使用010进行手动加壳

时间:2024-12-25 09:10:58浏览次数:3  
标签:文件 Overlay 代码 手动 节表 010 加壳 地址 PE

删除PE_Overlay

找到最后一个节的区块,在那之后的数据全部删除掉。
其实不删掉也行,不过学习起来的时候就不方便区别最后一个节和Overlay了。

网上有资料说PE_Overlay指PE结构的最后一个节的末尾位置,通常用于存储自定义资源

[!NOTE]
PE结构的基础上,增加了处理逻辑代码+自定义的资源

PE_Overlay指PE结构的最后一个节的末尾位置,通常用于存储自定义资源

PE结构的最后一个节末尾+1个字节的位置就是OverLay的起点。(last_section.Raw_offset + last_section.Raw_size) = Overlay;

PE_Overlay指的是PE(Portable Executable)文件格式中的Overlay ,它是PE文件的最后一个节(section)的末尾位置之后的额外数据。 在PE文件加载时,操作系统会将整个文件映射到内存中,其中Overlay部分通常被忽略。这部分数据可以用于存储任意类型的自定义资源,例如图像、音频、配置文件等,而不影响PE文件的正常执行。

Overlay的存在可以让开发者在不修改PE文件的基本结构的情况下,向其添加额外的数据。这对于包含了大量资源或者需要动态更新的程序来说非常有用。在安装包中,Overlay常常被用来存储自定义资源,例如软件的图标、帮助文件、配置文件等等。虽然Overlay不是PE文件的必需部分,但它为软件开发者提供了一个便捷的方式来扩展程序的功能。

关闭随机基址

将1改为0
image

添加节表

插入节表空间

在最后一个节表的地方插入n个字节大小的区域,这一块区域是为了写节表
这个n是参考 NT头的可选文件头里的FileAlignment的,如果是0x200就插入0x200个字节
快捷键:{Ctrl+Shift+I}
image

然后第一个节到最后一个节的PointerToRawData添加0x200,即节在磁盘文件上的偏移
如:400h->600h
image

Tips:如果想要插入的节表的空间足够0x28,那么就不用插入了,可以直接覆盖数据。
但是我编译出来的HelloWorld是需要插入了,就拿HelloWorld.exe学习了。
image

修改节的数量

NT头--文件头--节的数量:15改成16
image

修改SizeOfHeader

SizeOfHeaders是DOS头+PE头+区块表的总大小,后面的区块表更新了,所以这个也要更新的来着。
400h->600h
image

修改插入的节表的数据

参照着上面的填,
节表名字取名为.custom
union:实际使用的区块大小,该值可以不准确,所以申请了多少填多少,主要看壳代码的大小,学习示例申请1000h
VirtualAddresss:装载到内存中的RVA,这个要参照页对齐大小(在NT头的可选文件头里SectionAlignment),是0x1000h,所以在虚拟内存中,上一个表的0x11000+0x200=0x11200会对齐为0x12000h
SizeOfRawData:1000h,参考union,主要看壳代码的大小
PointerToRawData:6A00h,在磁盘文件中的偏移,上一个表的0x6800h+0x200h计算得到的
在节表最后的地方对Characteristics进行修改,修改可读可写可执行权限:0h->1h
image

添加节

申请空间

在最后一个节的末位插入申请的字节空间:0x1000h
image

修改节为壳的代码

为了简化学习,壳变成以下汇编

add ecx,0x17
jmp ???

其中,???为程序原始入口地址,如下图,原入口为:0x4014E0
image

然后将exe文件拖入IDA或者OD用插件patch得到对应字节码,然后在010里面修改
image

83 C1 17   
E9 D8 F4 FE FF

修改入口点

AddressOfEntryPoint表示的是代码入口的RVA地址。也就是说,把一个文件加载到内存的时候,基地址加上AddressOfEntryPoint就是我们的入口代码地址

首先清楚这个0x14E0h是怎么计算得到的:

在磁盘文件中,实际的代码地址是8E0h,位于第一个表中
image

首先得到第一个表的信息:
image

第一个表在磁盘文件中的偏移为400h,实际代码地址为8E0h,
也就是说 实际的代码地址相对于第一个表的起始地址的偏移为4E0h,
这个地址位于第一个表的第0x4E0处,然后加上第一个表的VirtualAddress虚拟起始地址0x1000h,最后就得到了0x14E0h

注意:加的不是BaseOfCode,例如:如果换成了第二个表中的代码的话,那么就是需要用第二个表的VirtualAddress了。
image

然后要将0x14E0h修改为壳的VirtualAddress+偏移为0(因为是直接就在表的开始就注入了那两条简易汇编了)=0x12000h


实际上就三个值:
第一个值:汇编所在的表的 PointerToRawData
第二个值:磁盘文件中的 入口汇编代码 的地址
第三个值:汇编所在的表的 VirtualAddress
AddressOfEntryPoint=2-1+3

image

那是将0x14E0h改为0x6A00h吗?
错误!0x6A00h对应的是磁盘文件的入口,不是映像内存的入口,需要通过以上方法计算:
第一个值:6A00h
第二个值:6A00h
第三个值:12000h
==>相对偏移=0,所以直接就是VirtualAddress=0x12000h

修改SizeOfCode

1E00h还要再加上壳的代码的大小(0x1000h)=2E00h

修改SizeOfImage

映像装入内存后的总大小,必须满足页对齐
加上壳的代码的大小,12000h->13000h
image

最后成功加壳并运行!

标签:文件,Overlay,代码,手动,节表,010,加壳,地址,PE
From: https://www.cnblogs.com/zydt10/p/18629225

相关文章

  • M00010-MATLAB水力压裂模型2d和3d水力压裂模型求解器
    水力压裂(HydraulicFracturing)是一种广泛应用于石油和天然气开采中的技术,主要通过向地下岩层注入高压液体,诱发岩石裂缝的产生和扩展,从而提高油气的采收率。随着对非常规油气资源(如页岩气、致密油等)的需求增加,水力压裂技术得到了广泛应用。为了更好地理解和优化水力压裂过程,学者们......
  • Django在模型表中添加手动校验的方式
    下面的示例主要运用于代码层面的去重处理,不在数据库层面增加唯一键#导入依赖fromdjango.dbimportmodelsfromdjango.utils.translationimportgettext_lazyas_fromrest_framework.exceptionsimportAPIExceptionfromdjango.contrib.authimportget_user_model......
  • 我在使用Rust编程时,只在编译期提示要手动标注生命周期时才进行标注,这样可以吗?
    在使用Rust编程时,只在编译器提示需要标注生命周期时才进行标注是一种可以接受的初学者实践,但随着经验积累和代码复杂度增加,这种方式可能会有以下问题和限制:1.优点:简单、快速入门编译器友好:Rust的借用检查器非常强大,大部分情况下会推断出正确的生命周期,尤其是在简单的函数......
  • 【工具变量】上市公司企业供应链成本分担数据(2010-2023年)
    一、测算方式:参考C刊《经济管理》刘红霞老师(2024)的做法,从绿色投资企业与供应链其他成员企业关系层面出发,使用两个指标测度供应链成本分担:一是单向供应链成本分担总额(CS_get),是绿色投资企业从供应链其他成员企业获取的成本分担,强调了链上企业对绿色投资企业单向的成本分担水平,使......
  • 【 Node.js 升级16至18出现“Error: error:0308010C”】
    node:internal/crypto/hash:71this[kHandle]=new_Hash(algorithm,xofLen);^Error:error:0308010C:digitalenveloperoutines::unsupportedatnewHash(node:internal/crypto/hash:71:19)rror:error:0308010C:digitalenveloperoutines::unsupportedatnewHa......
  • 手动转发朋友圈太麻烦?快试试这个高效神器!
    面对朋友圈运营的种种挑战,你是否还在为频繁切换微信账号、复制文案和保存图片而烦恼?现在,有了这款高效神器——微信管理系统,一键转发朋友圈不再是梦。1、一键转发只需轻轻一点,系统便会自动复制内容,并跳转至发朋友圈的页面,免去了繁琐的复制粘贴步骤,既节省时间又方便快捷。2......
  • Ubuntu 22.04手动安装MYSQL5.7
    1、下载安装包:mysql-server_5.7.41-1ubuntu18.04_amd64.deb-bundle.tar 2、解压安装包tarxvfmysql-server_5.7.41-1ubuntu18.04_amd64.deb-bundle.tar3、先安装依赖lib包sudoapt-getupdatesudoapt-getupgradesudoapt-getinstall./libmysql*sudoapt-getin......
  • [SCOI2010] 股票交易
    思路乍一看非常的复杂,实际上也非常的复杂令\(f_{i,j}\)表示第\(i\)天持有\(j\)股的最优赚钱我们可以枚举从什么地方转移而来,列出柿子\[f_{i,j}=\max\{f_{i-1,j},\max_{k}[f_{i-w-1,k}-AP_i\cdot(j-k),f_{i-w-1,k}+BP_i\cdot(k-j)]......
  • 如何将java私有库(jar)提交至公服/公共仓库(central repository)-手动版
    如何将java私有库(jar)提交至公服/公共仓库(centralrepository)-手动版转载请著名出处https://www.cnblogs.com/funnyzpc/p/18610692准备GunPG(用于asc签名)项目代码(建议是maven结构的)sonatype账号(https://central.sonatype.com/api/auth/login)MavenHelper(Idea插......
  • 【Z函数】codeforces 2010 C2. Message Transmission Error (hard version)
    前言Z函数的定义对于一个字符串\(s\),定义Z函数\(Z[i]\)为以\(s[i]\)为起始位置的后缀与整个字符串\(s\)的最长公共前缀的长度。Z函数的应用字符串匹配问题题目https://codeforces.com/problemset/problem/2010/C2题意给定一个字符串\(s\),若其可以找到真前缀......