文件增加节(汇编),插入自己的代码
根据提供的文件信息,我们可以深入探讨有关“文件增加节(汇编)”的相关知识点。这部分内容主要涉及了在汇编语言中如何对一个PE文件(可移植执行格式文件)进行修改,特别是添加新的节(section)。这是一项较为高级的技术,通常用于软件开发、逆向工程或者恶意软件分析等领域。 ### 文件增加节的概念 在计算机科学中,文件增加节指的是在现有的可执行文件(例如Windows下的PE文件)中添加一个新的内存段或存储区域。这通常是通过修改PE文件的结构来实现的,涉及到PE文件格式的理解与操作。对于汇编程序员来说,掌握这一技术可以帮助更好地控制程序的布局和内存使用方式。 ### PE文件格式简介 PE文件格式是微软操作系统中用于组织可执行文件、对象代码、动态链接库等的标准文件格式。一个典型的PE文件由多个部分组成,包括DOS头、PE签名、NT头(包含文件头和可选头)、节表以及各个节本身的数据。这些部分共同定义了一个程序的内存布局、数据初始化状态等重要信息。 ### 文件增加节的具体步骤 根据提供的代码片段,我们可以将文件增加节的过程大致分为以下几个步骤: #### 1. 文件读取验证 代码尝试打开并读取指定路径下的文件(此处为`c:\\FREEPRO.exe`),并检查是否成功获取文件句柄。如果失败,则输出错误信息并退出。 ```assembly invoke CreateFile, offset szfilename, GENERIC_ALL, FILE_SHARE_READ+FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ``` #### 2. 检查PE文件头 接下来,程序会验证读取到的数据是否符合PE文件的格式要求。具体而言,它会检查DOS头中的魔法数字(`e_magic`字段)是否为`'ZM'`(即`0x5A4D`),以及PE头中的魔法数字是否为`'EP'`(即`0x5045`)。 ```assembly .if [eax].e_magic != 'ZM' cout "No MZ SINGATURE!!" jmp error_exit .endif ... .if [edi].Signature != 'EP' cout "NO PE SINGATURE!!" jmp error_exit .endif ``` #### 3. 保存原始信息 为了后续能够正确地更新PE文件的结构,程序会保存一些关键信息,如原始的映像基地址(`ImageBase`)、原始入口点(`AddressOfEntryPoint`)等。 ```assembly moveax, [edi].OptionalHeader.ImageBase mov dw_old_imagebase, eax moveax, [edi].OptionalHeader.AddressOfEntryPoint mov dw_old_entrypoint, eax ``` #### 4. 添加新节 在确认了文件格式正确并且保存了必要信息后,下一步是实际添加新节。这部分代码没有给出完整实现,但通常涉及创建新的节头、更新节表以及调整可选头中的字段值等操作。 ### 实际应用中的注意事项 - **兼容性问题**:不同的编译器可能使用不同的PE文件结构,因此在编写代码时需要注意兼容性。 - **安全性考虑**:直接修改PE文件可能会引入安全风险,尤其是在处理系统级别的程序时更需小心。 - **测试与调试**:修改后的程序应该经过充分的测试以确保其功能性和稳定性。 - **代码规范性**:尽管提供的代码片段中存在一些不规范之处(例如变量命名、注释风格等),但在实际项目中应保持良好的编码习惯。 “文件增加节(汇编)”是一项涉及PE文件格式理解与操作的高级技能。掌握这项技能不仅能够帮助开发者更深入地理解程序的内部机制,还能够在特定场景下解决复杂的问题。
.model flat,stdcall
option casemap:none
include macro.asm
include windows.inc
include gdi32.inc
include kernel32.inc
include masm32.inc
include user32.inc
includelib gdi32.lib
includelib kernel32.lib
includelib masm32.lib
includelib user32.lib
.data
SIZE_DOSNT EQU SIZEOF IMAGE_DOS_HEADER+SIZEOF IMAGE_NT_HEADERS
szfilename BYTE "c:\\¸´¼þ FREEPRO.exe",0
hfile DWORD 0
szbuffer BYTE SIZE_DOSNT dup(0),0
dw_read DWORD 0
dw_base DWORD 0
dw_old_imagebase DWORD 0
dw_old_entrypoint DWORD 0
dw_added_section DWORD 0
dw_image_size DWORD 0
dw_filealignment DWORD 0
sz_sec_name BYTE "lc.",0
szdllname BYTE "User32",0
szfuncname BYTE "MessageBoxA",0
MessageBoxA_Addr DWORD 0 ;put in here why is ok????
dw_added_sizeofrawdata DWORD 0
dwPE_Header_OffSet DWORD 0
dw_added_sect_offset DWORD 0
.code
;******************MainProc**********************
main proc
cout "Hello,MyGod!!!"
;=======================
;Check if be a pe file
;=======================
invoke CreateFile,offset szfilename,GENERIC_ALL,FILE_SHARE_READ+FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
.if eax==INVALID_HANDLE_VALUE
cout "CreateFile error !"
jmp error_exit
.endif
mov hfile,eax
invoke ReadFile,hfile,offset szbuffer,SIZE_DOSNT,offset dw_read,0
.if eax==0
cout "ReadFile error !"
jmp error_exit
.endif
mov eax,offset szbuffer
mov dw_base,eax ;save the baseimage
assume eax:ptr IMAGE_DOS_HEADER
.if [eax].e_magic!='ZM'
cout "No MZ SINGATURE!!"
jmp error_exit
.endif
剩余9页未读,继续阅读
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HTML与CSS制作的静态圣诞树图案教程
- 基于STM32单片机的智能晾衣架高分项目源码(小白也可实战).zip
- STM32+ESP8266 WIFI遥控小车源码
- C# winform新版盒盖机[完整源码解压后1.8G].zip
- Python实现控制台圣诞树图形打印
- node-v20.10.0-x64.msi 下载
- 约瑟夫问题及递推公式的计算机科学应用
- 基于stm32f103c8t6的智能台灯源码
- 本地磁盘学习使用仅供参考
- C# winform-SerialPort串口Demo.zip
- putty远程连接服务器利器,ssh连接工具
- 二维码生成工具,适用于window平台汉字转二维码的工具,文本传输
- openEuler 22.03-SP4 在线部署 Kubernetes
- C# WPF-CCS线体,写的测试MES用的Demo .zip
- 自动蒸馏清洁机sw18可编辑全套技术开发资料100%好用.zip
- C++实现Qt和Mysql的智能停车场管理系统源码+数据库(高分项目)