一直有人在那说消耗改人偶更新不了!不甚了解,于是上去看了一下,原来TX改了东西!也挺搞笑的,一个那么垃圾的东西也去和谐!还有那些说更新不了的论友,我只想说,何必要吊死在一棵树上?能HOOK的地方多了去了,自己随机应变下嘛!下面说三个方法,第一个方法是物品CALL外面HOOK,跟以前的一样;第二个是CALL内部,但是这里在HOOK里面加入了堆栈判断,跳转修改,比较复杂;方法三也是CALL内部HOOK,但是这是push retn 跳转后再修改! 都不相同!方法
_①:
004BC6B4 E8 F7BEFFFF call 004B85B0
004BC6B9 8B4D F0 mov ecx,dword ptr ss:[ebp-0x10]
004BC6BC 8B10 mov edx,dword ptr ds:[eax]
004BC6BE 51 push ecx
004BC6BF 8BC8 mov ecx,eax
004BC6C1 FF92 54050000 call dword ptr ds:[edx+0x554]复制代码
004BC6B9 8B4D F0 mov ecx,dword ptr ss:[ebp-0x10]这里下断后,发现ecx是物品ID,mov ecx,dword ptr ss:[ebp-0x10]对ecx赋的值!
写法——
004BC6BC /E9 FF486C02 jmp 02B80FC0 '跳到空白内存!
02B80FC0 8B10 mov edx,dword ptr ds:[eax] ; 还原游戏
02B80FC2 68 131F0000 push 0x1F13 ; 格斗人偶ID
02B80FC7 8BC8 mov ecx,eax ; 还原游戏
02B80FC9 ^ E9 F3B693FD jmp 004BC6C1 ; 跳回去
这是最简单的方法!!
方法_②:
004BC6C1 FF92 54050000 call dword ptr ds:[edx+0x554] 这里断下后,F7进去,一路F8到了
01D1C014 68 3B14D101 push 0x1D1143B
01D1C019 C3 retn
看到了push 0x1D1143B 入栈一个地址下面紧接着一个retn返回,呵呵有意思,先记下来,作为第三个方法!
继续F8——
01D11642 8DA424 FCFFFFFF lea esp,dword ptr ss:[esp-0x4]
01D11649 878424 04000000 xchg dword ptr ss:[esp+0x4],eax
01D11650 8DA424 08000000 lea esp,dword ptr ss:[esp+0x8]
01D11657 FF52 48 call dword ptr ds:[edx+0x48]
01D1165A E8 BC410200 call 01D3581B
从这里01D1165A E8 BC410200 call 01D3581B进入物品CALL下一层!
而在之前有一个01D11657 FF52 48 call dword ptr ds:[edx+0x48] 进去看一下到了
00404BA0 81C1 C4000000 add ecx,0xC4
00404BA6 E9 05000000 jmp 00404BB0
00404BAB CC int3
记下他的堆栈esp=01D1165A 后面有用!现在我有点喜欢TX的JMP了!!
回到游戏对00404BA0处重新下断,发现还没吃药也会被断下来(后面发现,即使在仓库什么也不干也会被断下!),这说明了很多地方,包括游戏本身也会调用它,都会被断下!这里不好转移,但是还是有办法的,每个调用它的线程,有一点是不同的,就是堆栈的esp是不同的,于是可以通过比较esp的值来判断是否是物品CALL调用了他!
好了,思路出来了!! 先在
01D11657 FF52 48 call dword ptr ds:[edx+0x48] 处下断,吃个药断下来后进去发现
堆栈的第六个值是物品ID,也就是esp+14 处存的物品ID!记下esp=01D1165A
所以可以是00404BA6 E9 05000000 jmp 00404BB0 JMP 跳到空白内存,然后修改堆栈!
随便找一个吧:
02B80FD0 0000 add byte ptr ds:[eax],al
02B80FD2 0000 add byte ptr ds:[eax],al
02B80FD4 0000 add byte ptr ds:[eax],al
但是这里注意,一定不要是先直接修改jmp 00404BB0 跳过去后在来写代码,不然游戏直接崩溃的!!
我们要跳到 02B80FD0 ,那先在这里写好代码在回去修改jmp跳转!
cmp dword ptr ss:[esp],0x1D1165A '判断当前调用是否是物品CALL的调用!
jnz 00404BB0 '不相等就调回游戏原处,不做任何修改!相等就继续往下走!
mov dword ptr ss:[esp+0x14],0x1F13 ‘(1F13=7955格斗人偶,有兴趣的可以自定义!)
jmp 00404BB0 ’改完了就跳回去!
还原的话,把00404BA6 E9 05000000 jmp 00404BB0重新写一下就行!
方法2加入了判断值形式的HOOK,相对复杂一点!
讲一下第三个方法——刚才无意看到的一个好地方!
方法_③:
01D1C014 68 3B14D101 push 0x1D1143B
01D1C019 C3 retn
这里是先入栈一个地址,然后再retn返回到对应地址!也相当于jmp!!
所以一样可以利用一下!!
既然是返回到1D1143B这里,那就在1D1143B处下断看下堆栈情况以便于怎样修改堆栈!
断下后看到堆栈第八个值也就是esp+18处存放的消耗品ID!
好了,可以修改了!!
找一空白内存——
02B80E91 0000 add byte ptr ds:[eax],al
02B80E93 0000 add byte ptr ds:[eax],al
02B80E95 0000 add byte ptr ds:[eax],al
跳到 02B80E91处修改!!
写法——
01D1C014 68 3B14D101 push 0x1D1143B 改为 push 02B80E91
01D1C019 C3 retn '这里不变!!
mov dword ptr ss:[esp+0x18],0x1F13‘修改
push 0x1D1143B '入栈返回游戏的基址
retn ’依葫芦画瓢的返回游戏就好了,这里还可以直接jmp 的跳到1D1143B,效果一样
说明图片如下:
源码测试可用:
精心工作室E语言源码开发.zip[点击下载](155 K) 下载次数:11 累计下载获得 DB 22 刀