文件增加节(汇编),插入自己的代码
根据提供的文件信息,我们可以深入探讨有关“文件增加节(汇编)”的相关知识点。这部分内容主要涉及了在汇编语言中如何对一个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币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python爬虫入门实例教程.docx
- 基于Qt的文献管理系统.zip学习资料程序
- Arduino IDE 2 入门指南.pdf
- YOLO目标检测入门实例教程.docx
- 使用外部的抽奖游戏网站的开奖接口进行开奖,网站使用php搭建,游戏使用java运行.zip
- 使用Java Swing创建飞机大战小游戏.zip
- 升官图游戏 java.zip学习资料程序
- webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发 webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料
- NFC测试不灵敏,NFC工具
- javaweb-高校学生选课系统项目源码.zip