星空的记忆HD汉化移植-程序

之前只改一个字节的程序需要FVPLoader才能运行,在更早的时间我曾尝试按照原版fix(日文版免转区程序)和原版的对比来修改程序,但是最后退出程序在保存完系统存档后程序崩溃。由于我不会动态跟踪调试,这个就这么搁置了,直到8月31日晚得到了贴吧大佬的修复,才算知道了一部分原因。

首先感谢贴吧大佬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_XXXXXXsub_XXXXXX为新建的函数名),之后保存修改就可以了。

对比图:

贴吧大佬的回复:

点击数:6

发布者:Tabing010102

???

加入对话

1条评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据