HOOK實現游戲無敵-直接修改客戶端
首先找到關鍵數據
血量的基地址
利用CE的內存搜索,來篩選得到綠色的地址也就是人物血量的基地址
這里我搜索得到的是004B6CC4
扣血函數call
通過訪問是什么來訪問了人物血量可以定位關鍵代碼,然后利用關鍵代碼在的位置來找到對應的函數call
這里我一共挨了5次打,所以只有這個計數為5的符合條件,右鍵選中進入反匯編程序,可以看到關鍵代碼是
這里我先把這個代碼給它變沒了,用nop填充
改了之后果然無敵了,但是有個問題是,改了之后我對怪物也沒有傷害了,所以這里我猜這個函數是一個公用函數也就是是一個父類的函數然后參數是父類的指針,再在函數里面判斷是怪物還是人進行攻擊
函數的首地址是0041FD40
然后采用ollydbg動態調試看看
利用Ollydbg調試關鍵代碼
剛剛找到了程序的關鍵代碼關鍵函數的地址,直接用ollydbg到達關鍵函數的地址
然后給這個函數打上一個斷點,在push esi哪里,因為前面我猜這個函數是根據函數的參數的不同來走不同的功能所以這里肯定是類里面的函數,而且它使用了MOV esi,ecx就更加堅定了我的想法就是這個是一個類的函數也就是一個thiscall
然后這里我直接dc esi,查看this指針指向的一個類的大概處理
這波是怪物打人,所以可以看到前面的一坨是怪物,后面的南宮飛雲什么的應該是主角的名字
然后一進來就有一個cmp指令加jnz,這個一看就是一個if語句,和剛剛的猜想是一樣的,就是進來先判斷是不是主角或者怪物然后跳轉具體的操作,這里是怪物打人,所以應該是把人傳進來扣血,
這里比較的是esi+0x4和2進行比較,所以我直接查看dd esi+0x4
第一個確實是2表示了這個應該會跳轉,所以這里我猜esi+0x4如果為2就表示是主角被打
然后我來打怪物試一下
這里可以很明顯得看得到,如果我擊打的是怪物,就會esi+0x4傳入的就是1,而且這個函數是一個掉血的函數,所以我猜這里是怪物類會有一個數據為1來表示是怪物,主角類有一個數據為2來表示是主角
修改客戶端實現無敵
這里用一個比較粗略的手段,就是直接在游戲客戶端里面修改這個函數的代碼邏輯,就是如果是2也就是主角被打,就把傷害改為0,也就是那個關鍵代碼
這里的edi就可以修改為0,但是也要考慮到edi的問題
在edi進入的時候,就被[esp+0xc]修改過一次,然后esp+0xc沒有被修改過,所以可以直接在函數的開始就跳轉來修改esp+0xc
這里我選擇直接在函數開始就先跳轉進來,判斷如果是2就讓esp+0xc的值變為0,選擇了一個空的地址 00434FAC
由於jmp需要用到五個字節,所以需要把函數的前五個字節的指令保存下來到自己用的內存里
這樣修改后就真正無敵了
總結