實現(xiàn)詞綴的自定義
它是按大神573650245分享的腳本上調(diào)整而來,大家記住,最核心的部分是573650245大佬完成且無償無私分享出來,文章的開關(guān)應(yīng)該向之致敬。這是極破壞游戲的修改,但也極有借鑒學(xué)習(xí)意義,無論是為了拯救動不動就脆求詞綴存檔者,還是為了讓某些野心家少賺點不當(dāng)收入,還是分享吧。
下圖是整個腳本的構(gòu)造:

實現(xiàn)的功能是:
將無詞綴裝備扔到地面上,會增加自定義詞綴,并自動完成鑒定(可選)
腳本因使用全局定義,所以大家按順序復(fù)制并依次建立相應(yīng)的腳本吧,不然可能出錯。
1, 定義全局變量, 多腳本調(diào)用此變量,所以這個腳本必須放最前面, "置頂"使用.
[ENABLE]
globalalloc(CT1,256)
// 存儲自定義數(shù)據(jù)
//? +0 byte?為詞綴孔洞順序, +1 byte 為調(diào)整的技能等級或上下限的孔洞序號
//??+4 為啟用詞綴修改? ?
//??+10 起存儲修改的詞綴原數(shù)據(jù),為還原之用,否則因詞綴被破壞,游戲無法再打出正常詞綴
[DISABLE]
2, 給地面物品附加詞綴時,調(diào)整其裝備等級,否則可能生成詞綴數(shù)量不足5洞
如果要給不能生成5洞的部件附加5洞,應(yīng)該還要調(diào)整裝備類型改為戒指或手鐲等等
這一點,也是本注入地址的函數(shù)之中,請自行下斷分析后調(diào)整.
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
mov eax,[eax+74]
originalcode:
cmp [CT1+4],1? ? ? ?
jne exit? ? ? ? ? ? ? ? ? ? ? ? ? ? ??//不是扔背包裝備時,不予以調(diào)整等級,使用原數(shù)值
mov eax,7
exit:
mov [ebp-1C],eax
jmp returnhere
"gamesvr.exe"+60C4E:
jmp newmem
nop
returnhere:?
[DISABLE]
dealloc(newmem)
"gamesvr.exe"+60C4E:
mov eax,[eax+74]
mov [ebp-1C],eax
//Alt: db 8B 40 74 89 45 E4
3, 丟棄裝備時,給它附加詞綴;? ?
代碼注入點是判斷有無詞綴之處,如果想附加全部裝備,需要更改注入在跳轉(zhuǎn)之后的語句處。
注意,不要隨便更改注入地址,有詞綴的裝備需要先清除原詞綴數(shù)據(jù),否則保存游戲重登錄時可能會引起詞綴錯亂。
[ENABLE]
alloc(newmem,2048)
label(returnhere)
newmem:
jne returnhere
mov [CT1],0? ? ? ? ? ? ? ?// 每次必清計數(shù)器,這樣就能保證從第1洞開始修改
mov [CT1+4],1? ? ? ? ? //? 啟用詞綴修改標(biāo)志, 修改的調(diào)整才不影響到殺怪爆的詞綴
lea ecx,[ebp-000000AC]? ? ? ?// 地面物品數(shù)據(jù)地址
push 5? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 參數(shù)2? 生成詞綴的總孔洞數(shù)量
push ecx? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 參數(shù)1? ?地面物品 不能是背包物品,因為數(shù)據(jù)長度不一樣
call gamesvr.exe+60B90
xor ecx,ecx
mov eax,CT1
mov [eax+4],ecx? ? ? ? ? ? ? ? ? ? // 關(guān)閉詞綴修改標(biāo)志? ? ? ??
_loop:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 以下是還原記錄到的詞綴數(shù)據(jù),如果有記錄的話
inc ecx
cmp ecx,6
jnl _end_loop? ? ? ? ? ? ? ? ? ? ? // 最多有6條記錄
lea eax,[eax+10]
mov edx,[eax]? ? ? ? ? ? ? ? ? ? ?// 讀出原詞綴的地址
test edx,edx
je _loop? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //? 無記錄
push ecx? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 臨時征用ecx寄存器來中轉(zhuǎn)數(shù)據(jù)
mov ecx,[eax+4]? ? ? ? ? ? ? ? ? ? ? ?
mov [edx],ecx? ? ? ? ? ? ? ? ? ? ? // 還原詞綴編號
mov ecx,[eax+8]
mov [edx+C],ecx? ? ? ? ? ? ? ? ?//? 還原詞綴技能數(shù)據(jù)
mov [eax],0? ? ? ? ? ? ? ? ? ? ? ? //? 清0,以示已處理
pop ecx? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 還原計數(shù)器的循環(huán)次數(shù)
jmp _loop
_end_loop:
jmp gamesvr.exe+983AB
"gamesvr.exe"+9830F:
jmp newmem
nop
returnhere:?
[DISABLE]
dealloc(newmem)
"gamesvr.exe"+9830F:
je gamesvr.exe+983AB
//Alt: db 0F 84 96 00 00 00
4, 自定義詞綴的類型,并記錄原數(shù)據(jù)
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
cmp [CT1+4],1? ? ? ?
jne originalcode? ? ? ? ? ? ? ? // 非丟棄裝備時,不啟用詞綴調(diào)整
inc byte ptr [CT1]? ? ? ? ? ? ?// 詞綴孔洞序號 +1,?每次都是從第1洞開始處理
//記錄詞綴原始數(shù)據(jù)
movzx edx,byte ptr [CT1]
imul edx,10
lea ecx,[CT1+edx]
mov eax,[edi+1C]
mov [ecx],eax
mov edx,[eax]
mov [ecx+4],edx
mov edx,[eax+C]
mov [ecx+8],edx
movzx edx,byte ptr [CT1]? ? ?? ??
//讀出孔洞序號后,比較.? ?判斷的默認(rèn)值是第1洞,即不是2~5,其它數(shù)字全則看作是1
cmp dl,2
je JN2
cmp dl,3
je JN3
cmp dl,4
je JN4
cmp dl,5
je JN5
mov [eax],09? ? ?//詞綴1的編號,? 09 為烈火
// 注大佬群中,也有群友整理出全部詞綴編號等數(shù)據(jù),請加群獲取.
mov [eax+C],000F0001? ? ? ? ?//烈火技能的詞綴數(shù)據(jù),須跟09編號配套使用
jmp originalcode
JN2:
mov [eax],12? ? ?//詞綴2的編號
mov [eax+C],001A0001
jmp originalcode
JN3:
mov [eax],13? ? ?//詞綴3的編號
mov [eax+C],001B0001
jmp originalcode
JN4:
mov [eax],2B? ? ?//詞綴4的編號
mov [eax+C],00311000
jmp originalcode
JN5:
mov [eax],2C? ? //詞綴5的編號
mov [eax+C],00321000
originalcode:? ?//游戲原代碼
mov eax,[edi+1C]
mov eax,[eax]
exit:
jmp returnhere
"gamesvr.exe"+102CD:
jmp newmem
returnhere:
[DISABLE]
dealloc(newmem)
"gamesvr.exe"+102CD:
mov eax,[edi+1C]
mov eax,[eax]
//Alt: db 8B 47 1C 8B 00
5,? 調(diào)整范圍類詞綴的上下限
// 與大佬直接修改上下限數(shù)值不同,這里是直接調(diào)整后續(xù)調(diào)用函數(shù)的參數(shù)值
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
// ebx == 最小值 + 最大值? ? 00 XX 00 YY?
// FF FF == 最大值 65535
cmp [CT1+4],1? ? ? ? ? ? ? // 非丟棄裝備時,不啟用調(diào)整
jne originalcode
inc byte ptr[CT1+1]? ? ? ? ? ? ?// 孔洞計數(shù)器
cmp byte ptr [CT1+1],1
je _lv1
cmp byte ptr [CT1+1],2
je _lv2
cmp byte ptr [CT1+1],3
je _lv3
cmp byte ptr [CT1+1],4
je _lv4
// 這里是默認(rèn)的第5孔洞的數(shù)據(jù)
mov ebx, 00020008
jmp originalcode
_lv1:
mov ebx, 000A000B
jmp originalcode
_lv2:
mov ebx, 000B000C
jmp originalcode
_lv3:
mov ebx, 000C000D
jmp originalcode
_lv4:
mov ebx, 00030007
jmp originalcode
originalcode:
movzx eax,word ptr [ecx+0E]
mov ecx,[ebp-04]
exit:
jmp returnhere
"gamesvr.exe"+10376:
jmp newmem
nop 2
returnhere:?
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"gamesvr.exe"+10376:
movzx eax,word ptr [ecx+0E]
mov ecx,[ebp-04]
//Alt: db 0F B7 41 0E 8B 4D FC
6, 設(shè)置加成是非范圍的詞綴的增益值(幸運(yùn),技能等級,掉落等等)
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(exit)
newmem:
cmp [CT1+4],1? ? ? ??? // 非丟棄裝備時,不啟用調(diào)整
jne exit
inc byte ptr[CT1+1]? ? ? ? ? ? ? // 孔洞計數(shù)器
cmp byte ptr [CT1+1],1
je _lv1
cmp byte ptr [CT1+1],2
je _lv2
cmp byte ptr [CT1+1],3
je _lv3
cmp byte ptr [CT1+1],4
je _lv4
// 默認(rèn)孔洞也是第5孔
mov edx,5
jmp returnhere
_lv1:
mov edx,4
jmp returnhere
_lv2:
mov edx,2
jmp returnhere
_lv3:
mov edx,1
jmp returnhere
_lv4:
mov edx,4
jmp returnhere
exit:
inc ecx
idiv ecx
add edx,esi
jmp returnhere
"gamesvr.exe"+103D2:
jmp newmem
returnhere:?
[DISABLE]
dealloc(newmem)
"gamesvr.exe"+103D2:
inc ecx
idiv ecx
add edx,esi
//Alt: db 41 F7 F9 03 D6
7,? 撿起地面物品時,自動完成鑒定.
有缺陷,詞綴名稱不顯示,所以只適合用來調(diào)試.
這里演示了如何自定義一個功能函數(shù).
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
call gamesvr.exe+402F0? ?// 游戲原代碼, 撿物品向C端發(fā)回物品數(shù)據(jù)
push edi? ? ? ? ? ?// 背包物品地址, 注意不是地面物品地址
mov ecx,esi? ? ?// 人物地址
call JD_cizui? ? // 實現(xiàn)全鑒定的自定義自定義函數(shù)
originalcode:
exit:
jmp returnhere
JD_cizui:? ??
?//注意看自定義函數(shù)代碼的放置位置
// 放在注入的自定義代碼的后面,且在游戲注入地址的前面
// +8 參數(shù)1 == 背包物品地址
push ebp
mov ebp,esp
sub esp,20
push ebx
push esi
push edi
mov edi,[ebp+8]
mov [ebp-4],ecx
mov dl,[edi+56]
and dl,01
je _get_item_type
mov edx,[edi+4C]
mov ecx,[gamesvr.exe+1CEA1C]
call gamesvr.exe+D4240? ? ? ? ? ? ? ?// 解密讀取詞綴存儲的編號
mov esi,eax
movzx edx,byte ptr [edi+24]
movzx ecx,byte ptr [gamesvr.exe+1CEA13]
call gamesvr.exe+D4240? ? ? ? ? ? ?// 解密讀取物品的類型
jmp _is_eqt_not
_get_item_type:
movzx eax, byte ptr[edi+24]
mov esi,[edi+4C]
mov ecx,eax
_is_eqt_not:
call gamesvr.exe+6A8C0? ?// 是否是裝備
test al,al
je __end__JD_cizui? ? ? ? ? // 非裝備,跳
movzx eax,si
test eax,eax
je __end__JD_cizui? ? ? ?// 無詞綴,跳
xor esi,esi
inc esi
//取出詞綴序號后
push eax? ? ?//序號
mov ecx,[ebp-4]? // chr
call gamesvr.exe+8DEB0 //取出詞綴數(shù)據(jù)
mov [ebp-14],eax
test eax,eax
je __end__JD_cizui
//核心函數(shù)
push 6? ?//設(shè)置已鑒定的詞綴數(shù)目,最多是6洞
push 15? ? // 固定數(shù)值
mov ecx,[ebp-14] // 詞綴 ptr
call gamesvr.exe+104A0 // 設(shè)置鑒定狀態(tài)
push [ebp-14]
mov ecx,[ebp-4]? ? ?// 人物地址
call gamesvr.exe+8DEF0 // 讓C端同步詞綴鑒定狀態(tài)
//函數(shù)尾
__end__JD_cizui:
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret 4
gamesvr.exe+91470:
jmp newmem
returnhere:
[DISABLE]
dealloc(newmem)
gamesvr.exe+91470:
call gamesvr.exe+402F0
再次感謝573650245的分享!也祝愿所有愛學(xué)習(xí)單機(jī)修改的朋友,學(xué)有所成!
記得到希望BM上分享你們的學(xué)習(xí)成果,傳播BM火種!