免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:8.x86游戏实战-OD详解
OD使用过程中会经常卡死,只能通过任务管理器结束,然后重新来
有时候OD附加完进程,下图红框位置是空白的(什么也没有)
这时点一下下图红框位置的C就好了
然后有时候进程的线程会停止,需要检查一下
如果有线程停止了(不是激活状态),如下图点击 Resume All threads让线程启动
学习汇编代码,就要写代码,就要执行代码,最简单的方式就是使用OD附加一个进程,然后找这个进程一直运行的代码,然后在一直运行的代码里下断点(后面就能看到断点是什么东西了),下了断点之后写汇编代码,然后使用断点的功能一行一行的执行代码
进程中什么位置会一直执行?ws2_32.send,send函数是网络程序用于给服务器发送数据包的(有的游戏不使用send,其它的后面在写)
OD附加进程,这里多一嘴OD也可以不用管理员启动也能附加进程,用不用管理员要看要被附加的进程,所以为了省心直接全用管理员启动就好了
鼠标按住下图红框位置,然后拖到要附加的程序窗口上,然后放开鼠标
然后点是就可以了
然后会到入口点,如下图,这时被附加程序会卡死,OD的状态如下图也是暂停,这时点下图红框位置让附加进程运行起来
OD附加完进程之后,点击下图红框位置,也就是点击代码段区域
然后按ctrl+g,然后输入 ws2_32.send,然后点OK,如果点了OK没反应,那就重新操作几次
然后就能跳转到send函数了,跳转到send函数的头部,也就是send函数的第一行,ws2_32是模块名,ws2_32.send意思是跳转到ws2_32模块里的send函数,有多个函数叫send所以需要指定模块名,然后为什么用ws2_32模块里的send函数?别管为什么这里记住用ws2_32里的send函数就行,后面就能知道原因了
首先选中下图红框位置(send函数的第一行)
然后按f2,下图紫色框框起来的位置就变成红色了,这说明这里下了断点,当程序执行到这时会卡主
然后在程序做一个可以发送数据包的操作,停下来(或者说断下来)的样子,如下图
然后多选几行代码,然后鼠标右击选择填充为NOP
NOP的意思是没有代码,处理器执行到NOP时不做任何操作,然后继续往下执行,NOP的硬编码是0x90
然后开始写mov指令,双击下图红框位置
然后输入mov eax, 1
然后点汇编,点了汇编按钮之后窗口不会自动关闭,需要手动关
然后就有了 mov eax, 1 代码
然后接下来按 f8,让它运行一下看看效果,如下图,可以看到eax变成了1
然后写mov ecx, [0x1484438],取地址的值
然后点了汇编之后,它给我们添加dword ptr,ptr表示地址,dword是数据宽度(4字节宽度)
然后按f8执行代码看看效果,这就是一个取内存地址里面值的效果
然后还能写 mov [0x1484438], 2,给内存地址里的值修改掉
然后点汇编的时候它让写一个操作数大小
这里写一个dword,4字节大小
然后点汇编就变成了下图的样子
然后按f8执行代码的效果,游戏崩溃了,这说明改成功了,我们是把0x1484438里的值改成了2,0x1484438原本的值是一个内存地址,然后2不是一个正常的内存地址,所以它蹦了
然后如下图红框,有的时候写了内存地址,点击汇编之后,它会变成英文,这是翻译的问题,它把内存地址翻译成了函数名(一般之后函数才会被翻译成英文)
c/c++写汇编,下方的代码是32位的汇编写法,64位汇编没法用_asm写,64位的汇编后面用到的时候会写
#include <iostream> #include "Windows.h" int main() { int a = 1; int b = 1; _asm { mov a,2 mov eax,3 mov b, eax } printf("%d, %d", a, b); }