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!

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

  • 相关阅读:
    Maven常用仓库地址以及手动添加jar包到仓库
    将Jar安装到本地仓库和Jar上传到私服
    maven release插件将一版本发布到仓库中时Return code is: 401, ReasonPhrase:Unauthorized
    使用github作为maven仓库
    关闭 将jar或者aar发布到到mvn 中(用github作为仓库), 通过gradle dependency 方式集成
    使用Spring进行统一日志管理 + 统一异常管理
    Error pulling origin: error: The following untracked working tree files would be overwritten by...
    c语言函数---M
    C++面试题一大波
    kettle中调用java类
  • 原文地址:https://www.cnblogs.com/ZhouXiHong/p/433587.html
Copyright © 2011-2022 走看看