004011F3 | FF2485 60124000 | jmp dword ptr ds:[eax*4+401260] | //跳转表
| eax | [eax*4+401260] | 自定义代码处 |
|---|---|---|
| Load菜单(eax=0) | [401260] | =403B42 |
| Save菜单(eax=4) | [401270] | =403BAE |
| Exit菜单(eax=2) | [401268] | =401159 |
![]() |
|---|
Exit菜单
修复方案:将跳转指向现有的退出代码(00401159),该代码调用PostQuitMessage。
修改步骤:
当前00401268处的值为0040124B(指向SetFocus调用)。修改为00401159(退出代码地址)。
汇编修改:将00401268处的4字节值从0040124B改为00401159。
![]() |
|---|
Load菜单
内存布局:
405A70:文件路径缓冲区(260字节)
405AB0:文件内容缓冲区(1024字节)
405544\]:存储Edit控件句柄的指针
核心流程:
调用自定义的OpenFileDialog函数让用户选择文件
使用ReadFileContent函数读取选中的文件内容
通过SetWindowTextA API将文件内容显示到Edit控件中
```
; ==================================================
; 文件加载并更新Edit控件文本的汇编代码注解
; 地址范围:00403B42 - 00403BA2
; ==================================================
00403B42 | 60 | pushad | ; 保存所有通用寄存器现场
00403B43 | 33C0 | xor eax,eax | ; 清空EAX寄存器
00403B45 | C605 705A4000 00 | mov byte ptr ds:[405A70],0 | ; 初始化文件路径缓冲区首字节为0(空字符串)
; 空指令区域 - 为后续代码调整预留的空间
00403B4C | 90 | nop |
00403B4D | 90 | nop |
00403B4E | 90 | nop |
; ========== 第一阶段:打开文件对话框 ==========
00403B4F | 68 04010000 | push 104 | ; 参数3:缓冲区大小(260字节,MAX_PATH)
00403B54 | 68 705A4000 | push douby_2.405A70 | ; 参数2:文件路径缓冲区地址(405A70)
00403B59 | 6A 00 | push 0 | ; 参数1:父窗口句柄(0表示桌面)
00403B5B | B8 FF100110 | mov eax,<46.OpenFileDialog> | ; 加载OpenFileDialog函数地址到EAX
00403B60 | FFD0 | call eax | ; 调用打开文件对话框函数
00403B62 | 85C0 | test eax,eax | ; 检查返回值(用户是否选择了文件)
00403B64 | 74 3B | je douby_2.403BA1 | ; 如果取消或失败,跳转到清理退出
; 空指令区域 - 预留空间
00403B66 | 90 | nop |
00403B67 | 90 | nop |
00403B68 | 90 | nop |
00403B69 | 90 | nop |
00403B6A | 90 | nop |
00403B6B | 90 | nop |
; ========== 第二阶段:读取文件内容 ==========
00403B6C | 68 00040000 | push 400 | ; 参数3:读取的最大字节数(1024字节)
00403B71 | 68 B05A4000 | push douby_2.405AB0 | ; 参数2:文件内容缓冲区地址(405AB0)
00403B76 | 68 705A4000 | push douby_2.405A70 | ; 参数1:文件路径字符串地址
00403B7B | B8 76120110 | mov eax,<46.ReadFileContent> | ; 加载ReadFileContent函数地址到EAX
00403B80 | FFD0 | call eax | ; 调用读取文件内容函数
00403B82 | 85C0 | test eax,eax | ; 检查读取是否成功
00403B84 | 74 1B | je douby_2.403BA1 | ; 如果读取失败,跳转到清理退出
; ========== 第三阶段:更新Edit控件文本 ==========
00403B86 | 90 | nop |
00403B87 | 68 B05A4000 | push douby_2.405AB0 | ; 参数2:文件内容缓冲区地址(要显示的文本)
00403B8C | FF35 44554000 | push dword ptr ds:[405544] | ; 参数1:从内存[405544]获取Edit控件句柄
00403B92 | E8 E9376E76 | call

