目录

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的知识,进一步了解程序的内存变化

打赏