调试逆向基础知识二目录1.修改内存值得两种方法2.大端小端表示方法的区别 环境配置:和调试逆向基础知识一种配置相同 第一部分:修改内存值的两种方法修改方法:1.在原值的内存地址中进行修改2.重新开辟一块内存地址,修改原先的内存地址指向新的内存地址#include<stdio.h>#include<windows.h>int main(){ MessageBox(NULL, "Hello World", "www.baidu.com", MB_OK ); return 0;}1.在原值的内存地址中进行修改修改前如图1:
修改后如图2:
一:在原值的内存地址中进行修改
按照调试逆向基础知识一中方法直接找到主函数的EP(EntryPoint 函数入口地址)如图三:
如图所示此时调试指令停留在地址00411380 处
此时我们用鼠标将光标移动到地址 004113A7 处 此时在信息窗口会看到:
0041573C=MessageB.0041573C (ASCII "Hello World")
此时我们选中数据窗口 按快捷键Ctrl+G 输入地址0041573C 如图所示4:
点击ok 后会出现如图5:
如图所示在地址0041573c 地址处选中 从00415742~0041574B 选中后按快捷键 Ctrl+E 进行编辑如图6:
由于 MrDJ 对应的分别为:
M r D J
DEC: 77 114 68 74
HEX: 4D 72 44 4A
所以只需要在编辑框中 一次输入 4D 72 44 4A 即可如图7:
输入完成后直接按快捷键F9 运行即会出现如图二所示情景
如果需要对可执行文件的修改进行保存步骤如下:
单击鼠标右键选择复制至可执行文件 ->接着在弹出的窗口中右键选择保存可执行文件->接下来就是对保存路径以及对保存的文件名的选择啦 此方法的优劣:优:1.操作简单(1.主要体现在不用修改CPU 中的汇编代码2.直接修改内存中的值即可完成要求)劣:1.容易篡改系统文件以及部分本程序中的重要文件(主要由缓冲区的大小做决定)什么时候采用此种方法? 当程序中需要改动的部分很少时 当缓冲区足够大时(以修改后不影响程序的正常运行为准)2.重新开辟一块内存地址,修改原先的内存地址指向新的内存地址修改方法:1.重新开辟一块内存用于保存字符串2.改变消息函数参数指针的指向,使其指向新开辟的内存地址如图八所示:
1.向MessageBoxA() 函数传递的四个参数中 “Hello World”这个字符串是我们关注的也是我们需要进行替换的的,由图8可知向MessageBox()传递的是数据的首地址 004113A7 因此我们只需要改变此地址为我们自己字符串的首地址就可以啦
2.在数据窗口中,向上翻看如图9所示:
从图9可以看出 地址00415000 地址处为空 因此我们选中后按快捷键 Ctrl+E如图10 所示
完成以后只需要将图八中的 地址 004113A7 出的汇编指令进行修改即可 首先光标选中后按空格键如图11所示:
接着按F9 运行即可 如图12
完美运行 方法的优劣:优:1.不用担心缓冲区长度,字符串长度问题2.可控性比较好劣:1.只能一次运行(重新载入此程序仍需要修改才能达到效果)2.对操作有要求,需要修改汇编指令什么时候用到此方法:替换的字符串比较长的时候用此方法比较好2.大端小端显示方法的区别···
字节序:是计算机内存中存储或网络传输时各字节的 存储顺序
主要分为大端序,小端序
··· 简单点说(以 123456为例)
小端显示法:小端:563412(内存低位存储数据低位)
大端显示法:大端:123456 (内寸低位存储数据高位)
常见的intel32 即采用小端显示法 小结1.本节只是从原理上讲解,通过列举简单的例子向大家证明两种方法
2.大端小端序 要明白常用的设备采用的字节序
3.闲暇时可学习有关PE的知识,进一步了解程序的内存变化
|