Steam 游戲 《Crashlands(崩潰大陸)》修改器制作-[先使用CE寫,之后有時間的話改用CheatMaker](2020年寒假小目標12)


日期:2020.02.15

博客期:155

星期六

    

【溫馨提示】:

  只是想要修改器的網友,可以直接點擊此鏈接下載;

  只是想拿CT文件的網友,可以直接點擊此鏈接下載;

  沒有博客園賬號的網友,可以選擇百度網盤下載:

    地址:https://pan.baidu.com/s/14xim_bpND3tfRa9NYNK7FA

    提取碼:cras

  Git Hub下載地址https://github.com/TwoStarsGodNightSky/GameTrainer (Git Hub已過期)

  如果修改器失效了,你們可以在博客園本頁直接評論,也可以給我發郵件告訴我,就是不要到百度雲上去說了,百度雲我好久不登錄一次的!大家給我發郵件的話,記得要注明是哪個游戲,內容當然是越詳細越好啦!郵箱地址:nightskysxs@163.com

  博客防爬取部分:https://www.cnblogs.com/onepersonwholive/p/12312322.html

  B 站測試視頻 bv 號BV1af4y1k7fX

  當前最新研究的版本如下圖:

   


前言

  今天是寒假最后一天了,最后寫個修改器作為結尾吧!今天本來想做《打造世界》的修改器的,奈何本人水平菜,搞不懂(有人會問了——博主,你不是有人做了修改器,自己就不做了嗎?我的回答是:嗯!M佬 確實已經在 WeMod 里寫了,但是無限物品一項我怎么也沒實現【無效】 )!只好半路轉移來做 崩潰大陸 了,當然今天因為時間原因還是只做一部分了,剩下的我在寒假以后補充回來!

修改內容

  今天先做 無限血量 吧!使用的方法——人造地址!嗯,凡是用到這個方法的都需要 Home 鍵做初始化!

   

  我已經找了 10 級以上的偏移地址了,居然沒能找到可以用的!唉~

  我知道,這個游戲最麻煩的地方在於收集資源,我也會在寒假過后盡快地把 這部分補齊 的。(水平有限,開學以后時間也有限)

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(point,8)
 5 label(returnhere)
 6 label(originalcode)
 7 label(exit)
 8 registersymbol(point)
 9 
10 newmem:
11 
12 originalcode:
13 mov [point],eax
14 movsd xmm0,[eax]
15 addsd xmm0,[Crashlands.exe+170E880]
16 
17 exit:
18 jmp returnhere
19 
20 "Crashlands.exe"+1262D40:
21 jmp newmem
22 nop 7
23 returnhere:
24 
25 
26  
27  
28 [DISABLE]
29 dealloc(newmem)
30 unregistersymbol(point)
31 "Crashlands.exe"+1262D40:
32 movsd xmm0,[eax]
33 addsd xmm0,[Crashlands.exe+170E880]
ResetBlood

血量綁定效果展示

  


后續更新內容-----------------------------------[ 2020-07-09, 更新內容 ]

  我知道那個生命值的失效了,但奈何本人太菜了,真的找不到數據啊!我看那個里面根本沒有映射關系,每次輸出的信息都是隨機分布的。且不建立映射,我也不知道它是怎么讀到這個數據的,於是我轉頭去做物品數量修改了,這個物品數量修改說簡單是理解起來簡單——每一次搜索 雙浮點數(Double)找到的 2 個值都進行修改就完事了。但要說它難是物品的存儲地址也沒有映射,沒辦法只能一對一對地找,而且修改它的值的位置是一段共用代碼,它可能修改的值有幾千種可能,從這里面找到一種合適的來的方法貌似是行不通的。於是,我可以先暫時采用集 10 個物品,召喚神龍(歸變為 49999 )的方法。

  對應找到地址的兩段分別進行匯編:

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(td_first,8)
 5 label(returnhere)
 6 label(originalcode)
 7 label(exit)
 8 
 9 newmem: //this is allocated memory, you have read,write,execute access
10 //place your code here
11 
12 originalcode:
13 push edx
14 CVTTSD2SI edx,xmm0 // 浮點-轉-整型
15 // 如果要修改為 10,就變
16 cmp edx,A
17 je exit
18 //如果要原值是 49999 ,就變
19 movsd [td_first],xmm0
20 movsd xmm0,[edi]
21 CVTTSD2SI edx,xmm0
22 cmp edx,C34F
23 je exit
24 pop edx
25 movsd xmm0,[td_first]
26 //源碼
27 movsd [edi],xmm0
28 pop edi
29 jmp returnhere
30 
31 exit:
32 mov edx,C34F      // 49999
33 CVTSI2SD xmm0,edx
34 pop edx
35 movsd [edi],xmm0
36 pop edi
37 jmp returnhere
38 
39 "Crashlands.exe"+1D80E26:
40 jmp newmem
41 returnhere:
42 
43 
44  
45  
46 [DISABLE]
47 //code from here till the end of the code will be used to disable the cheat
48 dealloc(newmem)
49 dealloc(td_first)
50 "Crashlands.exe"+1D80E26:
51 movsd [edi],xmm0
52 pop edi
53 //Alt: db F2 0F 11 07 5F
"Crashlands.exe"+1D80E26
 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(td_second,8)
 5 label(returnhere)
 6 label(originalcode)
 7 label(exit)
 8 
 9 newmem: //this is allocated memory, you have read,write,execute access
10 //place your code here
11 
12 originalcode:
13 push edx
14 CVTTSD2SI edx,xmm0 // 浮點-轉-整型
15 // 如果要修改為 10,就變
16 cmp edx,A
17 je exit
18 //如果要原值是 49999 ,就變
19 movsd [td_second],xmm0
20 movsd xmm0,[edi]
21 CVTTSD2SI edx,xmm0
22 cmp edx,C34F
23 je exit
24 pop edx
25 movsd xmm0,[td_second]
26 //源碼
27 movsd [edi],xmm0
28 mov ecx,[ebp-0C]
29 jmp returnhere
30 
31 exit:
32 mov edx,C34F      // 49999
33 //CVTSI2SS xmm0,edx // 轉-浮點
34 CVTSI2SD xmm0,edx
35 pop edx
36 movsd [edi],xmm0
37 mov ecx,[ebp-0C]
38 jmp returnhere
39 
40 "Crashlands.exe"+1D82773:
41 jmp newmem
42 nop 2
43 returnhere:
44 
45 
46  
47  
48 [DISABLE]
49 //code from here till the end of the code will be used to disable the cheat
50 dealloc(newmem)
51 dealloc(td_second)
52 "Crashlands.exe"+1D82773:
53 movsd [edi],xmm0
54 mov ecx,[ebp-0C]
55 //Alt: db F2 0F 11 07 8B 4D F4
"Crashlands.exe"+1D82773

后續更新內容---------------------------------[ 2020-12-07, 更新內容 ]

  好了,之前一直都想不到有什么方法能夠完成斷點的處理。因為那一段共用代碼是每一秒執行數百次以上的,所以我們找不到對應修改的跳轉。不過還是有方法的,我仔細研究發現了一種方法:

  1、首先,進入游戲找到每秒傷害,如下圖:

   

  2、選擇好 Double (雙浮點) 類型的搜索,(如上圖,我應該搜索 79.0 )點擊搜索更換武器,再次搜索就可以得到地址:

  

  3、得到了兩個地址,將其中一個改為 9999999 ,之后綁定住數值,去攻擊怪物,看能不能一擊干掉怪物。親測,數值較大的為有效的值,另外一個是用於展示的。我們需要監聽是什么修改了此地址的值。之后點擊“關閉”,讓它修改。

  

  4、然后進入到反匯編程序。

  

  5、可以看到是 "Crashlands.exe"+1519 的地址段,我們在這里設置一下書簽。然后選擇 工具 ---> 自動匯編,選擇 模板 ---> CT 表框架代碼 ,再次選擇 模板 ---> 代碼注入,之后改成如下代碼,並分配到當前 CT表:

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 label(returnhere)
 5 label(originalcode)
 6 label(exit)
 7 
 8 newmem: //this is allocated memory, you have read,write,execute access
 9 //place your code here
10 
11 originalcode:
12 movsd [ecx],xmm0
13 pop esi
14 // 282B36B0 應該是 搜索到的代碼
15 cmp ecx,282B36B0
16 jne exit
17 // 下面是臨時代碼
18 movsd [ecx],xmm0
19 jmp returnhere
20 
21 
22 exit:
23 jmp returnhere
24 
25 "Crashlands.exe"+1519:
26 jmp newmem
27 returnhere:
28 
29 
30  
31  
32 [DISABLE]
33 //code from here till the end of the code will be used to disable the cheat
34 dealloc(newmem)
35 "Crashlands.exe"+1519:
36 movsd [ecx],xmm0
37 pop esi
38 //Alt: db F2 0F 11 01 5E
temp CT

  6、我們激活一下這部分代碼,之后看 "Crashlands.exe"+1519 的地址段,記錄下的跳轉地址 (親測是 03330000),跳轉到這里,然后記錄上書簽。

  7、在剛剛跳轉到的地方設置斷點如下:

  

  8、返回去繼續換裝備,看看斷點的狀況:

  

  9、我們選擇 視圖 ---> 堆棧跟蹤,得到結果如下:

  

  10、我們就找到了連續多個的跳轉:

  ”Crashlands.exe“+1BDFF9B

  ”Crashlands.exe“+1E62B49

  ”Crashlands.exe“+1E6123D

  那我們就直接跳轉到 ”Crashlands.exe“+1BDFF9B 地址段,找到 call ”Crashlands.exe“+14F0,設置斷點發現,它的 ecx 的值是從 282B3670 282B38A0 變化的。而其中 282B36B0 是我們的修改值——攻擊力。所以這一部分代碼執行應該是賦值給玩家的這一系列的屬性。那么,我們向上一步一步做監聽,去尋找 ecx 的賦值語句。其中下圖的 nop 一句不會被執行,而是直接執行的 mov ecx,[eax+0C] 一句。所以我們尋找上一步就需要搜索代碼段,選擇搜索 ---> 查找匯編碼。左邊大框輸入當前的執行到的地址(我的是 Crashlands.exe+1BDFF70,搜絕對地址 024CFF70 ,如下圖),右邊將起始地址的后四位改為 0,點擊搜索。

  

  11、搜索結果如下,找到 JNE 一句,跳轉並設置書簽:

  

  12、之后,我們向前尋找 ecx 改變的原因,似乎是 mov ecx,[esi+00000114] 一句,所以現在的線索就變成了 esi 的值,不過我們可以取巧在前面一句設置斷點,觀察數值的變化(eax edx

  

  13、得到的數值變化關系為:

  一開始,eax282B3670edx 00000000,之后每一次運行,eax 都自增 10edx 都自增 1,所以我們可以根據 edx 的值,判定我們索取的 eax 的值。

  14、我們在 add esp,08 一句進行匯編,目的是找到 edx 對應的初始 eax 值。

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(reset_data_of_base,8)
 5 registersymbol(reset_data_of_base)
 6 label(returnhere)
 7 label(originalcode)
 8 label(exit)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 //讓它們先執行,以免報錯
15 add esp,08
16 //判斷edx的值,將eax初始值獲取
17 cmp edx,00000000
18 jne exit
19 //如果是第一次的數據
20 mov [reset_data_of_base],eax
21 jmp exit
22 
23 exit:
24 mov ecx,[esi+00000114]
25 jmp returnhere
26 
27 "Crashlands.exe"+1BDFF02:
28 jmp newmem
29 nop 4
30 returnhere:
31 
32 
33  
34  
35 [DISABLE]
36 //code from here till the end of the code will be used to disable the cheat
37 dealloc(newmem)
38 dealloc(reset_data_of_base)
39 unregistersymbol(reset_data_of_base)
40 "Crashlands.exe"+1BDFF02:
41 add esp,08
42 mov ecx,[esi+00000114]
43 //Alt: db 83 C4 08 8B 8E 14 01 00 00
find redata

  15、然后,回到游戲刷新數據,讓代碼段執行,查看地址

  

  16、選擇添加地址,選擇指針,最開始的地址輸入 reset_data_of_base,第一偏移量設置為 40,就可以實現不查找內容直接找到攻擊力的地址。

  

  17、我們修改這個值到 9999999,然后綁定住,就可以實現一擊必殺了。

  

  PS:新的修改器已經更新,其他功能我再摸索爭取做的和《九張羊皮紙》那樣吧。

   


后續更新內容----------------------------------------[ 2020-12-29 至 2020-12-31, 更新內容 ] 

  先按照之前的內容把調用好的代碼進行綁定,搞定可以直接完成 “一擊必殺” 的效果,我之前看了 WeMod 上已經有了 它的修改器。功能有兩項——把資源型物品改成 99 以及 血量綁定999,但是之后的強大怪物能不能不被秒殺,這我沒有做測試。不過前期應該可以配合着使用。我給大家看看直接的截圖:

  

  以上是 29 號的研究,只不過是在更新攻擊力的代碼那里判斷一下是不是攻擊力的地址,如果是那就修改成 99999999 ,否則不用管。

  下面是對應代碼:

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(reset_data_of_base,8)
 5 registersymbol(reset_data_of_base)
 6 label(returnhere)
 7 label(originalcode)
 8 label(exit)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 add esp,08
15 cmp edx,00000000
16 jne exit
17 //如果是第一次的數據
18 mov [reset_data_of_base],eax
19 jmp exit
20 
21 exit:
22 mov ecx,[esi+00000114]
23 jmp returnhere
24 
25 "Crashlands.exe"+1BDFF02:
26 jmp newmem
27 nop 4
28 returnhere:
29 
30 
31  
32  
33 [DISABLE]
34 //code from here till the end of the code will be used to disable the cheat
35 dealloc(newmem)
36 dealloc(reset_data_of_base)
37 unregistersymbol(reset_data_of_base)
38 "Crashlands.exe"+1BDFF02:
39 add esp,08
40 mov ecx,[esi+00000114]
41 //Alt: db 83 C4 08 8B 8E 14 01 00 00
find redata
 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 label(returnhere)
 5 label(originalcode)
 6 label(exit)
 7 
 8 newmem: //this is allocated memory, you have read,write,execute access
 9 //place your code here
10 
11 originalcode:
12 call Crashlands.exe+14F0
13 push edx
14 mov edx,[reset_data_of_base]
15 add edx,40
16 push ebx
17 mov ebx,F423F
18 cvtsi2sd xmm0,ebx
19 movsd [edx],xmm0
20 exit:
21 pop edx
22 jmp returnhere
23 
24 "Crashlands.exe"+1BDFF96:
25 jmp newmem
26 returnhere:
27 
28 
29  
30  
31 [DISABLE]
32 //code from here till the end of the code will be used to disable the cheat
33 dealloc(newmem)
34 "Crashlands.exe"+1BDFF96:
35 call Crashlands.exe+14F0
36 //Alt: db E8 55 15 42 FE
make attack 99999999

  之后我進行了對物品修改的研究:

  1、首先,搜索物品的數量(雙浮點)

  2、找到一組相同的值。這個時候,可以只修改其中一個值,查看是否可以建造。

  3、找到其中真實值以后,選擇 “是什么 訪問 了這個地址”。(訪問是要找修改之前,是什么地方讀取了這個地址。修改是要找把值最終修改的地方)

  4、回到游戲中,更改一下物品數量。

  5、查找到是 "Crashlands.exe"+1E7B425 一處的代碼訪問了 [eax+10] 的值。

  6、在這里設置 斷點 會發現它會不斷的停在這里,不會執行我們需要的代碼。

  7、所以我們采用老方法,在這里比較一下是不是那個值(才怪)。我們直接查看是代碼停止的時候,剛好是哪些特殊的 eax 值,發現真正停到的值就只有兩個 它們的地址之間相差 208.

  8、我們寫代碼進行比較,如果是這兩個地址就跳過正常執行。繼續設置斷點。回去采集一項資源。

  9、發現最終會出現一個 FFFFFFFF 的停止符,我們一並設置跳過,然后看看可不可以把剩下的數據改了。

  10、結果是可以改了,但是一切換地圖就又會崩潰。經過長期重試,我總結原因:打開地圖的時候,會更新地圖的數據,而它恰恰是不能修改的。

  11、而且上述的效果也不是很持久,因為之前跳過的那兩個地址也是變化的。這就很難辦了,起初我決定設置兩個全局變量,當讀取到是那兩個變量的時候再跳過,但是這個和后面地圖的代碼無法達到兼容的效果,所以最終還是要靠一系列數值上的排除。

  12、一次比較是否相等,還不如比較誰大誰小。本着這樣的原則,我們首先排除掉 ebxecx 不等於 00000000 的項,找到 [eax+10] 的值,分別存取它的 雙浮點的值 和 4 字節 的值。

  13、之后發現 雙浮點的值 對應 4字節 都是 0 ,我們可以直接排除 4字節 狀態下的 [eax+10] 不是 0 的項。

  14、之后,發現地圖對應的雙浮點是 354.00378.0022.00。所以,我姑且讓 [15,1000] 區間內不通過。其余的修改為 49999 就好了。

  對應代碼:

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(tmp_data,8)
 5 registersymbol(tmp_data)
 6 label(returnhere)
 7 label(originalcode)
 8 label(exit)
 9 label(test_oil)
10 
11 newmem: //this is allocated memory, you have read,write,execute access
12 //place your code here
13 
14 originalcode:
15 
16 cmp ebx,00000000
17 jne exit
18 
19 cmp ecx,00000000
20 jne exit
21 
22 push edx
23 mov edx,[eax+10]
24 mov [tmp_data],edx
25 pop edx
26 
27 cmp [tmp_data],00000000
28 jne exit
29 
30 push edx
31 movsd xmm0,[eax+10]
32 cvttsd2si edx,xmm0
33 mov [tmp_data],edx
34 pop edx
35 
36 cmp [tmp_data],0  //0
37 je exit
38 cmp [tmp_data],F   //15
39 jb test_oil
40 cmp [tmp_data],3E8   //1000
41 ja test_oil
42 jmp exit
43 
44 test_oil:
45 push ebx
46 mov ebx,C34F //49999
47 cvtsi2sd xmm0,ebx
48 pop ebx
49 movsd [eax+10],xmm0
50 jmp exit
51 
52 exit:
53 movups xmm0,[eax+10]
54 mov edi,[ebp+08]
55 jmp returnhere
56 
57 "Crashlands.exe"+1E7B425:
58 jmp newmem
59 nop 2
60 returnhere:
61 
62 
63  
64  
65 [DISABLE]
66 //code from here till the end of the code will be used to disable the cheat
67 dealloc(newmem)
68 dealloc(tmp_data)
69 unregistersymbol(tmp_data)
70 "Crashlands.exe"+1E7B425:
71 movups xmm0,[eax+10]
72 mov edi,[ebp+08]
73 //Alt: db 0F 10 40 10 8B 7D 08
item to 49999

  為了更好的修改物品數量,我們考慮把之前的數據項也改掉(記得之前找到兩個“物品地址”,只有一個進行了監聽)。我們對第二個進行修改。

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 label(returnhere)
 5 label(originalcode)
 6 label(exit)
 7 
 8 newmem: //this is allocated memory, you have read,write,execute access
 9 //place your code here
10 
11 originalcode:
12 // 1 級 判定
13 cmp ecx,5
14 jne exit
15 // 2 級 判定
16 cmp esi,257
17 jne exit
18 
19 push eax
20 mov eax,C34F //49999
21 cvtsi2sd xmm0,eax
22 movsd [ebx],xmm0
23 pop eax
24 jmp exit
25 
26 exit:
27 movsd xmm0,[ebx]
28 pop ebx
29 jmp returnhere
30 
31 "Crashlands.exe"+1E78A4B:
32 jmp newmem
33 returnhere:
34 
35 
36  
37  
38 [DISABLE]
39 //code from here till the end of the code will be used to disable the cheat
40 dealloc(newmem)
41 "Crashlands.exe"+1E78A4B:
42 movsd xmm0,[ebx]
43 pop ebx
44 //Alt: db F2 0F 10 03 5B
false item to 49999

  然后,對另外的數據進行監聽,然后修改好代碼:

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(tmp_data,8)
 5 registersymbol(tmp_data)
 6 label(returnhere)
 7 label(originalcode)
 8 label(exit)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 //修改
15 //cmp ebx,006FE0F0
16 //jne exit
17 // 1 級 判定 - error
18 //cmp ecx,7
19 //jne exit
20 // 1.5 級 判定
21 cmp edx,00000000
22 jne exit
23 // 2 級 判定
24 push edx
25 mov edx,[eax+10]
26 cmp edx,00000000
27 pop edx
28 jne exit
29 
30 // 預備
31 push edx
32 movsd xmm0,[esi] //movsd xmm0,[eax+10]
33 cvttsd2si edx,xmm0
34 mov [tmp_data],edx
35 pop edx
36 
37 cmp [tmp_data],DD // 221
38 jne exit
39 
40 //執行
41 push edx
42 mov edx,C34F //49999
43 cvtsi2sd xmm0,edx
44 pop edx
45 movsd [eax+10],xmm0
46 jmp exit
47 
48 
49 exit:
50 movups xmm0,[eax+10]
51 mov edi,[ebp+08]
52 jmp returnhere
53 
54 "Crashlands.exe"+1E7B425:
55 jmp newmem
56 nop 2
57 returnhere:
58 
59 
60  
61  
62 [DISABLE]
63 //code from here till the end of the code will be used to disable the cheat
64 dealloc(newmem)
65 dealloc(tmp_data)
66 unregistersymbol(tmp_data)
67 "Crashlands.exe"+1E7B425:
68 movups xmm0,[eax+10]
69 mov edi,[ebp+08]
70 //Alt: db 0F 10 40 10 8B 7D 08
true item to 49999

  接下來是血量,我們也是直接選擇改上限值和真實值,我們把數據改成 99999999 , 是的。

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 label(returnhere)
 5 label(originalcode)
 6 label(exit)
 7 
 8 newmem: //this is allocated memory, you have read,write,execute access
 9 //place your code here
10 
11 originalcode:
12 push ebx
13 mov ebx,5F5E0FF
14 cvtsi2sd xmm0,ebx
15 pop ebx
16 movsd [eax],xmm0
17 movsd xmm0,[eax]
18 movsd xmm1,[eax+08]
19 
20 exit:
21 jmp returnhere
22 
23 "Crashlands.exe"+D0884B:
24 jmp newmem
25 nop 4
26 returnhere:
27 
28 
29  
30  
31 [DISABLE]
32 //code from here till the end of the code will be used to disable the cheat
33 dealloc(newmem)
34 "Crashlands.exe"+D0884B:
35 movsd xmm0,[eax]
36 movsd xmm1,[eax+08]
37 //Alt: db F2 0F 10 00 F2 0F 10 48 08
unlimited blood - true value

  為了上述圖像的美觀,我又改了如下代碼:

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(reset_data_of_blood,8)
 5 registersymbol(reset_data_of_blood)
 6 label(returnhere)
 7 label(originalcode)
 8 label(exit)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 cmp edx,00000000
15 jne exit
16 //如果是第一次的數據
17 mov [reset_data_of_blood],eax
18 jmp exit
19 
20 exit:
21 cmp ecx,eax
22 je Crashlands.exe+1BDFF9B
23 jmp returnhere
24 
25 "Crashlands.exe"+1BDFF0B:
26 jmp newmem
27 nop 3
28 returnhere:
29 
30 
31  
32  
33 [DISABLE]
34 //code from here till the end of the code will be used to disable the cheat
35 dealloc(newmem)
36 dealloc(reset_data_of_blood)
37 unregistersymbol(reset_data_of_blood)
38 "Crashlands.exe"+1BDFF0B:
39 cmp ecx,eax
40 je Crashlands.exe+1BDFF9B
41 //Alt: db 39 C1 0F 84 88 00 00 00
find redata
 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 label(returnhere)
 5 label(originalcode)
 6 label(exit)
 7 
 8 newmem: //this is allocated memory, you have read,write,execute access
 9 //place your code here
10 
11 originalcode:
12 push edx
13 mov edx,[reset_data_of_blood]
14 push ebx
15 mov ebx,5F5E0FF
16 cvtsi2sd xmm0,ebx
17 pop ebx
18 movsd [edx],xmm0
19 pop edx
20 jmp exit
21 
22 exit:
23 mov eax,[esi+64]
24 mov ecx,Crashlands.exe+CFFFF
25 jmp returnhere
26 
27 "Crashlands.exe"+1BDFF9B:
28 jmp newmem
29 nop 3
30 returnhere:
31 
32 
33  
34  
35 [DISABLE]
36 //code from here till the end of the code will be used to disable the cheat
37 dealloc(newmem)
38 "Crashlands.exe"+1BDFF9B:
39 mov eax,[esi+64]
40 mov ecx,Crashlands.exe+CFFFF
41 //Alt: db 8B 46 64 B9 FF FF FF 00
make blood upper 99999999

測試效果

  綁定血量測試

  

  物品數量綁定測試

  

  以上測試僅針對下圖 版本 ,如果是此 版本 的用戶,可以私自聯系我,找到這一版本的修改器。(網絡空間實在有限,我就僅在個人磁盤中保存)

   


后續更新內容----------------------------------------------[ 2021-01-18 至 2021-01-20, 更新內容 ] 

  我看到有人 AT 我,是因為游戲貌似更新了哈!哈?我努力鑽研、並在2020年年底做完修改器,准備完結了,結果 2021 年 1 月就更新了。估計官方看我最近不寫修改器,指定給我安排呢!

  到 20 號這一天,我才做好 “無限物品” 和 “一擊必殺” 兩項,講道理啊,真的不好做!我遇見的修改器里面最難做的了。

研究版本

  

研究過程

  1、一擊必殺

  思路還是找到修改攻擊力的代碼,將它改成 “把攻擊力綁定在 99,999,999 ”。(先找到攻擊力地址,查看是什么訪問了這里,根據斷點找到上一級返回的地址,就知道是調用的那個 CALL 了,最后在那里記錄下地址,再把修改地址的地方改寫)

  (1)、搜索 Double 類型(雙浮點),找到對應下圖的地址(如果找到兩個,可以把一個改成 99,999,999 並綁定看看是不是會一擊必殺)【和之前一樣】

   

  (2)、右擊選擇 “是什么訪問了這個地址”,回去按 “Q” 看看是什么地址訪問的。如下圖:

  

  (3)、找到如下圖的匯編,點擊 “顯示反匯編程序”,之后 查找反匯編地址的窗口就可以了,保留我們點擊以后的窗口。找到的地址是 "Crashlands.exe+A70C" (物理地址:0066A70C),那么,我們可以設置一下地址書簽方便我們找到這個地址。

    

  (4)、分析 movsd [esi],xmm0 一句,這句匯編代碼的意思是 將 xmm0 的數據(Double類型)存到 esi 寄存器所顯示的地址當中去。

  (5)、我們如果在這里設置斷點,發現程序會一直檢測到斷點,而想要的斷點都不是我們需要的斷點。造成這種結果的原因可能是這是一段較為基礎的共用代碼,在其他的線程中經常會被調用。(看到地址只是+A70C 就知道大概率是靜態部分的代碼)

  (6)、采取的辦法依舊是在對應上方 movsd [esi],xmm0 一句處做匯編處理:(綠色的是源碼,橙色的是要寫上去的代碼)

    originalcode:
      cmp esi,1578AF70
      jne exit
      jmp exit

    exit:
      movsd [esi],xmm0
      pop esi
      jmp returnhere

  (7)、把代碼激活以后在 jmp exit 一句中設置斷點,之后打開堆棧跟蹤(視圖里最上面那個),如下圖:

  

  (8)、找到如下圖一樣的跳轉表。找到了下表,就可以把斷點取消,然后恢復游戲狀態。之后,取消上面的代碼的激活狀態。

  

  (9)、我們還是和上次一樣准備去尋找給 esi 賦值的對應 edx 為 0 的值。先跳轉到表上第二行的 “Crashlands.exe+3A7B3D7”地址,並設置書簽。

  (10)、根據上一次修改攻擊力的經驗,我們這一次要找到前面類似於 Crashlands.exe+A??? 的地址。各位,我覺得下圖的它就不錯。對,也只能是它——Crashlands.exe+3A7B38B

   

  (11)、在上面一處設置斷點,之后回去按 Q 進入頁面,再按 Q 退出,得到如下的規律。(edx 沒有再變,與其這樣說,還不如說是只有 eax 在從 023【十進制:35】變化)

   

  (12)、因為 eax 在調用 CALL 之前是我們觀察的關鍵,我們需要在前面知道 eax 0 的時候,對應執行的后面的代碼也對應着做修改。但是,在代碼執行的過程中間,eax 的值就會被丟棄,我們到后面無法得知原本 eax 的值。

  (13)、那怎么辦呢?我們需要在調用 CALL 之前的代碼中把 eax 的值保存下來,用於我們后面代碼的判斷。簡而言之,就是注冊新內存讓整體代碼都可以被調用。

   (14)、在 Crashlands.exe + 3A7B38B 處或者前面的“沒有修改 eax 值的”的代碼處做匯編,可以 AOB 也可以直接代碼注入。

 1 { Game   : Crashlands.exe
 2   Version: 
 3   Date   : 2021-01-18
 4   Author : dell
 5 
 6   This script does blah blah blah
 7 }
 8 
 9 [ENABLE]
10 //code from here to '[DISABLE]' will be used to enable the cheat
11 
12  
13  
14 aobscanmodule(FIND_DATA_TMP,Crashlands.exe,83 C4 04 8B 4E 08 50 E8 30) // should be unique
15 alloc(newmem,$1000)
16 alloc(reset_data_of_tmp,8)
17 registersymbol(reset_data_of_tmp)
18 label(code)
19 label(return)
20 
21 newmem:
22   add esp,04
23   mov ecx,[esi+08]
24   mov [reset_data_of_tmp],eax
25   jmp return
26 
27 code:
28   add esp,04
29   mov ecx,[esi+08]
30   jmp return
31 
32 FIND_DATA_TMP:
33   jmp newmem
34   nop
35 return:
36 registersymbol(FIND_DATA_TMP)
37 
38 [DISABLE]
39 //code from here till the end of the code will be used to disable the cheat
40 FIND_DATA_TMP:
41   db 83 C4 04 8B 4E 08
42 
43 unregistersymbol(FIND_DATA_TMP)
44 dealloc(newmem)
45 dealloc(reset_data_of_tmp)
46 unregistersymbol(reset_data_of_tmp)
47 {
48 // ORIGINAL CODE - INJECTION POINT: "Crashlands.exe"+3A7B384
49 
50 "Crashlands.exe"+3A7B361: 83 C4 08                 -  add esp,08
51 "Crashlands.exe"+3A7B364: 8B 4D 08                 -  mov ecx,[ebp+08]
52 "Crashlands.exe"+3A7B367: C7 46 3C 67 00 00 00     -  mov [esi+3C],00000067
53 "Crashlands.exe"+3A7B36E: 8B 01                    -  mov eax,[ecx]
54 "Crashlands.exe"+3A7B370: 68 DB 94 01 00           -  push 000194DB
55 "Crashlands.exe"+3A7B375: FF 50 08                 -  call dword ptr [eax+08]
56 "Crashlands.exe"+3A7B378: 89 46 04                 -  mov [esi+04],eax
57 "Crashlands.exe"+3A7B37B: 8D 46 70                 -  lea eax,[esi+70]
58 "Crashlands.exe"+3A7B37E: 50                       -  push eax
59 "Crashlands.exe"+3A7B37F: E8 4C FD 51 00           -  call Crashlands.exe+3F9B0D0
60 // ---------- INJECTING HERE ----------
61 "Crashlands.exe"+3A7B384: 83 C4 04                 -  add esp,04
62 "Crashlands.exe"+3A7B387: 8B 4E 08                 -  mov ecx,[esi+08]
63 // ---------- DONE INJECTING  ----------
64 "Crashlands.exe"+3A7B38A: 50                       -  push eax
65 "Crashlands.exe"+3A7B38B: E8 30 F2 58 FC           -  call Crashlands.exe+A5C0
66 "Crashlands.exe"+3A7B390: 89 46 0C                 -  mov [esi+0C],eax
67 "Crashlands.exe"+3A7B393: FF 75 08                 -  push [ebp+08]
68 "Crashlands.exe"+3A7B396: E8 55 E3 53 00           -  call Crashlands.exe+3FB96F0
69 "Crashlands.exe"+3A7B39B: 83 C4 04                 -  add esp,04
70 "Crashlands.exe"+3A7B39E: 8D 46 70                 -  lea eax,[esi+70]
71 "Crashlands.exe"+3A7B3A1: 50                       -  push eax
72 "Crashlands.exe"+3A7B3A2: E8 29 FD 51 00           -  call Crashlands.exe+3F9B0D0
73 "Crashlands.exe"+3A7B3A7: 83 C4 04                 -  add esp,04
74 }
find redata before

  (15)、這樣在激活這個代碼以后,就可以提供一個臨時數據 reset_data_of_tmp ,它幫我們記錄 eax 值的狀態。

  (16)、在上圖 call 的后面一句,設置斷點。發現 eax 的值是規律的 +10 變化的。其中這些地址都是我們玩家的一些屬性,只不過我們需要的只是攻擊力那一項而已。

   

  (17)、上述地址我們可以得到最基礎的那個地址,然后下面的所有屬性的地址都能夠找到

  

  (18)、我們在取消那個地方的斷點,恢復游戲運行,然后在那里進行匯編。(綠色是源碼,橙色是匯編碼)

    newmem:
      push edx
      mov edx,[reset_data_of_tmp]    // 前面匯編代碼已經保存了的 “eax” 的值
      cmp edx,00000000         // 如果 CALL前面 eax 值 是 0,我們需要將對應的 CALL 后面的 eax 值 記錄到 reset_data_of_base 中
      pop edx
      jne code
      mov [reset_data_of_base],eax
      jmp code

    code:
      mov [esi+0C],eax
      push [ebp+08]
      jmp return

  (19)、總體的匯編如下,也可以使用 AOB 注入,直接注入也可以,我就用 AOB 了。

 1 { Game   : Crashlands.exe
 2   Version: 
 3   Date   : 2021-01-18
 4   Author : dell
 5 
 6   This script does blah blah blah
 7 }
 8 
 9 [ENABLE]
10 //code from here to '[DISABLE]' will be used to enable the cheat
11 
12  
13  
14 aobscanmodule(FIND_REDATA,Crashlands.exe,89 46 0C FF 75 08 E8 55) // should be unique
15 alloc(newmem,$1000)
16 alloc(reset_data_of_base,8)
17 registersymbol(reset_data_of_base)
18 label(code)
19 label(return)
20 
21 newmem:
22   push edx
23   mov edx,[reset_data_of_tmp]
24   cmp edx,00000000
25   pop edx
26   jne code
27   mov [reset_data_of_base],eax
28   jmp code
29 
30 code:
31   mov [esi+0C],eax
32   push [ebp+08]
33   jmp return
34 
35 FIND_REDATA:
36   jmp newmem
37   nop
38 return:
39 registersymbol(FIND_REDATA)
40 dealloc(reset_data_of_base)
41 unregistersymbol(reset_data_of_base)
42 
43 [DISABLE]
44 //code from here till the end of the code will be used to disable the cheat
45 FIND_REDATA:
46   db 89 46 0C FF 75 08
47 
48 unregistersymbol(FIND_REDATA)
49 dealloc(newmem)
50 
51 {
52 // ORIGINAL CODE - INJECTION POINT: "Crashlands.exe"+3A7B390
53 
54 "Crashlands.exe"+3A7B370: 68 DB 94 01 00           -  push 000194DB
55 "Crashlands.exe"+3A7B375: FF 50 08                 -  call dword ptr [eax+08]
56 "Crashlands.exe"+3A7B378: 89 46 04                 -  mov [esi+04],eax
57 "Crashlands.exe"+3A7B37B: 8D 46 70                 -  lea eax,[esi+70]
58 "Crashlands.exe"+3A7B37E: 50                       -  push eax
59 "Crashlands.exe"+3A7B37F: E8 4C FD 51 00           -  call Crashlands.exe+3F9B0D0
60 "Crashlands.exe"+3A7B384: 83 C4 04                 -  add esp,04
61 "Crashlands.exe"+3A7B387: 8B 4E 08                 -  mov ecx,[esi+08]
62 "Crashlands.exe"+3A7B38A: 50                       -  push eax
63 "Crashlands.exe"+3A7B38B: E8 30 F2 58 FC           -  call Crashlands.exe+A5C0
64 // ---------- INJECTING HERE ----------
65 "Crashlands.exe"+3A7B390: 89 46 0C                 -  mov [esi+0C],eax
66 "Crashlands.exe"+3A7B393: FF 75 08                 -  push [ebp+08]
67 // ---------- DONE INJECTING  ----------
68 "Crashlands.exe"+3A7B396: E8 55 E3 53 00           -  call Crashlands.exe+3FB96F0
69 "Crashlands.exe"+3A7B39B: 83 C4 04                 -  add esp,04
70 "Crashlands.exe"+3A7B39E: 8D 46 70                 -  lea eax,[esi+70]
71 "Crashlands.exe"+3A7B3A1: 50                       -  push eax
72 "Crashlands.exe"+3A7B3A2: E8 29 FD 51 00           -  call Crashlands.exe+3F9B0D0
73 "Crashlands.exe"+3A7B3A7: 83 C4 04                 -  add esp,04
74 "Crashlands.exe"+3A7B3AA: 50                       -  push eax
75 "Crashlands.exe"+3A7B3AB: FF 76 04                 -  push [esi+04]
76 "Crashlands.exe"+3A7B3AE: E8 5D E8 51 00           -  call Crashlands.exe+3F99C10
77 "Crashlands.exe"+3A7B3B3: 83 C4 08                 -  add esp,08
78 }
find redata

  (20)、上面得到的 reset_data_of_base 是基礎地址,[reset_data_of_base + 40 ] 才是 攻擊力!reset_data_of_base + 40 是 攻擊力的地址。

  (21)、現在我們激活上面的代碼,再回到一開始修改地址的地方—— Crashlands.exe+A70C ! 才怪!是代碼為 call Crashlands.exe+A70C 的地方——Crashlands.exe+3A7B3D2

  (22)、在這里匯編,如果被修改的地址(esi)是攻擊力的地址 ( reset_data_of_base + 40 ),那么我們就改 esi 里的值變成 99,999,999 

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 label(returnhere)
 5 label(originalcode)
 6 label(exit)
 7 
 8 newmem: //this is allocated memory, you have read,write,execute access
 9 //place your code here
10 
11 originalcode:
12 call Crashlands.exe+A480
13 push edx
14 mov edx,[reset_data_of_base]
15 add edx,40
16 push ebx
17 mov ebx,F423F
18 cvtsi2sd xmm0,ebx
19 movsd [edx],xmm0
20 
21 exit:
22 pop edx
23 jmp returnhere
24 
25 "Crashlands.exe"+3A7B3D2:
26 jmp newmem
27 returnhere:
28 
29 
30  
31  
32 [DISABLE]
33 //code from here till the end of the code will be used to disable the cheat
34 dealloc(newmem)
35 "Crashlands.exe"+3A7B3D2:
36 call Crashlands.exe+A480
37 //Alt: db E8 A9 F0 58 FC
make attack 99999999

  (23)、代碼解析:(綠色是源碼,橙色是匯編碼)

    originalcode:
      call Crashlands.exe+A480
      push edx
      mov edx,[reset_data_of_base]  //找到 基礎地址
      add edx,40           // + 40 變成 攻擊力的地址
      push ebx
      mov ebx,F423F          // ebx = F423F         // 99,999,999
      cvtsi2sd xmm0,ebx         // xmm0 = (double) ebx
      movsd [edx],xmm0

    exit:
      pop edx
      jmp returnhere

  2、無限物品

  (1)、先搜索到物品的兩個地址,以木材為例。(搜索雙浮點 Double)

  

  (2)、我們把在工作台那里顯示的數據稱為 True 地址,把另外一個在 “建造模式” 下顯示的數據稱為 False 地址

  (3)、那么我們如何給它們兩個做好標記呢?很簡單,只修改一個地址,之后回去打開工作台看看木材數量有沒有變化。如果變化了,那就是 True 地址。

  (4)、對 True 地址的 “是什么操作碼訪問了該地址” 以后是這樣的結果:(藍色代碼處記錄書簽A)—— Crashlands.exe+3FD9F55

  

  (5)、對 False 地址的 “是什么操作碼訪問了該地址” 以后是這樣的結果:(藍色代碼處記錄書簽B)—— Crashlands.exe+3FD7D04

  

  (6)、現在我們有一點是十分確定的,這兩部分代碼都是共用代碼!這就需要分別用我之前用的“特別值法”試出來堆棧排布。

  (7)、我們先看看 True 地址的 試探!

  

  (8)、上面有幾點:(需要長時間的一個一個比較觀察)

    a. [esi] 的值永遠是 Double 類型的 224

    b.  edx 的值永遠是 00000000

    c. [eax+10]的值應該是 Double 類型的整數

  (9)、所以,我們要把不滿足上述關系的地址排除掉!滿足的就修改到 49999

  (10)、!!!上!!!匯!!!編!!!

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 label(returnhere)
 5 label(originalcode)
 6 label(exit)
 7 
 8 newmem: //this is allocated memory, you have read,write,execute access
 9 //place your code here
10 
11 originalcode:
12 // 1 級 判定
13 cmp edx,00000000
14 jne exit
15 
16 // 2 級 判定 --- 此判定會刪除采集類物資
17 //cmp ecx,00000007
18 //jne exit
19 
20 // 3 級 判定
21 push edx
22 mov edx,[eax+10]
23 cmp edx,00000000
24 pop edx
25 jne exit
26 
27 // 預備
28 push edx
29 movsd xmm0,[esi] // movsd xmm0,[eax+10]
30 cvttsd2si edx,xmm0
31 // 4 pan
32 cmp edx,E0 // 224
33 pop edx
34 jne exit
35 
36 //執行
37 push edx
38 mov edx,C34F //49999
39 cvtsi2sd xmm0,edx
40 pop edx
41 movsd [eax+10],xmm0
42 jmp exit
43 
44 exit:
45 movups xmm0,[eax+10]
46 mov esi,[ebp+08]
47 jmp returnhere
48 
49 "Crashlands.exe"+3FD9F55:
50 jmp newmem
51 nop 2
52 returnhere:
53 
54 
55  
56  
57 [DISABLE]
58 //code from here till the end of the code will be used to disable the cheat
59 dealloc(newmem)
60 "Crashlands.exe"+3FD9F55:
61 movups xmm0,[eax+10]
62 mov esi,[ebp+08]
63 //Alt: db 0F 10 40 10 8B 75 08
true item to 49999

  (11)、True 地址就可以被修改了,(起碼在工作台那里)有過的資源就可以當無限使用。

  (12)、False 地址就比較特殊。它這里調用的是一個多類型的共用代碼——我無法根據找到的特殊寄存器值進行比較,篩選出合適的地址。(結果不完美)

  (13)、所以,我們要回溯!我們繼續找堆棧關系,如下圖:

  

   (14)、每一次修改會被執行兩次,分別對應 Crashlands.exe+9FF563 Crashlands.exe+9FF74E,這兩個都是 Crashlands.exe+3FBC100CALL 返回后的地址。

  (15)、所以我們要讓它每一次修改的時候執行的必須是我們通過 Crashlands.exe+9FF563 、Crashlands.exe+9FF74E 地址調過去的才可以被修改。所以,我們在最后一個 CALL 的左右兩次進行數據設置,先設為1,再設為 0 。當我們進行地址訪問時,如果這個數是 1,我們做修改;否則不改。

  (16)、如下方代碼,給定 bit_tag 全局變量。讓它去左右是否改為 49999

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(bit_tag,8)
 5 registersymbol(bit_tag)
 6 label(returnhere)
 7 label(originalcode)
 8 label(exit)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 mov [bit_tag],00000001
15 call Crashlands.exe+3FBC100
16 mov [bit_tag],00000000
17 
18 exit:
19 jmp returnhere
20 
21 "Crashlands.exe"+9FF749:
22 jmp newmem
23 returnhere:
24 
25 
26  
27  
28 [DISABLE]
29 //code from here till the end of the code will be used to disable the cheat
30 dealloc(newmem)
31 dealloc(bit_tag)
32 unregistersymbol(bit_tag)
33 "Crashlands.exe"+9FF749:
34 call Crashlands.exe+3FBC100
35 //Alt: db E8 B2 C9 5B 03
bit_tag = 1 ; CALL ; bit_tag = 0 ;

  (17)、確定了當 [bit_tag]1 的時候修改,我們就把數據改為 49999

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 label(returnhere)
 5 label(originalcode)
 6 label(exit)
 7 
 8 newmem: //this is allocated memory, you have read,write,execute access
 9 //place your code here
10 
11 originalcode:
12 cmp [bit_tag],00000001
13 jne exit
14 //執行
15 push edx
16 mov edx,C34F //49999
17 cvtsi2sd xmm0,edx
18 pop edx
19 movsd [edi],xmm0
20 jmp exit
21 
22 exit:
23 movsd xmm0,[edi]
24 pop edi
25 jmp returnhere
26 
27 "Crashlands.exe"+3FD7D04:
28 jmp newmem
29 returnhere:
30 
31 
32  
33  
34 [DISABLE]
35 //code from here till the end of the code will be used to disable the cheat
36 dealloc(newmem)
37 "Crashlands.exe"+3FD7D04:
38 movsd xmm0,[edi]
39 pop edi
40 //Alt: db F2 0F 10 07 5F
false item to 49999

  (18)、代碼激活的順序,注意有需要到全局變量的,一定要讓帶有它的內存申請部分代碼的代碼項先激活。如下圖,只有父項先激活,才可以激活它的子項。(只有先取消激活它的子項,才能取消激活它的父項)

  

  3、綁定血量(99,999,999)

  給大家看看效果:

  

  嗯,更新已經是 2021-01-25 ,思路如下:

  (1)、找到訪問數據的地址或者修改數據的地址(親測修改數據的地址可行,其余的代碼量和訪問量過大) 。找到地址是 Crashlands.exe + A70C !

  (2)、按照 “慣例”,我們使用特殊值法找到地址跳轉的三級。

  

  Crashlands.exe+52FE31  有用,記錄

  Crashlands.exe+3A52D2E     有用,同上

  Crashlands.exe+3F9A90C  真沒用

  (3)、記錄好斷點回歸的三個地址以后,我們在一開始處設置斷點,觀察結果:

  

  (4)、我們需要的是這里的 ecx 值,判斷它是我們需要的結果我們就修改它。

  (5)、如果只是判斷它不是 1 就更改的話,結果就是我們的血量綁定到 99,999,999了,而怪物的血量同樣的被綁定了。

  (6)、這個時候,我們需要判斷——什么時候這個地址修改的不是自己的血量值,而是怪物的。我們看到怪物血量所對應的堆棧跟蹤是如下圖這樣的:

  

  (7)、這樣我們可以確定了—— 通過 Crashlands.exe+3A52D2E 之前的地址 訪問 Crashlands.exe+52FE31 之前的地址 的是修改自己的血量,而通過 Crashlands.exe+23F1791 之前的地址 訪問 Crashlands.exe+52FE31 之前的地址 的則不是。

  (8)、那么我們就故技重施!在 Crashlands.exe+3A52D2E 前后聲明全局變量,先賦值 1,再賦值 0 。判定為 1 時修改,否則不改。

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(seq_before,8)
 5 registersymbol(seq_before)
 6 label(returnhere)
 7 label(originalcode)
 8 label(exit)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 mov [seq_before],00000001
15 call Crashlands.exe+52E330
16 mov [seq_before],00000000
17 
18 exit:
19 jmp returnhere
20 
21 "Crashlands.exe"+3A52D29:
22 jmp newmem
23 returnhere:
24 
25 
26  
27  
28 [DISABLE]
29 //code from here till the end of the code will be used to disable the cheat
30 dealloc(newmem)
31 dealloc(seq_before)
32 unregistersymbol(seq_before)
33 "Crashlands.exe"+3A52D29:
34 call Crashlands.exe+52E330
35 //Alt: db E8 02 B6 AD FC
seq_before

  (9)、之后就是確定修改的代碼了,如下:

 1 [ENABLE]
 2 //code from here to '[DISABLE]' will be used to enable the cheat
 3 alloc(newmem,2048)
 4 alloc(seq_blood,8)
 5 //registersymbol(seq_blood)
 6 label(returnhere)
 7 label(originalcode)
 8 label(exit)
 9 
10 newmem: //this is allocated memory, you have read,write,execute access
11 //place your code here
12 
13 originalcode:
14 cmp [seq_before],00000001
15 jne exit
16 push edx
17 movsd xmm0,[ecx]
18 cvttsd2si edx,xmm0
19 cmp edx,00000001      // 1
20 pop edx
21 je exit
22 mov [seq_blood],ecx
23 call Crashlands.exe+A480
24 push edx
25 mov edx,5F5E0FF
26 cvtsi2sd xmm0,edx
27 mov edx,[seq_blood]
28 movsd [edx],xmm0
29 pop edx
30 jmp returnhere
31 
32 exit:
33 call Crashlands.exe+A480
34 jmp returnhere
35 
36 "Crashlands.exe"+52FE2C:
37 jmp newmem
38 returnhere:
39 
40 
41  
42  
43 [DISABLE]
44 //code from here till the end of the code will be used to disable the cheat
45 dealloc(newmem)
46 dealloc(seq_blood)
47 //unregistersymbol(seq_blood)
48 "Crashlands.exe"+52FE2C:
49 call Crashlands.exe+A480
50 //Alt: db E8 4F A6 AD FF
< 50 ? go : mov it

  (10)、那么,我們留一個疑問?我們根據《Nine Parchments》的修改經驗,用這段代碼改成 “是我的血就無限着呆着,是怪物的血就清零”,是不是就可以做成另一類的 “一擊必殺” 了呢?我在這里先給出我自己的看法(因為我沒嘗試,所以說看法):嗯~這段代碼好像不止用來修改人的血量,如果要嘗試,也試着從 Crashlands.exe+23F1791 上故技重施!還有不排除外在 己方 NPC 的問題,還有怪物血量訪問的問題。

  4、Buff 時間固定 (我設置到 90 秒固定)

  先看看效果:

  

  思路很簡單 Buff 值實際上就是雙浮點數值,根據以往修改這個游戲的經驗,我們直接改就可以了。

  下圖估計是我能找到的最全的 Buff 了。

  

   5、技能時間無冷卻

  其實技能時間是 1 個雙浮點數值,根據以往在修改這個游戲的經驗我們只需要將這個數值改成 0 就可以了。

  恐怖神明 道具的無冷卻展示:

  

  弗恩圓球 道具的無冷卻展示:

  


后續更新內容----------------------------------------------[ 2021-10-10 至 以后, 更新內容 ] 

  2021-10-10 修復了無限物品里的 false 值的未被修改的 Bug 以及 無限 Buff 時長 引起游戲崩潰的 Bug ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM