博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
逆向工程核心原理笔记(一)——Hello World-2
阅读量:2200 次
发布时间:2019-05-03

本文共 1620 字,大约阅读时间需要 5 分钟。

逆向工程核心原理笔记(一)——Hello World-2

接下来我们尝试修改程序的内容

打补丁

在代码逆向分析的过程中,“打补丁”的操作是重要的内容,“打补丁”不仅可以修复已有程序中的Bug还可以向程序中添加新功能。其对象可以是文件,内存,甚至是程序的代码和数据。接下来我们尝试将MessageBox中的字符串修改为其他的字符串。

接下来介绍修改字符串的两种方法:

修改字符串缓冲区

现在程序中找到字符串所在的位置:

在这里插入图片描述
如箭头所指,程序所调用的字符串的位置是 4A2118 我们在下面的 Dump 窗口中使用 Ctrl + G 找到这个位置,如下:
在这里插入图片描述
这里就是我们的字符串,选中从 4A2118 到 4A2130 使用 Ctrl + E ,弹出的对话框如下所示:在这里插入图片描述
上面是这里的字符串,我们将这里的字符串改为 Hello Lpy_Now 。在 Unicode 编码中用两个字节表示一个罗马字母,并且 Unicode 字符串必须使用 NULL 结尾,NULL 占据两个字节,在添加 NULL 时不能直接在 Unicode 窗口中中进行添加,而是需要在 HEX 项目中进行添加。更改后的字符串比之前的字符串更长,但是原字符串之后可能会存储一些有一定意义的数据,如果使用更长的字符串覆盖原字符串的时候,原有的数据可能会被覆盖,这可能比较危险,在实际的操作中不建议这样修改字符串。接下来我们将字符串进行修改:
在这里插入图片描述
如果在修改字符串的时候长度受限无法修改,可以将箭头所示的 Keep size 选项关掉后进行修改。

接着我们使用 F9 将程序运行到 MessageBoxW 处,输出的 MessageBoxW 结果为:

在这里插入图片描述
此时我们修改后的字符串是暂时性的,当我们重新反编译程序的时候 MessageBox 中显示的字符串仍然是 Hello World 如果我们需要以后运行程序就显示 Hello Lpy_Now 那么我们需要将更改的地方进行保存,首先将修改后的字符串的部分选中
在这里插入图片描述
在右键弹出的菜单中选中 Copy to executable file 后程序弹出下面的窗口:
在这里插入图片描述
右键选择后的菜单中选择 Save file 将程序进行保存,再次运行程序,MessageBox 显示的字符串就是修改后的字符串了:
在这里插入图片描述
在其他内存区域新建字符串并传递给消息函数

如果使用较长的字符串去替换之前的字符串的话,可能会引起不必要的错误,我们尝试更换一种方法:

在这里插入图片描述
在 007B1007 处有一条 PUSH 命令,为 PUSH 7B2118 这里是将 7B2118 处的字符串以参数的形式传递给 MessageBoxW() 函数,在向 MessageBoxW() 函数传递参数的时候,是将字符串所在区域的首地址进行传递,如果将字符串的首地址进行改变,那么消息框显示的字符串也会相应改变,我们可以尝试在内存的某个区域新建一个长字符串,并将字符产的首地址传递给这个函数,这里我们可以认为传递的是完全不同的字符串的地址。

在应用程序被加载到内存的时候通常有一个最想的内存分配大小,通常为 1000 ,即使在程序运行的时候只需要占用 100 的内存,在被加载到内存的时候仍会被分配到 1000 左右的内存,一部分内存会被程序占用,而另一部分将会是空白区域,会被填充为 NULL。

我们将字符串定位到 7B2118 处,向后查看,直到又较多的 NULL 填充的地方:

在这里插入图片描述
当字符串的位置在 7B21A4 处以后,又较多的空白,我们选中一段空白,使用 Ctrl + E 将这里的内容修改为 Hello Lpy_Now :
在这里插入图片描述
再在 7B1007 处双击 PUSH 命令,弹出如下对话框:
在这里插入图片描述
将此处的命令改为 修改后的字符串的首地址 7B21A4 :
在这里插入图片描述
修改后我们发现此时的字符串为修改后的字符串,我们将程序运行到此处:
在这里插入图片描述
同样得到了修改后的结果。
接下来将修改结果进行保存就好了。
如上就是两种对程序进行修改的方式

转载地址:http://msrub.baihongyu.com/

你可能感兴趣的文章
搞懂分布式技术13:缓存的那些事
查看>>
搞懂分布式技术14:Spring Boot使用注解集成Redis缓存
查看>>
搞懂分布式技术15:缓存更新的套路
查看>>
搞懂分布式技术16:浅谈分布式锁的几种方案
查看>>
搞懂分布式技术17:浅析分布式事务
查看>>
搞懂分布式技术18:分布式事务常用解决方案
查看>>
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
查看>>
搞懂分布式技术20:消息队列因何而生
查看>>
搞懂分布式技术21:浅谈分布式消息技术 Kafka
查看>>
后端技术杂谈1:搜索引擎基础倒排索引
查看>>
后端技术杂谈2:搜索引擎工作原理
查看>>
后端技术杂谈3:Lucene基础原理与实践
查看>>
后端技术杂谈4:Elasticsearch与solr入门实践
查看>>
后端技术杂谈5:云计算的前世今生
查看>>
后端技术杂谈6:白话虚拟化技术
查看>>
后端技术杂谈7:OpenStack的基石KVM
查看>>
后端技术杂谈8:OpenStack架构设计
查看>>
后端技术杂谈9:先搞懂Docker核心概念吧
查看>>
后端技术杂谈10:Docker 核心技术与实现原理
查看>>
夯实Java基础系列2:Java自动拆装箱里隐藏的秘密
查看>>