逆向工程核心原理-(第一章 + 第二章)
EP代码(EntryPoint,入口点)
EP是Windows可执行文件(EXE , DLL , SYS)的代码入口点,是执行应用程序时最先执行的代码的起始位置,它依赖于CPU
知识点一 , 快速查找指定代码的四种方法
1.代码执行法
就是调试时注意程序调用了什么具有特征性的函数或者是API(比如主函数调用了一个窗口,那么就可以在调试程序的时候多注意是否有messagebox函数),简单来讲就是直接暴力找.
2.字符串检索法
右键菜单,点击查找中的所有参考文本字串,然后查找有特征的字符串
3.API检索法(1): 在调用代码中设置断点
windows中想要输出内容就必须调用操作系统中的API,所以我们只需要找到可能调用的API即可(这听起来有点像第一种方法,但是这个方法是用odgb的功能搜索).
右键,点击查找中的模块间的调用
看到了有用的API
双击就可追踪到调用这个API的地址
4.API检索法(2): 在API代码中设置断点
右键,点击查找中的所有模块中的名称
这时候看窗口最上方的标题栏,这时候你打字,他就会帮你搜索
找到需要的API的时候双击就会进入函数的内部
注意
- 在”所有模块间的调用”中,双击会进入调用的地址
- 在”所有模块中的名称”中,双击会进入函数的内部
回到正文,这时候API的顶部下一个断点,然后运行,程序执行到这个调用的API时就可以看到栈中重要的数据了
知识点二 , 修改程序的字符串
修改字符串的两种方式
- 直接修改字符串缓冲区(buffer)
- 在其他内存区域生成新字符串并传递给消息函数
以上两种方式各有优缺点
方法1: 直接修改字符串缓冲区
这里的push 004092A8
说明了字符串就在地址004920A0当中
所以我们使用跳转功能(Ctrl + G)找到了我们所要找的字符串
选定要修改的内存,按下Ctrl + E键即可修改内容
修改完后要在结尾加上两个字节的00!!!!!!!因为是字符串
然后需要注意的点(也是这个方法的弊端)就是修改的字符串最好要比原来的字符串要小,因为比原来大的话会覆盖掉后面的数据(有可能很重要,就算不重要,这样改的话也会影响到程序的稳定性)
接着运行主程序,最后弹出窗口(MessageBoxW)
这一个方法的结尾部分:
但是这只是暂时的修改,想要完成这一次的修改就必须保存修改后的文件,在内存窗口中选择被修改后的字符串,右键点击”复制到可执行文件”
变成了如图所示的Hex窗口(十六进制窗口)(如果是全屏的话点击查看里的窗口就可变成小窗口了)
再一次右键点击保存文件就可以保存了
运行一下新程序
说明成功了
方法二: 在其他区域新建字符串并传递给消息函数
接着上一种方法重新启动一下程序,发现字符串又变回了原来的样子,说明了刚刚不保存的话,方法一的改动只是暂时的
重新运行至main()函数内部
这里的push指令其实就是在向API(MessageBoxW)当中传入参数,而这个参数就是我们所想要显示出的字符串的地址
所以这个方法的思路就是修改传入参数的地址,把地址改为我们自己修改的数据的地址,这个方法比方法一好的地方是,没有了字符串长度的限制,可以比原来的字符串更长.
这里是hello字符串,向下滑动直到数据全是00(NULL)(这里就是内存中程序没有用到的部分(系统给的内存容量一般大于一个程序所需的内存),也就是可以自由改动的部分.
找一块空旷的地方修改我们需要的数据
记下这个数据的地址
然后修改我们传入API的地址:点击传参指令,按下空格
最后接着运行下去,就成功了
这时候保存程序(按照上面的步骤)
保存后发现运行错误
这是正常现象是由于修改了地址引起的,不用管,后面会学到
PS:
注意使用跳转功能的时候要注意是在那个窗口进行跳转
假设是在指令窗口使用跳转功能,那么跳到的地址会被翻译成指令.
如果是在内存窗口中使用跳转功能,会直接查看内存(这道题就是要在内存窗口中跳转)