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!

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

  • 相关阅读:
    java, listmap2json, fastjson
    java, mybatis, 调用mysql存储过程
    解析json串,利用正则表达式,split
    alibaba fastjson List<Map<String, String>>2Str
    getParameterMap()的返回值为Map<String, String[]>,从其中取得请求参数转为Map<String, String>的方法如下:
    message from server: "Host 'XXX' is not allowed to connect to this MySQL server
    Java之工厂方法
    oracle 的分析函数
    在js中怎样获得checkbox里选中的多个值?(jQuery)
    获得select被选中option的value和text
  • 原文地址:https://www.cnblogs.com/ZhouXiHong/p/433587.html
Copyright © 2011-2022 走看看