<>[逆向入门] 逆向分析Hello World 程序

<>0X00 前言

​ 时隔一个月,在看完了汇编,正式进入逆向学习之后,我终于想起了更新我的博客。最近在看《逆向工程核心原理》(李承远 著),开头介绍了一个关于Hello
World程序的逆向分析。感觉挺有意思的,就让逆向与更新也从Hello World开始吧。

​ 我的目标是通过打补丁将显示结果改为“Hello CiSuKid!”

<>0X01 写个Hello World

​ 一个简单的C程序,我用的编译器是Dev-C++ 5.4.0,使用不同编译器得到的应用程序文件可能在后续OD的窗口中得到不同的汇编代码。

​ 代码如下:
#include <stdio.h> int main(){ printf ("Hello world!!"); return 0; }
​ 编译成功,得到一个美妙的Hello world小程序,下面开搞。

<>0X02 开搞

​ 拖进OD,先运行一波:

​ 正常操作。

​ 入点附近的代码和我们要做的事关系不大,欣赏欣赏就好,等我日后有需要在研究。

​ 现在的主要目标是找到main中的printf函数。

​ 因为已经知道回显是个“Hello world!!”,咱可以试着查查字符。

​ 右击–中文搜索引擎–搜索ASCⅡ(对,我用的中文版OD,有的编译器可能默认UNICODE,在不了解的时候可以都试试。)

​ 发现了一个美丽的Hello world!!,双击它。跟踪画面如下:

​ 不难看到标准的栈帧以及对printf函数的调用,我认为图中004013B0即为main函数的入口。

​ F2下个断点,F9运行到这。

​ 此时注意寄存器与栈内的情况,F8逐条执行。

​ 观察图中004013BE处代码可知,程序从内存00403064处调取"Hello world!!"字符用于后续调用printf函数时输出到显示屏上。

​ 从数据窗口Ctrl+G访问内存00403064处,得到画面如下:

​ 此时只需用Ctrl+E将调用的这一段字符改成“Hello
CiSuKid!”即可(字符长度尽量不要占用到后面的非0数据,且需保留至少两个字节的0数据),操作如下:

​ 接下来继续运行,即可得到约定的输出结果,如下:

到这里,我的目的就达到了。

<>0X03 总结

​ 实际上仅仅经过以上步骤,该应用程序在退出OD后运行结果依然还会是“Hello world!!”。

​ 如果想使应用程序发生改变,可以选中下图中的修改后的数据。

​ 右击–复制到可执行文件,并在弹出窗口中右击保存文件即可得到一个打补丁的Hello world 应用程序。

​ 但是由于我程序设计的问题,导致在非调试时运行,会一闪而过无法看到改变的输出,下次设计类似程序时可以加个getchar();
吾爱破解的账号,ID:CiSuKid Have a good time!

技术
©2019-2020 Toolsou All rights reserved,
数字滚动抽奖小程序VaR - 风险价值 - 蒙特卡罗法 - Python百度网盘偷偷更新,终于实现免费不限速了! Chrome OS,对程序员和Windows意味着什么?,互联网营销华为Mate 40 Pro+ 5G曝光:徕卡电影镜头、陶瓷机身Qt学习2——.pro文件和.h文件介绍python:将一个文件转换为二进制文件(binary)第十一届蓝桥杯C/C++ 大学 B 组大赛软件类省赛网站手机号码抓取方式蚂蚁集团香港IPO获得中国证监会批准