[讨论]如何编程修改exe内存里的数据,并将结果保存到exe

n00000000p 2006-12-24 07:53:34
例如一个MessageBox的代码,要求编程实现修改数据:

.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

.data
szText db '你可以把我修改成别的内容吗',0

.code
start:
invoke MessageBox, NULL, addr szText,NULL, MB_OK
invoke ExitProcess,NULL
end start

现在编译这个代码,然后在这个程序的内存中修改并且保存szText的内容...

按照一般的思路是,在修改之前,首先找到它的内存地址或者它本身,例如下面代码是在这个exe中寻找“你可以把我修改成别的吗”这个字符串:


.data
szText db '你可以把我修改成别的吗',0

invoke CreateFile,_lpszFile,GENERIC_READ,\ ;打开找到的文件
FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax != INVALID_HANDLE_VALUE
mov @hFile,eax
invoke GetFileSize,eax,NULL
mov @dwFileSize,eax
.if eax
invoke CreateFileMapping,@hFile,\
NULL,PAGE_READONLY,0,0,NULL
.if eax
mov @hMapFile,eax
invoke MapViewOfFile,eax,\
FILE_MAP_READ,0,0,0
.if eax
mov @lpMemory,eax

mov ecx, @dwFileSize ;保存文件长度
sub ecx,10; 子字符串长度减 1
mov esi, @lpMemory ;保存共享句柄
@@:
mov edi, offset szText
push ecx
push esi
mov ecx,13 ; 子字符串长度
repe cmpsb ;这里对比,如果不符合,就继续
pop esi
pop ecx
je @f
inc esi
loop @b
@@:
.if ecx != 0 ;找到了字符串
;这里开始处理.....

至于怎么替换掉szText ,并把它保存成我想要的数据,这里我就不懂了,请朋友们指教!

顺便在问一下,win32汇编里有RtlZeroMemory,怎么就没有RtlCopyMemory..

怎么用另外的方法来实现和RtlCopyMemory相同的功能?

是否这样实现:
invoke lstrlen,addr szBuffer
lea esi,szBuffer
mov edi,lpData
add edi,000800h
mov ecx,eax
cld
rep movsb

还有其他方法吗?

...全文
619 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
n00000000p 2006-12-25
  • 打赏
  • 举报
回复
如果利用内存共享查找捏?调用MapViewOfFile的时候,可写就行.例如
invoke MapViewOfFile,eax,FILE_MAP_WRITE,0,0,0
...然后自动保存到磁盘,我自己写代码测试一下 :-)
csShooter 2006-12-25
  • 打赏
  • 举报
回复
up
zara 2006-12-25
  • 打赏
  • 举报
回复
查找资源是否成功, 在 FindResource 后检查下 eax 就可以了. 对于 exe 文件的结构, 还是比较复杂的, 我自己没有实际操作过. 可以参考 http://211.90.241.130:22366/view.asp?file=38 (罗云彬的编程乐园) 侯捷翻译的 "Winfows 系统程序设计 - 大解密" 的第八章 "PE 与 COFF OBJ 档案格式" 的介绍
n00000000p 2006-12-24
  • 打赏
  • 举报
回复
zara能给出一段代码我参考一下吗?  :-)
zara 2006-12-24
  • 打赏
  • 举报
回复
首选开始的查找资源是否成功; 其次, exe 文件不仅仅是资源就可以的, 它有一定的结构要求的
n00000000p 2006-12-24
  • 打赏
  • 举报
回复
那如何导出一个程序的二进制资源,然后存为exe?

下面是主要代码,不过我导出的时候却是一个空的exe,

   invoke FindResource,NULL,ASM,RT_RCDATA ;查找ASM资源
mov hRsrc,eax
invoke SizeofResource,NULL,hRsrc
mov dwSize,eax
invoke LoadResource,NULL,hRsrc
mov hResData,eax
invoke GlobalAlloc,GPTR,dwSize
mov lpData,eax
invoke LockResource,hResData
mov lpRes,eax
invoke lstrcpyn,lpData,lpRes,dwSize
invoke lstrlen,addr szBuffer
lea esi,szBuffer ;esi=szBuffer
mov edi,lpData ;edi=lpData
add edi,000800h ;edi=lpData+000800H
mov ecx,eax ;ecx=szBuffer的长度
cld
rep movsb
invoke CreateFile,offset szName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.if eax != NULL
mov hFile,eax
invoke WriteFile,hFile,addr lpData,dwSize,addr dwSizeWritten,NULL
invoke MessageBox,hWnd,offset szText,offset szCaption,MB_OK
invoke CloseHandle,hRsrc
invoke CloseHandle,hResData
invoke CloseHandle,hFile
invoke GlobalFree,lpData

我啃 2006-12-24
  • 打赏
  • 举报
回复
要访问和修改人家的内存
zara 2006-12-24
  • 打赏
  • 举报
回复
RtlMoveMemory 就是内存块复制功能, 是你想像的 RtlCopyMemory 的功能

如果要对运行中的文件进行修改的话, 是不能的. 正在运行的程序模块文件是被系统保护的.
如果不是特别的需用, 可以通过其它方式来改变不同的使用内容, 比如是注册表, 自己的配置文件等等, 而不非得去修改自己
打开链接下载源码: https://pan.quark.cn/s/e18529987bb9 ### ETS中文教程:KNX施耐德智能家居 #### 知识点一:ETS软件概述与启动 ETS(Engineering Tool Software)是由施耐德电气研发的一款专业设计工具,其核心功能在于构建和配置基于KNX标准的智能家居及楼宇自动化系统。KNX代表一种国际公认的开放式标准,该标准在楼宇自动化领域得到广泛应用,其目的是实现不同品牌设备之间的互联互通。 **软件启动方法**:ETS软件可以通过双击其图标来启动,或者从开始菜单中选择“File”->“New Project”,亦或直接使用Ctrl+N快捷键来启动该软件。 #### 知识点二:工程项目创建 在启动新的工程项目时,需要遵循以下流程: 1. **项目命名**:推荐使用数字与字母的组合来命名项目,例如“Officebuildings”,这样的命名方式有助于日后的管理和识别。 2. **构建建筑物模型**:在“Buildings/Functions”部分添加建筑物,自定义其名称(例如“mg”),并确认创建操作。 3. **添加房间**:针对每一个建筑物,可以进一步添加房间,同样地,为房间自定义名称(如“1F”),以此来构建完整的建筑模型。 #### 知识点三:设备加载与配置 设备加载是ETS软件中的核心环节,其作用在于将实际的智能设备(包括开关、传感器等)整合到项目中: 1. **设备加载过程**:在目标房间处进行右键点击,选择“Add Devices”,随后通过“Product Finder”对话框选择合适的制造商和产品系列,以此来加载所需的设备类型。 2. **地址分配**:在设备加载完成后,应手动为其分配独...
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 在客户端编程中,有时我们需要对用户上传的Excel文件内容进行管理,并将其转化为JSON格式以便进行后续操作或与服务器端进行数据交换。这一过程通常包含文件读取、数据解析以及格式转换等步骤。以下是一些关于如何运用JavaScript达成这一功能的核心要点: 1. **File API**:在当前版本的浏览器中,我们可以借助File API来获取用户上传的文件。`FileReader`对象提供了异步获取文件内容的方法,例如`readAsArrayBuffer()`,用于读取文件内容。 2. **XLSX库**:由于浏览器自带的API不直接支持Excel文件的解析,我们需要借助第三方库。其中,`xlsx`库是一个广受欢迎的选择,它能解析多种Excel文件格式(如XLS、XLSX、CSV等)并提供便捷的数据操作接口。 3. **获取Excel文件**:借助`xlsx`库,我们首先需要将File API获取到的`ArrayBuffer`转换为可解析的格式。例如,可以调用`XLSX.read(arrayBuffer, {type: buffer})`进行格式转换。 4. **解析工作表内容**:`xlsx`库解析完成后,会返回一个对象,其中包含了所有工作表的信息。我们可以通过`XLSX.utils.sheet_to_json(worksheet)`方法将单个工作表转换为二维数组,这类似于Excel中的表格数据。 5. **转化为JSON对象**:二维数组可以很方便地转化为JSON对象。遍历数组,每行数据作为JSON对象的一个属性,属性名为单元格的列名,属性值为单元格的值。可以使用`Arr...
源码下载地址: https://pan.quark.cn/s/de26074cf420 CadLib4.0被定位为一个功能丰富的.NET CAD类库,它为开发人员提供了在C#或其它.NET编程语言环境中嵌入CAD功能的可能性,从而简化了DWG和DXF文件的构建与修改过程。这个压缩文件内含了必要的DLL组件以及一个基于WinForms的应用实例,该实例清晰展示了在Visual Studio 2010开发环境中如何进行CAD文件的读取和处理,特别是对于AutoCAD 2014所支持的最新文件格式具备良好的兼容性。 1. **CadLib**:CadLib作为核心的类库,为与AutoCAD的DWG和DXF文件进行交互提供了接口和实现机制。它通过封装CAD数据结构和相关操作,让开发人员无需深入探究底层CAD格式细节,即可便捷地完成CAD文件的输入输出操作。 2. **WW.Cad.dll**:此DLL文件被视为CadLib的核心构成部分,其中汇集了所有与CAD操作直接关联的类和函数。例如,开发人员可借助此库来初始化新的图纸,向其中添加各类几何元素(比如直线、圆形、多段线等),或是提取已有图纸中的数据信息。 3. **WW.dll**:该DLL可能扮演着CadLib的辅助角色,面存放了通用的工具函数和类,它们为CadLib各项功能的实现提供了支持。这些功能可能涵盖数据转换、异常管理或图形的视觉呈现等方面。 4. **WW.Pdf.dll**:此文件或许具备将CAD图纸内容转换为PDF文档的能力。开发者可利用这一特性,将设计成果导出为PDF格式,方便进行打印或在线传播,而无需借助AutoCAD软件。 5. **WW.GL.dll**:从其命名推断,该文...

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧