往代码区空白区加一段代码

知识点1

先举一个例子:
这里写图片描述
上图中E9 63210000为硬编码(也叫OpCode),63210000是以小端进行显示的,它实际的结果为0000 21 63,本文中表示地址偏移的硬编码统统设为X

知识点2

下面介绍一个公式:

真正要跳转的地址 =  E8这条指令的下一行地址 + X;这里的X指的就是硬编码;

X = 真正要跳转的地址(其实就是目标地址) - E8这条指令的下一行地址
举例来说明验证:

地址                 硬编码                        汇编
004011F8       E8  53 FE FF FF           call  function(0040 1050)

004011FD           33 C0                  xor eax , eax

这里验证一下这个公式:
这个例子中E8 (call)这条指令的下一行的指令地址为004011FD ,要跳往的地址为 0040 1050(这两者皆为16进制)
X = 0040 1050 - 004011FD = FFFF FE53 (请用计算器计算)
这里的FFFF FE53用小端写出来就是FFFF FE53 !

再看一个jmp(E9)的例子:
00401050  E9  2B 2B 00 00   jmp  Function(00403B80)   //这是第一条指令 
00401055  CC  int 3   //这是下一条指令
X = 00403B80 - 00401055  = 00 00 2B 2B
得到硬编码为 2B 2B 00  00
公式变换

其实E8/E9后面跟了4个字节,故整个长度为5个字节;故:
E8这条指令的下一行地址=E8这条指令的地址+5
所以上面公式变为:

X = 要跳转的地址 - ( E8(E9)这条指令所在地址 + 5) //这里的地址为”拉伸”后的在内存中运行的地址!!!

添往程序中添加加代码例子

下面一个例子就是要在一个程序里面添加一段有关Messagebox的代码,

知识点0x00

Push 0的硬编码如下:
6A 00 push 0
6A 00 push 0
6A 00 push 0
6A 00 push 0

往代码段添加一段如下的代码:
6A 00 6A 00 6A 00 6A 00 E8 00 00 00 00 E9 00 00 00 00

知识点0x01

首先要看代码段剩下的空间能不能够容纳下这18个字节???(E8 与call 对应,E9 与jmp对应)
用SizeofRawData - VirtualSize即可!这里检测到是可以的

知识点0x02

MessageBox的地址为77 E5 42 5F
call message 的下一条指令地址:41A73D(这个地址其实就是E9 所对应的那个地址)
所以X = 77 E5 42 5F-41A73D= 77A3 9B22 对应硬编码为22 9B A3 77
所以E8 00 00 00 00填充为E8 22 9B A3 77

知识点0x03

OEP为00 01 83 D7(这是可选头里面的,是一个RVA)
Imagebase为0x40 0000
故入口点位置为00 41 83 D7(目标地址)
而 E9 00 00 00 00这条指令的下一条指令的地址可以通过PE工具找出来,就是你在ImageBuffer里面的那个区段添加了这18个字节的指令之后的那个地址,这里为1A742,再加上40 0000,为41 A7 42,
故这里的X = 00 41 83 D7(目标地址)-41 A742=FFFF DC95 对应硬编码为95 DC FF FF
所以这里E9 00 00 00 00填充为E9 95 DC FF FF

知识点0x04更改OEP

最后要思考的是添加这段代码,我们要实现的效果是 先弹出一个MessageBox的对话框,然后再执行原来的exe程序,
而我们要添加的6A 00 6A 00 6A 00 6A 00 E8 22 9B A3 77 E9 95 DC FF FF这段代码的起始地址是1A730(这里没有加ImageBase),要想实现上面所说的效果,就必须把原来的OEP(1 83 D7)改为1A730即可

总结:

实现逻辑:将原来的OEP改为添加的代码的因编码所在地址,这样程序运行的时候就从你添加的代码开始执行了,而添加的代码的硬编码为E9 95 DC FF FF,这句话的逻辑是跳往原来exe的OEP,硬编码计算公式见上

注意:注入的概念是这个代码本身已经在运行了,我把我的代码”扔”进去,而这里在代码为运行之前将代码加进去

<think>好的,我现在要解决用户的问题:代码执行后文本内容为空,应该如何解决。首先,我需要分析可能的原因,然后给出相应的解决方法。根据用户提供的引用资料,特别是引用[2]提到了在Python中操作文件时,先写后读可能会出现内容为空的情况,这可能是因为文件指针的位置问题或者没有正确关闭文件。 首先,我应该考虑文件操作的基本流程。当用写入模式(如'w')打开文件时,文件指针默认在开头,写入内容后指针会停留在末尾。如果此时尝试读取,可能读不到内容,因为指针在末尾之后。解决方法是使用flush()确保数据写入,或者重新打开文件进行读取。 其次,用户提到的引用[4]中的form.render()方法,虽然这是前端的问题,但可能用户在使用某些框架时,表单未正确渲染导致数据未提交,后端接收不到数据,从而处理后的文本内容为空。需要检查前端表单是否正确提交数据。 另外,引用[3]提到的编码问题,比如在文本处理时,如果使用了错误的编码方式(如默认的ASCII而不是UTF-8),可能导致读取或写入时出现乱码或空内容。需要确保文件操作时指定正确的编码。 还有可能是在写入文件后没有正确关闭文件,导致缓冲的内容未被写入磁盘。使用with语句可以自动处理文件的关闭,或者在写入后调用close()方法。 最后,路径错误也是一个常见问题,比如文件被写入到了其他目录,或者读取时路径不正确,导致程序无法找到文件,从而内容为空。需要检查文件的绝对路径和相对路径是否正确。 总结可能的原因和解决方法: 1. 文件指针位置问题:写入后指针在末尾,读取前需要移动指针到开头。 2. 未正确关闭或刷新文件:使用flush()或with语句确保写入完成。 3. 编码问题:指定正确的编码格式,如encoding='utf-8'。 4. 路径错误:检查文件路径是否正确。 5. 前端表单提交问题:确保表单数据正确提交到后端处理。 接下来需要将这些思路整理成结构清晰的回答,并引用相关的参考资料。同时,生成相关问题供用户进一步参考。</think>针对代码执行后文本内容为空的问题,以下是逐步排查和解决方法: --- ### **1. 检查文件读写模式** - **错误示例**:同时使用`file.write()`后立即`file.read()` ```python with open("test.txt", "w+") as f: f.write("Hello World") # 写入后指针位于文件末尾 print(f.read()) # 输出空字符串 ``` - **解决方法**:写入后调用`f.seek(0)`移动指针到开头 ```python with open("test.txt", "w+") as f: f.write("Hello World") f.seek(0) # 重置指针到文件开头 print(f.read()) # 输出: Hello World ``` --- ### **2. 确保文件正确关闭或刷新** - **未刷新缓冲**:写入操作可能未立即同步到磁盘 ```python f = open("test.txt", "w") f.write("Hello World") # 未执行f.close()或f.flush() ``` - **解决方法**: - 使用`with`语句自动管理文件关闭 ```python with open("test.txt", "w") as f: f.write("Hello World") ``` - 手动调用`f.flush()`强制写入 ```python f = open("test.txt", "w") f.write("Hello World") f.flush() # 确保内容写入磁盘 ``` --- ### **3. 检查文件编码格式** - **编码错误**:文本内容包含非ASCII字符时需指定编码 ```python # 错误写法(默认编码可能与系统相关) with open("test.txt", "w") as f: f.write("中文内容") ``` - **解决方法**:显式指定编码(如UTF-8) ```python with open("test.txt", "w", encoding="utf-8") as f: f.write("中文内容") ``` --- ### **4. 验证文件路径是否正确** - **路径错误**:文件被写入到其他目录或未找到 ```python # 错误示例:相对路径可能指向非预期位置 with open("data/test.txt", "w") as f: f.write("Hello") ``` - **解决方法**: - 使用绝对路径(如`/home/user/data/test.txt`) - 检查当前工作目录 ```python import os print(os.getcwd()) # 输出当前路径 ``` --- ### **5. 前端表单提交问题** 如果问题涉及前端表单提交(如引用[4]中的`form.render()`): - **原因**:表单未正确渲染导致数据未提交 - **解决方法**:调用`form.render()`初始化表单组件 ```javascript layui.use('form', function(){ var form = layui.form; form.render(); // 确保表单正确渲染 }); ``` --- ### **相关引用** 1. 文件写入后读取为空的问题可能因未重置文件指针导致[^2]。 2. 表单未正确渲染可能导致后端未接收到数据,从而输出为空[^4]。 3. 编码错误可能导致文本写入或读取异常[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值