怪物猎人:世界科技(修改)

0x01 水

掐指一算,距离上次发文已经过去接近两个月了。。

果然暑假前说好的更新计划还是被我鸽掉了。。。

别慌,问题不大,反正当初我就觉得我应该会鸽掉的说 hh

0x02 背景

至于为什么我会从某蒸汽平台购入这款游戏呢~

那是一年前的事了,当时游戏刚刚发布,好像还炒的挺热的,正值暑期特卖。。

唉能不能别提暑期特卖,每次提这个钱包都得减个肥。。

至于为什么现在才来发这篇文章嘛,其实也是有一个很大的原因

那就是之前的电脑并不能带的起怪猎这个游戏(这是一个悲伤的故事。。)

试想一个最低画质玩怪猎也只有不到12FPS的电脑,那酸爽真的刺激

水的好像也差不多了,那么接下来进入正题~

0x03 工具

本文会用到的工具。。

嘛,也不多就两个,CE和易语言IDE

至于为什么我那么执着于易语言。。(其实主要原因是易语言写挂真心简单)

毕竟。。百度一下一堆模组下载来引用就好

不过,方便其实也是有个前提的。。易语言程序众所周知都是32位的。。

你说用来改个同为32位的游戏,例如DNF吧,那简单

但是嘛,DNF都已经十几年了(准确来说已经14年了,05年出的游戏)

不过随着时间推移,现在都9012年了,游戏是越做越大。。(毕竟玩家的要求也高了~)

由于32位操作系统只支持最高4G内存,这年头还哪有游戏能4G就跑起来啊(小游戏除外。。)

所以游戏普遍已经都是64位的了,那么问题就来了,一个32位的进程要怎么去读取或者修改64位进程的内存啊?

是的,其实直接按照原来的方法也能改(调用Windows API)。。不过能改的只是低内存(内存地址为四字节)

可是对于一个64位进程来讲。。数据基本上都存在高内存(内存地址为八字节)的地方

这里说一下Windows API这个东西,修改内存、分配内存、读取内存等等的操作都需要一系列API的帮助,而API则是32位模式调用的是32位的API,64位模式调用的是64位的API

问题来了,32位进程只能操作低内存那高内存怎么办呢?

解决方法有三种,其一用支持64位的编程语言写(废话)

其二,手动把程序运行环境切换到64位模式(通过汇编语言)

其三,用Wow64函数(如NtWow64QueryInformationProcess64)显然这并不是一个好方法,因为有些函数Win10就连导入都没导入(调用不了),而且这些函数大多非文档化,你就连找他的函数原型都有难度(虽然可以自己推测出来)

本文当然是采用第二种方法(毕竟比较有挑战性hhh)

0x04 关于游戏基址

由于这次的主题并不是如何寻找基址(毕竟这并不是一个冷门游戏,要CT上网一搜一大把)(例如3大妈,连国外的CT都给你翻译好了,虽然不是很准就是了

首先游戏开开,然后CE开起来,接着选择进程,之后直接把下载好的CT拖进CE
就拿无敌功能说事,双击<脚本>然后就会弹出自动汇编的窗口

窗口里最上面注释我们可以看到这个功能的提供者很好人地把无敌点的特征码给出来了(其实使用的时候由于特征码是直接在游戏内存区域搜索,当然是越短而且越唯一的更好,所以右边E8那串拿来做特征码更好)(不过熟悉汇编的都知道E8其实对应的是CALL指令,不同游戏版本很大可能会不同)

至于最下面的90 90 90其实对应的是汇编的NOP指令(也就是什么也不干的指令)

这个功能的实现原理是直接把原有伤害判定的CALL给NOP掉(也就是不执行调用,自然不会受到伤害判定了)

这种修改方法属于比较简单的方式(因为不像劫持,要申请内存)

至于比较难实现的功能,那就是刚才说到的劫持

在这里我们可以看到明显复杂的修改(其实并不复杂就是了,比较CE原本就是64位进程直接调用64位API就能申请到内存地址)

让我简单说一下何为劫持,劫持也就是把原本要执行的代码强行通过JMP指令转跳到自己申请到的内存地址,然后执行自己的代码后再JMP回去继续执行游戏本身的代码

至于为什么一定要申请内存来放自己的代码(其实这个问题很傻逼,你原来的地方没有足够空间当然要申请一个空间放自己的代码啊)

基本上这里修改原理我们先过了一遍,接下来主要讲的是易语言如何实现

0x05 通过易语言实现

易语言调用x64call的汇编代码实现其实网络上早就有人研究并且贴出来了

我们这里直接抄来用就是了(毕竟本文并不是专门讲x64call实现方法的,想知道具体实现方法的大佬自己看原帖就可以了)

那么萌新说,我TM看不懂这些什么鬼东西啊,怎么办啊(别慌,问题不大)

其实真的问题不大,毕竟有人已经把这个实现了并且制作成了一个模块。。是的,我们熟悉的模块,直接引入到自己代码里调用就是了(论易语言的方便之处。。。)

具体要用到的模块。。点这里自己去下载

这里贴一下易语言实现无敌的源码,至于为什么调用的函数刚才说到的模块里没有。。
那是因为x64call和内存搜索的功能我时直接调用我自己写的模块实现的

刚才提到的模块十分强大,注释也很齐全。。所以嘛。。具体怎么写自己摸索hhh(毕竟我也是一个懒人)

至于刚才提到的劫持,看一下下图。。

嗯,这里解释起来似乎有点复杂。。(看得懂的看看不懂的跳吧)

至于Hook_Jmp,这里我贴一下

至于申请内存部分,其实没写过的话坑挺多的,这里我也直接贴

至于下面的红框地址其实就是游戏的ImageBase,至于为什么是每次减65536,是因为内存分配要对其0x10000(也就是十进制65536)

这里用这种方法申请内存主要原因是劫持的指令占用的字节数目比较少

如果不指定要申请的内存地址,通常系统会给你分配低内存,当你劫持转跳到低内存的时候你就知道为什么我这样写了

当然,申请内存部分也有一个坑

你必须要先保留才能提交。。不然会返回错误0xC0000018 STATUS_CONFLICTING_ADDRESSES

嘛,“Get_Ptr_Int64”这个函数其实是用汇编实现的,直接换成易语言内置的函数“取变量数据地址”也是一样的效果

大概实现方法上面也写的差不多了。。还有什么不明白的评论里留言,我看到尽量回就是了。。

0x06 成品

点击下载 密码:123(游戏版本更新已不可用)

注:怪物信息是按F键后锁定的怪物,Buff选项进任务后可用

建议:不要联机使用(不过就算你用我也阻止不了你,击杀功能联机会掉线)

武器编辑功能要在更换装备页面用鼠标指向武器才有效果

对于传送功能。。嘛如果没在地图上选点就传送,进虚空后果自负~