【干货】《DNF》反外挂逆向教程02:查找死亡call

文摘   社会   2025-01-06 00:00   广西  

我们继续讲这个秒杀敌人功能啊。上期教程我们找到了血量,还找到了当前的能量。通过血量呢可以实现一个血量增加减少的一个功能,但是呢我们想找到一个秒杀敌人的功能。我们把我们的血量改成零,他并没有秒杀敌人,虽然怪物的血量变成零,还要我们击打一下他才能彻底的死亡。我们人物也是啊,把我们人物改成零,它是从零开始往上增长的。

但是呢我们可以看一下啊,这是C1,这个值呢就是一个231,三一就是我们的当前血量。我们进地图,把这个血量呢给改成一,然后给他攻击一下,给怪物攻击一下,看一下啊。这时候呢我们血量清零了,然后呢我们也变成了幽灵状态,也就是所谓的死亡状态。说明呢这游戏给我们清零是有作用的,但是我们手动清零呢是没有任何作用的。说明呢在游戏中呢给我清零的同时呢也调用了某种功能,这种功能就是让我的模型死亡进入幽灵状态。

而我呢在这个C1里面呢改一个零呢是没有用的,因为我在C1里面呢是直接在这个地址给这个地址改变数值,没有调用它任何功能。那这时候呢我们就要到这个地址里面下一个写入看一下了。新地图啊,我进入了这个地图,然后呢我把我血量改满,防止被怪杀死了。这时候呢我们复制这个地址到查理bug里面下一个写入断点看一下,写入四字节放在这里,RAX呢写给了R15,R15就是我们的这个地址,这个地址啊。

然后呢IX就是写进来的值,我们改成零运行,有断点吗啊把这个断点给删掉啊运行,哎没有效果,怎么回事啊?下个段IX改成零运行我们的血量变成了零啊,没有死亡。改回来啊防止被怪打死了,那是不是说明了我们的攻击call呢就是不对,不是攻击call啊,我们的这个秒杀corner啊。

我们的这个秒杀高呢可能不在底下,不在这个RX的下一行啊。到return的这这么多代码里面是不是有可能不在底下,因为我在这里呢把ix付给25了,然后呢我把我的血量改成零了,这底下并没有任何反应啊,没有任何说我啊改成零了,然后我就触发了一个死亡call,然后呢我的模型就变成了幽灵状态,是不是并没有触发,那我们就往上找嘛,是不是往上找看一下IX呢来自于ISP加四八,继续往上看,这里有一个不断,那继续往下看,这里有一个不断,这里有一个断下了i is应该是一个5万啊,5万254就是要即将传给我们的值,这时候呢我们可以试一下了,我把这改成零运行一下,哎发现我们直接就死完了,我们复活啊,发现我们直接就死亡了。

那是不是说,我们的这个秒杀call啊,死亡call就在这个这里啊,就是他的下一行到我们刚刚的减号啊,回来到这一行就是我们下断点写入的地方啊。我们打个标记,是不是这一行到我还真不知道刚刚在哪里,在这里啊。我们到打标记的地方,是不是这么一大段代码里面有我们的这个死亡call,死亡功能是不是因为我这里把ix给改了啊,写进去的值给改了,他就能触发死亡了。
那我们在这里下个段嘛,正常的情况下是不会触发死亡的啊,就比如说现在是一九,第三是不会触发死亡的,我们必须把它改成零啊。是不是F8关卡运行,跳转跳转诶,没经过任何call,直接跳到这里了,两个跳转直接跳到这里了,然后运行运行ix,然后IEX啊,现在是零传给了25运行运行,然后运行我们死完了,这中间没有经过任何的call,是不是?那说明我们的功能并不在这个区间。

但是我们刚刚看了这个IX,给25呢传值进去呢,不管传多少值,他都不会触发死亡。那这里呢,那这里呢就是上面啊,我们在上面的时候给RIX给,就是说中间也没经过任何call,但是却触发了死亡。这说明什么?说明这个RAX不是关键点,IX不管怎么改,他都不会触发死亡,那什么是关键点?关键点呢,我们刚刚是把IX给改了,然后25变成了零,25里面的值变成了零,都不会触发死亡,那就有一个地方我们没改啊,RSP加四八。

是不是RSP加四八,我们没改,导致我们没触发死亡。我们在这里啊,进图啊,下个断点,这个ix怎么改都不会触发死亡,但RSP加四八呢,我们改一下,改成零了,运行直接就死了,但我们的血量可以看到,我们血量地址还是1万894,那说明了RSP加18才是关键点,我们一直都看错了,是不是啊?我们刚刚RX往上追,追RSP加四八,然后追到了那个地方,注意到了这个地方是不是,然后这个地方呢他在这中间呢没有任何的考,没经过任何的功能,就是一个跳转嘛,就是判断了这两个值,然后一个跳转,然后又判断了这两个值,又一个跳转跳到我们这个地方来了。

那么我唯一没改的地方就RSP加18了,RSP加四八呢,我们直接改了啊。RX不改的状态下呢,我们也直接就死完了,那RSP加四八呢,这导致我们就是说啊死亡的一个状态标志位,只要RSP加四八等于零,是不是我们就调用了一个死亡call,那我们刚刚还是猜错了啊,那死亡call肯定就会在这下面到return,这中间这么多call,是不是?那我们来看一下吧,其实一眼就能看得到啊,这就判断了rs748是否为零,我们进图,把怪杀死了,截图,然后呢我们在这下个段,因为这时候的RSP加四八呢,不等于零啊,是一个4364,它不等于零,所以说呢他跳转走了,跳转走了,那如果它等于零呢,他是不是就会下来,运行这个call可能还会运行底下的无数个call,这时候呢我们就要来区分一下啊,不为零的时候他们走的路线了,这时候是不为零的状态下,我们F8走到了这里,继续往下运行,每个call我们都打一个标志啊,这是不为零,我们就打一个一,这打个一这打个一,12打个一,嗯这样跳转我们也打一个啊,这种大跳转我们也打一个,一,一,嗯差不多了啊,减号回去。

这时候我们需要进入这里面了。那我们怎么进呢?啊,我们需要在这下个断点对比之前。下个断点,把RSP加四八,也就是这里的地址给定这里面的值啊,改成零断点去掉,然后往下运行。是不是我们就进去了?进去了一个call。我们改写个零,第二科考啊,我们写个零。

直接就死了啊,因为我这个断点卡了啊。重新再来一次啊,他这个游戏不知道为什么他会卡断点。如果你断的时间长了,他这个不不给你运行过去的啊,F8不给你运行过去。重新来啊,在这里呢下个段,然后呢把我们的这个ISP加四八改成零,F8,然后呢继续运行。这时候呢我记得上一次在这里卡了啊。我们直接到下一个F4运行到这儿啊,然后啊这又卡了。

其实下一行呢也应该是零啊,因为这个到这个中间没有任何跳转,这里这里是必定的。然后呢就看这个跳转啊,然后跳转再看这个跳转都是小跳转吧,啊最多跳转到这里,然后这里呢最多跳转到这里,然后呢到这里是不是就是我们正常的代码了,我们标记了一是不是就正常的代码了,不管他跳不跳啊,这个跳过去了呢也是正常的代码啊,那唯一的死亡代码呢是不是就是我们打零的这几个这四个,这打您的这四个呢,我们可以重点看一下啊,看什么呢,看他们的参数吗?

在这里下个段把四八的地方改成零,然后呢运行下去,第一个参数传了什么,RCX是什么嗯?这东西大家如果你听过上节课的话,我们就把上节课的东西拿出来啊,这个其实呢按我们来说呢,它就叫一个人物的对象,是不是就是这里基地址啊,加一零,然后减二零啊,3528的地方就是血量,然后呢减二零,这个呢就是我们对象的头部啊。

这里传了一个人物对象,然后RDX传了一个零啊,没有啊,没有RDX这个参数啊,直接就直接就是一个人物对象。那这里呢会不会是我们的这个所谓的死亡call呢,传了一个人物对象,告诉我,不管告诉谁吧,说我这个对象,也就是代表着我这个人物已经死亡,是不是有可能呢?那我们就来调用一下嘛。嗯这是我写的一个调用的东西啊,RCX啊,是我们的人物对象,RDX呢没有啊,然后call呢call是IXIX,也是我们人物对象里面要进一层,然后加1150的地方,1150就是这里。复制一下call一下,点击没有任何反应,也没有崩溃啊,没有崩溃。

说明我们直传对了,然后呢没有任何反应呢,说明我们call找的不对啊。我们要找的是一个机器杀call。这里呢我们来看一下啊,他这里好像是得到了一个IX,IX加C的地方呢和一进行一个对比啊,这个call应该只是为了啊拿出一个IX和加C的地方和一进行对比啊,那这里不用看了,我们看下一个看一下这个考。这个call呢我们啊还是需要在这里下个段,然后呢把这个RSP加四八呢给改成零,F8运行这个call。

这个call首先,RCX是什么?是我们人物对象,RDX直接就是一个一。然后没有R8、R9啊。我们来试一下复活复活啊。RCX是对象,然后呢RDX是一。然后呢这里呢也是一个人物对象啊,进一层近一层啊。RSR传给RCX就是一个人物对象,所以说ISR也是一个人物对象。人物对象进一层,找到了这个地址啊,复制地址加一个。加一个多少啊?回车,那就是这个啊。现在我们测试一下诶,我们人物是不是立马就死亡了?我血还是满的。是不是我人物立马就死亡?那这里呢是不是属于一个死亡call?是不是一个死亡call?那这里呢也只是我们杀死我自己的一个死亡call。那如果是敌人?是敌人怎么办?
嗯,我们回到训练场。这里怪都脆皮,一棍子就敲死了。我们回到训练场啊,召唤一只怪,找一下他的血量,然后呢我们再看一下。召唤不能召唤这个召唤一个有限生命的召唤。然后呢我们C1来搜索一下未知数是值,然后呢X我打他一下减少的数值啊。其实啊我再打他一下,19点血,是不是我们就是说减减少的数值啊?数值减少了多少?
19再次扫描,再打他一下,减少了12,再次扫描,再打他一下,减少了12,再次扫描,再打他一下,是不是只有这两个是先变的,而且这几个值值太大了啊,这血量太大了。那只有这两个值我们可以改一下吗?改成零,可以看到它的选项呢一直在减少,直到减少到啊零点血,但是他还没死亡,因为我们没掉死亡call,那这个呢就是它的血量了啊,我们给他改回来看一下,血量又回来了。
我们到这血量这儿呢,下一个断点写入四字节,打他一下,断下了,断的还是我们这个地方,短的还是我们这个地方,那是不是这个SP加18等于零的时候就会进这里面?就进入里面就会进到我们的这个死亡call,是不是?那这里呢就是说这里啊,这里我们直接就把这个给改一下,是不是就行了?我们这里传的是一个人物对象,那这里呢就是一个怪物对象,是不是?那我们在这里呢断点下一个,这是怪物血量啊,断点下一个读取四字节,直接就断了,一样的啊。
那我直接就怀疑和我们人物血量偏移是一样的,我们人物血量的偏移是多少啊?那我就这这个地址直接减3528了啊,断联而不是断点哦。复制地址减3528看一下,对不对?哎,这个和我们的对象是不是非常像?第二行是一个非常短的,像一个ID一样。那我们就复制一下这个地址嘛,这就是他的对象了,然后这个call呢,就是说啊这对象加1210。这个call呢不一定是对的啊,我们要自己进去看,进一层啊,然后复制一下它的地址,然后加一个1210,是不是不一样?是不是不一样?然后呢我测试一下他是不是已经死了,直接就死了。那这样我们就找到了一个死亡call啊,我们已经确定了他就是一个可以秒杀怪物,可以秒杀我自己的死亡call。
那本期教程就到这里了啊,我们下期讲一下遍历周围。正好那我们遍历过周围,然后把每个人的对象都填上去,然后呢把每个人对象底下的这个1210啊对给call一下,是不是可以杀死所有敌人,瞬间秒杀所有敌人啊?那这期教程就到这里了。

暮色的狐
这是一只高强度上网冲浪、高质量输出内容的狐狸。主打ACGN杂谈、技术干货分享、第九艺术鉴赏、网梗百科解析、情感树洞鸡汤、正能量价值观~
 最新文章