最后由 Tabing010102 更新于 2023年8月1日
之前只改一个字节的程序需要FVPLoader才能运行,在更早的时间我曾尝试按照原版fix(日文版免转区程序)和原版的对比来修改程序,但是最后退出程序在保存完系统存档后程序崩溃。由于我不会动态跟踪调试,这个就这么搁置了,直到8月31日晚得到了贴吧大佬的修复,才算知道了一部分原因。
注:Steam本体已经更新为HD版(商店链接),EH暂时只有英文版
首先感谢贴吧大佬pptp1,以及热心的群友们。
总体来说,程序的基本修改只需要修改两个lstrcmpiA
(IDA32中显示的函数名,下同)函数为我们自己创建的一个对于CompareStringA
函数的封装(这部分是从原来大佬搞的程序里直接拿出来的)。
使用IDA32位打开程序,首先定位到.text
和.idata
交界处,有一小段00
数据,这里留的空间完全足够我们写入这个函数和CompareStringA
这个字符串。然后在上一个函数空几个00
后使用KeyPatch写入此函数,或者直接写入二进制后再用KeyPatch修改offset,下面贴出代码:
push ebp
mov ebp, esp
push ebx
push esi
push offset aKernel32Dll ; "KERNEL32.dll"
call ds:GetModuleHandleA
push offset aComparestringa ; lpProcName
push eax ; hModule
call ds:GetProcAddress
push 0FFFFFFFFh
push [ebp+arg_4]
push 0FFFFFFFFh
push [ebp+arg_0]
push 1
push 411h
call eax
add eax, 0FFFFFFFEh
pop esi
pop ebx
pop ebp
retn 8
二进制,直接复制二进制到后面大概率需要修改引用名称的offset:
558BEC53566890DC4700FF1534D1450068A0C5450050FF152CD145006AFFFF750C6AFFFF75086A016811040000FFD083C0FE5E5B5DC20800
若IDA没有把这段识别为函数,就手动Add Function。
至于用到的CompareStringA
,我之前效仿原版放在了.data
后来甚至改到了.idata
不过故障依旧(虽然可能是之前放的没有删干净),不过贴吧大佬最后放在.text
紧跟着这个新加的函数后面没有出现问题,也就这样写好了(其实是啥也不会)。
然后搜索lstrcmpiA
,把对应的两个位置换为call sub_XXXXXX
(sub_XXXXXX
为新建的函数名),之后保存修改就可以了。
对比图:
贴吧大佬的回复:
Views: 187
谢了,正好想把HD版的汉化移植了