pe空白区添加弹窗程序运行错误
作为一个新手,想着先从简单的做起,pe文件头部在文件中转换到内存中不需要考虑内存对齐,我在节表后面的空白区加入弹窗代码,加入弹窗二进制数据后,未修改oep之前,我调试代码在我预期的位置看到了我加入的messagebox代码,但是当我修改oep到我添加的代码处后,程序运行报错,怀疑是有代码还未加载入内存,求大佬解惑,下面是我问题及修改步骤问题1:我插入代码应该调用本程序自身的MessagexBoxA函数还是user32.dll的还是都可以使用?
问题2:为什么修改oep为我插入代码处后调回,程序运行出错?
1.分析程序,初始程序在77B4DD处开始运行
2.我要插入的代码在pe文件头部的3C0处,在内存中展开的位置位4003C0,插入的代码为:
6A 00
6A 00
6A 00
6A 00
E8 00 00 00 00 (红色部分需要计算)
E9 00 00 00 00 (红色部分需要计算)
3.计算插入代码,这里我查找插入的MessageBoxA函数,程序自身和user32中均有MessageBoxA函数,均做尝试过,这里只展示调用user32中的
根据公式红色部分为:跳转地址-当前地址-5
77C29D50-4003C8-5=7782 9983
77B4DD-4003CD-5=37B10B
根据小端存储,插入的代码为:
6A 00
6A 00
6A 00
6A 00
E8 83 99 82 77
E9 0B B1 37 00
4,通过x64dbg查看插入代码在预期的内存4003C0处,未修改oep前,程序正常运行
5,修改oep为03c后,程序报错0xc000007b
route 发表于 2023-11-29 12:39
大佬,能详细说下么,我看MessageBoxA反汇编也是这5条指令,没有push ebp ,mov ebp,esp,pop ebp这些操作
在写弹窗的汇编指令之前,需要通过pushad pushfd 保存寄存器;弹窗的汇编指令完成之后,通过popfd popad 还原寄存器,之后恢复被填充的字节并执行跳回原处的下一条指令。 保存寄存器! 董督秀 发表于 2023-11-29 12:02
保存寄存器!
大佬,能详细说下么,我看MessageBoxA反汇编也是这5条指令,没有push ebp ,mov ebp,esp,pop ebp这些操作 董督秀 发表于 2023-11-29 13:11
在写弹窗的汇编指令之前,需要通过pushad pushfd 保存寄存器;弹窗的汇编指令完成之后,通过popfd popad...
是把汇编代码改成
pushad
pushfd
push 0
push 0
push 0
push 0
call MessageBoxA
popfd
popad
jmp oep
然后把oep改成pushad的地址了,但是还是一样运行报错 出错代码的意思是 STATUS_INVALID_IMAGE_FORMAT 映像无效
楼上讲的问题可能会影响后面指令的执行,如果入口正确至少会先弹出messagebox
但你把代码写在文件头是几个意思?代码段是从401000开始的
本帖最后由 route 于 2023-11-29 16:45 编辑
lies2014 发表于 2023-11-29 15:05
出错代码的意思是 STATUS_INVALID_IMAGE_FORMAT 映像无效
楼上讲的问题可能会影响后面指令的执行,如果入 ...
{:1_907:}我看网上课讲的文件头部空白区也可以插入,401000是内存中节开始的位置吧 route 发表于 2023-11-29 16:43
我看网上课讲的文件头部空白区也可以插入,401000是内存中节开始的位置吧
你第4步骤那张x64dbg的图中 4003c0 不就是内存地址?你试试x64dbg载入程序是否能够停在你修改后的入口就知道可不可以了 lies2014 发表于 2023-11-29 19:38
你第4步骤那张x64dbg的图中 4003c0 不就是内存地址?你试试x64dbg载入程序是否能够停在你修改后的入口就 ...
只能设置硬件断点,但是断不下来
页:
[1]