• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >汇编语言 > 用程序修改PE使其可显示一个消息框

用程序修改PE使其可显示一个消息框

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2017-06-28

匿名通过本文主要向大家介绍了pe程序,u盘pe安装程序,大白菜u盘pe安装程序,pe安装程序,老毛桃的pe程序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
</div>

该程序可从命令行提取一文件名,或出现对话框要求选择一文件,该文件必须是有效的PE可执行文件,如果该程序中曾使用动态链接库USER32.dll中的函数MessageBoxA,则向该程序中新添加一段指令,用来显示一个消息框,若未曾使用此函数,则不再修改此文件。由于本人对PE格式文件认识肤浅,程序可能不够完善,仅供初学者参考,高手看看,可提些改进意见!

本程序在运行时要修改代码段,编译方法可参考“系列11:把数据写到代码段”。

本程序不增加源程序大小,不适合对手工处理的PE文件操作。

----------------------------------------------------------------------
;文件名:19.asm
此文用老罗的代码着色器处理,在此向老罗表示感谢!
.386
.model flat,stdcall
Option CaseMap:none
include windows.inc
include kernel32.inc
include user32.inc
include comdlg32.inc
includelib kernel32.lib
includelib user32.lib
includelib comdlg32.lib
    .data
ofn       OPENFILENAME <0>           ;打开文件对话框要用到该结构
FileName    db 256 dup(0)
Caption     db 'GetCommandLine',0
FilterString  db '可执行文件(*.exe)',0,'*.exe',0,0 ;文件过滤器字符串
DialogTitle   db '请选择要打开的文件', 0
MessageTitle  db '你选择的文件',0
NoFileError   db '程序没有选择文件,不能继续进行!',0
ErrorTitle   db '警告',0
ErrorPEFormat  db '无效的PE格式文件',0
RightPEFormat  db '有效的PE格式文件',0
szDll      db 'USER32.dll',0
szFunction   db 'MessageBoxA',0
ErrorMessage  db '所选文件中不曾使用 MessageBoxA 函数!',0
CanNotModify  db '原代码段内不足以放下新增部分!',0
OkModify    db '所选程序已经被成功修改!',0
    .data?
hFile      dd ?
hMap      dd ?
pMapAddr    dd ?
ptext      dd ?
prdata     dd ?
MsgBoxA     dd ?
GetFileNameFromCommandLine  PROTO  :LPSTR
ModifyFile PROTO :LPSTR
    .code
start:
    call GetFileName  ;取文件名
    .if eax==NULL    ;无文件名
    invoke MessageBox,NULL,addr NoFileError,addr ErrorTitle,MB_ICONEXCLAMATION
    .else
    call WinMain  ;修改文件
    .endif
    invoke ExitProcess,NULL
WinMain proc
    invoke CreateFile, \         ;打开文件,该函数具有多种功能
    addr FileName,\            ;指向要打开的文件名字符串
    GENERIC_READ or GENERIC_WRITE ,\   ;打开的文件具有读写的权限
    FILE_SHARE_READ or FILE_SHARE_WRITE,\ ;别人也可读写此文件
    NULL, \                ;95下不用
    OPEN_EXISTING, \           ;要打开的文件必须存在
    FILE_ATTRIBUTE_NORMAL,\        ;文件的属性
    NULL                 ;95下必须是NULL
    .if eax!=INVALID_HANDLE_VALUE     ;判断文件是否已正常打开
    mov hFile, eax           ;保存文件句柄
    invoke CreateFileMapping, \ ;Creat File mapping Object
    hFile, \          ;Identifies the file from which to create a mapping object
    NULL, \           ;ignored
    PAGE_READWRITE, \      ;access
    0, \             ;high-order 32 bits of the maximum size
    0, \             ;low-order 32 bits of the maximum size
    NULL             ;the mapping object is created without a name
    .if eax!=NULL        ;
    mov hMap,eax       ;the return value is a handle to the file-mapping object
    invoke MapViewOfFile,hMap,FILE_MAP_WRITE,0,0,NULL ;映射文件到内存
    .if eax!=NULL
    mov pMapAddr,eax         ;保存返回的内存块首地址
    invoke ModifyFile,pMapAddr    ;修改内存块内容
    invoke UnmapViewOfFile,pMapAddr ;解除文件映射
    .endif
    invoke CloseHandle,hMap    ;关闭内存映射文件
    .endif
    invoke CloseHandle, hFile     ;关闭文件
    .endif
    ret
WinMain endp
;获取要处理的文件名
; 返回:若eax=NULL则表示没提供要处理的文件名
;    否则eax指向文件名地址
GetFileName Proc
    invoke GetFileNameFromCommandLine,addr FileName
    .if eax==NULL
    call GetFileNameFromDialog
    .endif
    ret
GetFileName endp
;返回时若eax=NULL则表示无法从命令行提取被处理的文件
GetFileNameFromCommandLine proc uses esi edi ,lpString:LPSTR
    mov edi,lpString
    invoke GetCommandLine  ;取命令行参数
    mov esi,eax
    xor eax,eax
    cld
G1:
    lodsb
    cmp al,'"'   ;程序名项是以双引号开始吗?
    jnz G3
G2:
    lodsb
    cmp al,'"'   ;遇到双引号则表示程序项名的结束
    jnz G2
G3:
    lodsb
    cmp al,' '   ;程序项名后总有一个空格
    jnz G3
G4:
    lodsb
    cmp al,0    ;无参数,转结束
    jz G7
    cmp al,' '   ;跳过无效字符,可能是空格,也可能是制表符
    jz G4
    cmp al,9
    jz G4
    cmp al,'"'   ;文件名项也是以双引号开始吗?
    jnz G5
    stosb
G4p:
    lodsb
    stosb
    cmp al,'"'   ;遇到双引号则表示文件名项的结束!
    jnz G4p
    jmp G6
G5:
    stosb
    lodsb
    cmp al,0     
    jz G6
    cmp al,' '   ;若文件名项没用双引号,则空格、制表或0表示文件名项的结束
    jz G6
    cmp al,9
    jnz G5
G6:
    xor al,al    ;以Ascii码0作为结束
    stosb
    mov eax,lpString
G7:
    ret
GetFileNameFromCommandLine endp
;显示打开对话框要求用户选择一个要处理的文件
GetFileNameFromDialog  proc
    mov ofn.lStructSize,sizeof ofn      ;结构的大小
    mov ofn.lpstrFilter,offset FilterString  ;文件过滤器
    mov ofn.lpstrFile,offset FileName     ;文件名的存放位置
    mov ofn.nMaxFile,256           ;文件名的最大长度
    mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_LONGNAMES
    mov ofn.lpstrTitle,offset DialogTitle   ;“打开”对话框的标题
    invoke GetOpenFileName,addr ofn      ;显示打开对话框
    .if eax!=NULL
    lea eax,FileName
    .endif
    ret
GetFileNameFromDialog  endp
;修改内存块的内容,就相当于修改文件的内容
ModifyFile proc uses ebx esi edi,lpBufferAddress:LPSTR
    mov edi,lpBufferAddress   ;取内存块地址
    call CheckPEValid
    .if eax==NULL
    invoke MessageBox,NULL,addr ErrorPEFormat,addr ErrorTitle,MB_ICONEXCLAMATION
    .else
    ;若是有效的PE,则edi中有PE头的地址
    invoke MessageBox,NULL,addr RightPEFormat,addr MessageTitle,MB_ICONINFORMATION
    call IniData    ;设置.text及.rdata的位置
    call HaveMessageBox
    .if eax!=0
    call AddCode
    .if eax==0
    invoke MessageBox,NULL,addr CanNotModify,addr ErrorTitle,MB_ICONEXCLAMATION
    .else
    invoke MessageBox,NULL,addr OkModify,addr MessageTitle,MB_ICONINFORMATION
    .endif
    .else
    invoke MessageBox,NULL,addr ErrorMessage,addr ErrorTitle,MB_ICONEXCLAMATION
    .endif
    .endif    
    ret
ModifyFile endp
;检查PE文件标记以确定其有效性
;若有效,eax指向PE头
; 否则eax=0
CheckPEValid  proc
    xor eax,eax
    assume edi:ptr IMAGE_DOS_HEADER
    .if [edi].e_magic==IMAGE_DOS_SIGNATURE   ;是否有DOS头标记
    add edi,[edi].e_lfanew
    assume edi:ptr IMAGE_NT_HEADERS
    .if [edi].Si

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 用程序修改PE使其可显示一个消息框

相关文章

  • 2017-06-28汇编源码系列之calc
  • 2017-06-28虚拟设备驱动程序初步
  • 2017-06-28通用控件详解
  • 2017-06-28MASM的反反汇编技术
  • 2017-06-28制作动态链接库
  • 2017-06-28汇编源码系列之break
  • 2017-06-28汇编语言的艺术-基本认识(二)
  • 2017-06-28汇编教程:控制寄存器和系统地址寄存器
  • 2017-06-17循环程序的结构形式及组成
  • 2017-06-28把数据写到代码段

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • DOS下的EXE格式文件
    • 基于微处理器的计算机系统构成
    • 子程序设计
    • VxD消息框例程
    • 汇编语言程序设计(三)
    • 汇编源码系列之col
    • 汇编语言编写DOS下的内存驻留程序(5)
    • 如何创建汇编工作环境
    • 汇编源码系列之getsect
    • 汇编源码系列之clock

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有