免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖
宠物信息加载中......

[EXE修改] [EXE修改] 暴击系统 BY:LunaticMoon

EXE修改

详细描述 -
本文將會教授更改LF2機碼(machine code / asemble code(這個翻譯不太正確))的技巧,
強烈建議先學習asm,由於本文不是為了新手而設,請在發問前在Google看一下。
我會利用先前製作的爆擊系統作範例,那是運用了Dynamic DLL Injection(即非直接修改lf2.EXE)的技巧,看起來好像外掛(對我來說怎看也不是XD),
而且原理跟Static DLL Injection差不多,那邊的教學有空再寫,
這裡我只會介紹Static DLL Injection(即直接修改lf2.EXE),本人認為運用Static DLL Injection已經足夠修改LF2。
如有錯漏請提出建議,謝謝。
強烈建議先備份LF2.EXE
工具:Tsearch (載點:http://www.timsvault.com/cheattools/tsearch.zip
   Ollydbg(載點:http://www.ollydbg.de/odbg200k.zip
原理:運用隨機數在攻擊時決定該攻擊是否爆擊。
   從簡單出發,先看一下在C/C++產生隨機數的方法。
   如果不懂產生隨機數的原理/看不懂以下的,本文不太適合你。

Code: Select all
#include <ctime>
#include <iostream>
using namespace std;
main()
{
      srand((unsigned)time(0));
      if(rand() % 10 == 0)         //把隨機數除10取其餘數 即十分之一機會
      {
         printf("爆擊");      
      }
      else
      {
         printf("普通攻擊");      
      }
      system("PAUSE");
}


那麼可以如何套用於LF2中? 簡單...分為2個步驟:
   1.在LF2的程式進入點 呼叫 srand((unsigned)time(0))。
   2.在角色受傷之前 呼叫rand()並決定應否把攻擊倍化。

程式進入點
以Ollydbg開啟LF2.exe,載入後第一個停頓的地方便是程式的載入點。
Code: Select all
00445560 CALL 00445A5D  <---載入點
00445565 JMP 0044529F


由於載入點出現Call,所以程式將會呼叫0x00445A5D,

Code: Select all
00445A5D PUSH EBP
00445A5E MOV EBP,ESP
00445A60 SUB ESP,10
00445A63 MOV EAX,DWORD PTR DS:[44EEA4]
00445A68 AND DWORD PTR SS:[LOCAL.2],00000000
00445A6C AND DWORD PTR SS:[LOCAL.1],00000000


00445A68 00445A6C 這2個位置作用不大可以砍掉(經測試後的結果),還是怕的話等等可以加回去。
到程式後方的記憶體(那些連續的空白的記憶體)選個位置我選了0x00446600。
然後可以改把進入點改成這樣。

Code: Select all
00445A5D PUSH EBP
00445A5E MOV EBP,ESP
00445A60 SUB ESP,10
00445A63 JMP 00446600  <---跳到選好的位置
00445A68 NOP
00445A69 NOP
00445A6A NOP
00445A6B MOV EAX,DWORD PTR DS:[44EEA4]      <---完成後跳回這裡


然後在0x00446600寫上:

Code: Select all
PUSH 0
CALL 75D4F708       <---這個是msvcrt.time( 0 ) "0"在上一行PUSH了
PUSH EAX           <---EAX存了msvcrt.time( 0 ) 的傳回值
CALL 75D4F757       <---這個是msvcrt.srand( EAX ) "EAX"在上一行PUSH了
JMP 00445A6B


那就是說上面的程式與 srand((unsigned)time(0)); 有同樣功效
你可以把原本的00445A68 00445A6C加回去(懶了)

受傷之前
開啟TSearch,然後載入LF2。
玩LF2(說真的),在戰鬥開始的時候按F1(暫停遊戲),
在TSearch搜尋(左邊的方格表下面的一行細小的按鈕,按第一個放大鏡。)500(500=一開始的血量)。
然後回到LF2,給別人打幾下,
在TSearch搜尋(按第二個放大鏡,在表中記憶體中搜尋),這次不要直按下去,選擇Has Decreased(已減少)。
然後回到LF2,按F7,按第二個放大鏡,搜尋500,被打,搜尋已減少,
重複直到上表剩下2個數,一個是現在的HP(數值比較少),一個是能夠恢復的血量限制(數值比較大)。
不要關掉LF2,開啟Ollydbg載入(ATTACH)已開啟的LF2.EXE,把TSearch顯示的現在的HP的記憶體位置複製,
在Ollydbg按下CTRL+G,貼上,按確定。在跳到的那行按右鍵,Follow in DUMP。
在Ollydbg左下視窗應該有一些反白了的HEX,按右鍵,Breakpoint->Memory,只點選WriteAccess,按OK。
繼續執行LF2,在下一次,受攻擊的時候Ollydbg會停在作出傷害的那行(建議設定Breakpoint之前先在LF2按F7),
如果你沒有做錯應該是

Code: Select all
0042E95C SUB DWORD PTR DS:[EAX+2FC],ECX。


把這行改成
Code: Select all
0042E95C JMP 00446700
0042E961 NOP


同樣地,在0x00446700的空白地方進行爆擊的程序,然後跳回 0x0042E962。

在0x00446700加入

Code: Select all
00446700 PUSH EDX
00446701 PUSH ECX
00446702 PUSH EAX   ->暫時儲存在Stack
...(一堆NOP)
00446706 CALL 75D4C070 ->呼叫Msvcrt.rand()
0044670B CDQ      ->把EAX(rand的傳回值)轉換為EDX:EAX的格式
0044670C MOV ECX,0A   ->ECX = 10 (10 = 0x0A)
00446711 IDIV ECX     ->"EDX:EAX"/ECX,把商儲存於EAX,餘數儲存於EDX
00446713 TEST EDX,EDX ->EDX == 0 (有關Flag方面請自行看Google)
...(一堆NOP)
0044671A POP EAX
0044671B POP ECX
0044671C POP EDX   ->把暫時儲存在Stack的資料恢復
0044671D NOP
0044671E JNE SHORT 0044673A  ->如果00446713不成立的話(即EDX != 0),則跳到0x0044673A。
00446720  LEA ECX,[ECX*4+ECX]  ->ECX(攻擊力)= ECX * 4 + ECX (即5倍攻擊力)
...(一堆NOP)
0044673A SUB DWORD PTR DS:[EAX+2FC],ECX ->原本被刪去的的那句,進行傷害。
(外話:EAX應該是人物的Struct/Class,+2FC則是儲存HP的位置,所以EAX+2FC其實是 public: int Character.HP)
00446740 JMP 0042E962      ->跳回去


呼···好像寫了一堆火星文,完成啦,儲存然後測試。
這裡是完成品,自己看 http://www.box.net/shared/1bzam2309q (眾:重點來了。)
這樣就不是外掛了

後話:
我算是見證了LF2的興(+衰)還沒有Louis EX 的時候我已經在玩(那時候人們開始發現*.DAT的秘密)。
這幾天無聊回來看,哇!人走光了。
九天十地,唯我独尊

宠物信息加载中......
還可以 謝謝

TOP

宠物信息加载中......
很不錯喲
YLF2

TOP

宠物信息加载中......
改exe嗎?暴擊判定不是那麼好平衡的
独志犹存兮,卷雨欲凌天

TOP

宠物信息加载中......
表示是来看火星文的
我形我秀

TOP

宠物信息加载中......
顶!!!!!!!!!!

TOP

宠物信息加载中......
顶!!!!!!!!!!

TOP

返回列表