- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
据我所知,在 PE
文件中,Virtual Size 显示加载期间为部分分配的空间大小,Raw Size 显示该部分在磁盘上的大小。
我遇到了这个执行以下操作的可执行文件:
它从原始数据大小(offset 0x10
)中减去虚拟大小(offset 0x8
)并确保有一些空间(例如 100 字节)。在文本部分标题的偏移量 0x14
处,它找到了该部分本身在文件中的偏移量。它将虚拟大小添加到此,找到该部分在文件中结束的位置。它复制了一些 shellcode(最终跳转到可执行文件的原始入口点以确保原始可执行文件运行)到二进制文件文本部分的末尾。
现在我在这里有点困惑,如果虚拟大小显示将分配给可执行文件的确切空间,不会在 .txt
部分末尾添加代码覆盖可执行文件的一些其他数据让它崩溃?谢谢。
最佳答案
这是一个很好的问题,说明了关于 Windows 加载程序如何计算内存大小的一个非常重要的观点(或者你可能会说怪癖)。
PE/COFF 规范确实将 VirtualSize 描述为“加载到内存中时该部分的总大小”。如果您认为 total 是包含该部分的 REAL 数据总量,这在技术上是正确的,但它不是 Windows 为该部分分配的内存总量。您会发现 VirtualSize 通常小于 Windows 为内存中的部分分配的数量,因为 VirtualSize 必须向上舍入到最接近的内存对齐值(在 PE 镜像中设置)。
换句话说,VirtualSize 表示该部分的未舍入大小,而 SizeOfRawData 是图像文件中数据的大小,但舍入到最接近的文件对齐填充值。这就是 VirtualSize 是内存或磁盘上数据真实“原始”大小的更好表示的原因。 PE/COFF 规范没有做出这种区分。为什么一个在图像文件中是圆形的,而另一个不是圆形的,这可能与向后兼容性有关。
这就是为什么您的 shellcode 使用 VirtualSize 来查找数据的“真实”端,即使它驻留在图像文件中也是如此。毫不奇怪,您可以通过将 VirtualSize 四舍五入到文件对齐值来计算 SizeOfRawData,至少在格式良好的 PE 文件中是这样。
shellcode 只是使用 VirtualSize 来找到 REAL 代码的结尾。在 SizeOfRawData 字节和 SizeOfRawData 字节之间,只是未使用的填充零,使其成为添加新代码而不影响文件大小或破坏 PE 文件内寻址偏移的主要位置。
总而言之,Windows 加载程序实质上采用 VirtualSize 值并将其四舍五入为内存对齐值以获得内存分配的实际大小(甚至可能四舍五入到最接近的 4k 最小内存页)。然后将最多 SizeOfRawData 字节从文件复制到内存部分的开头。如果小于该段在内存中的大小,则剩余部分补零。
关于c++ - PE : Adding code at the end of . txt 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44927518/
根本不是 SQL 人员。让顾问编写以下代码。 首先,它确保只选择了一所小学 - 然后,在 BEGIN 之后,如果变量 @Term 等于 3,我们想要在 IF 语句下执行操作。问题就在这里。当 @Ter
以下 javascript 将 bool 值呈现到每个语句的右侧: var reg = new RegExp(/^[\w\/].*result\b/); console.log(reg.test('p
有什么区别: x = 1 while x < 5 do x += 1 print x end 和: x = 1 while x < 5 x += 1 print x end 将 do
对于初学者来说,我是编程的“菜鸟”,所以只需了解事情的工作原理并向社区寻求帮助。 但是...我想知道的是: 我想要构建一个 Web 应用程序,两个主要用户界面之一实际上是日历产品。每个日历项目都有 8
我正在尝试制作带有图片上传选项的表单。我正在使用 express-http-proxy作为我的 API 代理和 multer按照建议。 app.use('/api', upload.any(), pr
根据this中的回答和 this问题,C++ 标准在 § 23.2.1 中声明 end() 对于所有 STL 容器都具有恒定的时间复杂度。 如果我理解正确的话: std::forward_list 只
当我使用 css 属性 align-items 时,我看不到 flex-end 值或 end 值有任何视觉差异>. align-items: end 和 align-items: flex-end 有
Sub RowRangeMove() Sheets.Add().Name = "CopySheet" With Sheets("BigDataSet - Copy")
假设第 1 到 5,000 列中有 25,000 到 50,000 行数据,每列可能有不同的行数。所有数据都是连续的,即列中没有空行,也没有空列。 考虑以下代码 Dim i As Long Dim W
我在 MYSQL 中有一个表,必须在 postgresql 中转换它。 我正在使用以下命令创建表格。 create table emp(COMPLETE BOOLEAN NOT NULL, END B
我正在尝试使用 Lark 为 BASIC 创建一个 LALR 解析器,而且我很难解决“END”语句和“END IF”等语句之间的冲突。这是语法的简化版本: %ignore /[ \t\f]+/ pro
试图理解this MSDN sample但我对这些行感到困惑: IAsyncResult result = Dns.BeginGetHostEntry(args[0], null, null); Co
我在 http://www.sgi.com/tech/stl/nth_element.html 阅读了 std::nth_element 的描述 template void nth_element(
为什么标准将 end() 定义为末尾,而不是实际末尾? 最佳答案 最好的论据是Dijkstra himself 提出的论据。 : 您希望范围的大小是一个简单的差异end - begin; 当序列退化为
我试图根据一些参数停止页面的其余部分加载;但不确定语法是否正确。 @if(dayRes + dayTri == 2){Sorry, etc @Response.End} 上面抛出这个错误: CS150
在二分搜索中,我们通常有 low 和 high 变量,并且通常有一个 while 循环来测试 low <= high,如以下代码所示(来自维基百科): int SortedArray[max] = {
我将 MS-Test 与 Visual Studio 2010 和 Visual Basic 结合使用。 在下面的函数中,代码覆盖率告诉我,有一个未检查的 block ,并且带有 “End Try”
所以今天我一直致力于使用 Protractor 为 Angular JS 应用程序设置端到端测试。为了编写更清晰的测试,我使用了 Protractor 网站上描述的 Page Object 模式。 测
所以 meteor js 的全部意义在于允许用户一次对整个堆栈进行编码,但是如果我正在使用像 django 这样的旧框架之一,可以借用meteor js的前端代码吗?比如前端的数据库同步,模板化,或者
我正在使用 wavesurfer.js 和 recorder.js 制作采样器。一切都很顺利,除了我无法使用 play([start[, end]]) 调整循环长度。 wavesurfer.seekT
我是一名优秀的程序员,十分优秀!