• 《教你打造游戏修改器》学习记录


    文章:教你打造游戏修改器
    代码为C++
    #define MY_CODE1 0xE9
    同delphi的Const
    const ResourceOffset: dword = $004219F4;


    1.使用<金山游侠2002>查找内力值内存地址,最终得到798695C
    2.按Ctrl+D打开SoftICE,下命令:BPM 798695C W(意思是写这个地址时则中断),回到游戏中,打开人物属性面板,游戏中断了,在SofitICE中你会看到这条指令:

    0047EB17 MOV EAX [EDX+000003F4] 下命令:D EDX+3F4将看到内力值
    0047EB1D PUSH EAX

    从上面可看出0047EB17处的指令是将内力值的指针送到EAX寄存器中,这是一个典型的寻址方式,设想一下,我们得到了EDX中的基址,那么无论什么时候只要用EDX+3F4就可以轻松的得到内力值的地址,因为000003F4是一个常量,它是不会改变的,改变的只是EDX中的地址,所以只要有办法得到EDX中的值就什么都好办了
    3.设计一段代码,把EDX中的值存放到一个地址中,然后运行这段代码,再返回游戏的原有指令继续执行
    一般在EXE文件的数据段(.data段)的结尾都会有一段缓冲区,我们可以在这段区域中写任何东西
    Ctrl+D呼收出SoftICE,然后下命令:MAP32 CrhChs,这时你应该看到EXE各个段的信息,我们要注意的只是.data段,既然要找的是数据段的结尾,那么我们就从下一个段开始向上找,如下:
    .data 004FB000
    .rsrc 00507000
    .data的下一个段是.rsrc段,它是从00507000开始的,也就是说以00507000为基础向上一个字节就是数据段的结尾,我所择从00506950处开始写代码,说了这么半天那么我们的代码到底是什么样子呢?修改后的指令又是什么样的呢?别急,请看下面:
    修改0047EB17后代码:
    0047EB17 JMP 00506950 //跳到我们的代码中去执行
    0047EB1C NOP //由于这条指令原来的长度是6字节,而修改后的长度是5个字节,所以用一个空指令补上
    0047EB1D PUSH EAX

    //我们的代码:
    00506950 MOV DWORD PTR EAX,[EDX+00003F4] //恢复我们破坏的指令
    00506956 MOV DWORD PTR [00506961],EDX //把EDX保存以00506961中去
    0050695C JMP 0047EB1D //返回原来的指令去执行

    把上面的代码用SoftICE的A命令写入,OK!

    下面是我对汇编指令与机器指令对应的查询设置过程

  • 相关阅读:
    Android中WebView如何加载JavaScript脚本
    Android中WebView如何加载JavaScript脚本
    Android中WebView如何加载JavaScript脚本
    Android如何使用SQLlite数据库
    Android如何使用SQLlite数据库
    Android如何使用SQLlite数据库
    __declspec(dllimport)的作用
    __declspec,__cdecl,__stdcall都是什么意思?有什么作用?
    #pragma pack(push,1)与#pragma pack(1)的区别
    #pragma pack(n) 的作用
  • 原文地址:https://www.cnblogs.com/ZhouXiHong/p/433587.html
Copyright © 2020-2023  润新知