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

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

0X00 前言

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

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

0X01 写个Hello World

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

​ 代码如下:

#include 
int main(){
	printf ("Hello world!!");
    return 0}

​ 编译成功,得到一个美妙的Hello world小程序,下面开搞。

0X02 开搞

​ 拖进OD,先运行一波:
[逆向入门] 逆向分析Hello World 程序_第1张图片

​ 正常操作。

​ 入点附近的代码和我们要做的事关系不大,欣赏欣赏就好,等我日后有需要在研究。
[逆向入门] 逆向分析Hello World 程序_第2张图片
​ 现在的主要目标是找到main中的printf函数。

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

​ 右击–中文搜索引擎–搜索ASCⅡ(对,我用的中文版OD,有的编译器可能默认UNICODE,在不了解的时候可以都试试。)
[逆向入门] 逆向分析Hello World 程序_第3张图片
​ 发现了一个美丽的Hello world!!,双击它。跟踪画面如下:
[逆向入门] 逆向分析Hello World 程序_第4张图片
​ 不难看到标准的栈帧以及对printf函数的调用,我认为图中004013B0即为main函数的入口。

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

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

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

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

嘿嘿

​ 此时只需用Ctrl+E将调用的这一段字符改成“Hello CiSuKid!”即可(字符长度尽量不要占用到后面的非0数据,且需保留至少两个字节的0数据),操作如下:
[逆向入门] 逆向分析Hello World 程序_第5张图片
​ 接下来继续运行,即可得到约定的输出结果,如下:
[逆向入门] 逆向分析Hello World 程序_第6张图片
到这里,我的目的就达到了。

0X03 总结

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

​ 如果想使应用程序发生改变,可以选中下图中的修改后的数据。
[逆向入门] 逆向分析Hello World 程序_第7张图片
​ 右击–复制到可执行文件,并在弹出窗口中右击保存文件即可得到一个打补丁的Hello world 应用程序。
[逆向入门] 逆向分析Hello World 程序_第8张图片
​ 但是由于我程序设计的问题,导致在非调试时运行,会一闪而过无法看到改变的输出,下次设计类似程序时可以加个getchar();

	吾爱破解的账号,ID:CiSuKid

	Have a good time!

你可能感兴趣的:([逆向入门] 逆向分析Hello World 程序)