zoukankan      html  css  js  c++  java
  • 《教你打造游戏修改器》学习记录

    文章:教你打造游戏修改器
    代码为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!

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

  • 相关阅读:
    BFC——块级格式化上下文
    深入浅出——float
    NodeJS 学习记录
    JavaScript高级程序设计 第六章 面向对象程序设计
    软件项目管理课感想
    第八周PSP 新折线图和饼图 个人时间管理
    第七周PSP 新折线图和饼图 个人时间管理
    Alpha、伪Beta 发布个人感想与体会
    ”单元测试“理解与感悟
    编程
  • 原文地址:https://www.cnblogs.com/ZhouXiHong/p/433587.html
Copyright © 2011-2022 走看看