galgame吧 关注:1,805,598贴子:26,900,025

回复:【教程向】浅谈汉化入门基本思路与实操

只看楼主收藏回复

支持


IP属地:重庆来自Android客户端62楼2025-05-10 20:27
回复
    nb,太硬核了


    IP属地:浙江来自Android客户端63楼2025-05-10 20:59
    回复
      2025-12-30 20:38:04
      广告
      不感兴趣
      开通SVIP免广告
      大佬太强了


      IP属地:上海来自Android客户端64楼2025-05-10 21:08
      回复
        是大佬的说,只可惜咱这边没学过计算机,相关不太懂啦,不过一定会帮到有需要的人的,感谢大佬的付出,帮顶一下(♡>𖥦<)/♥


        IP属地:湖北来自Android客户端65楼2025-05-10 21:13
        收起回复
          说实话,这种教程没啥用。有简易解包工具的,自然就会搞;没有工具的,说啥也没用。


          IP属地:上海66楼2025-05-10 21:18
          收起回复
            神帖,收藏


            IP属地:广东来自Android客户端67楼2025-05-10 21:21
            回复


              IP属地:广东来自Android客户端69楼2025-05-10 23:22
              回复
                ## L15
                在我们调试者(cracker)的眼中,当前运行的进程是这样的一个结构:

                程序运行的流程就形如:start.exe运行一会(跳转到)→ api2处的函数 → api5处的函数 → 返回api2 → 返回start.exe运行一会 → 跳转到...不知道这样说你能否理解了?
                点击Symbol标签,你就可以清晰的(*有时候不一定)看到整个进程的所有资源结构:


                这是当前打开进程中使用的所有模块和它们的API。比如前面的图【L11-2】绿色圈出的ZwInformationThread:你就可以在打开的Symbol中搜索到这个API,也是按enter可以跳过去,这里就不演示了:

                在搜索到的api上右键有一个toggle bp(切换断点),什么是断点我就不讲了,切换的含义就是把打开的断点变成关闭的,关闭的变成打开的。

                先在回到CPU标签,你右键>search for>current moudle> constant >可以查找你当前打开页面的常量(这里的常量值汇编中的“立即数”)
                current moudle是模块中的所有内存段
                current rigion是在左下角打开的的内存区段这两个的区别,这个不太好解释(*涉及到进程的内存映像),其实就是一个程序分为.data,.text等段,rigion查找的是当前打开的段(就是左下角)内存显示的那些(memory map标签中切换打开的内存段),反汇编编译的是.text段的,搜module就是在.data+.text+idata+...全部的段里搜,搜的结果会更多一点。
                反正你用current moudle就对了。
                注:API是一个广义的名词,在当前上下文我们特指可以调用的“函数”。
                为什么不用中文?我已经被条 角到对计算机相关的名词更敏感了,比如看到return,ref,stack,run,dump,memory,push,query,etc.脑子里有个一些专门的“通路”可以“秒解”,学计算机的懂得都懂,所以反应更快,更容易捕捉到信息,不是自己英文多好,而是真的这样看更舒服,不知道点哪里你只能自己翻译一下了,见谅。
                前面提到的*有时候不一定是指:有些程序会【加壳】,所谓的壳就是一些保护进程不被调试的另外的程序。你理解为会让你看到的汇编代码变得乱七八糟无法难以跟踪难以理解就一种东西就对了。
                当你在symbols里面看不到什么东西import的时候,你就要意识到知道程序加壳了,这边推荐你别焊了直接跑路呢,遇到困难直接放弃,这需要真正有逆向经验的人来脱壳,你现在弄和大学生军训完直接上战场开战斗机没有区别,让逆向大佬来搞就好(当然也有简单的壳)。


                IP属地:吉林70楼2025-05-10 23:45
                回复
                  2025-12-30 20:32:04
                  广告
                  不感兴趣
                  开通SVIP免广告
                  ## L16
                  前面我说的有些东西你可能不太理解,比如什么虚拟内存,.data段什么,后面还会有一个知识点就是栈的结构,栈帧什么的概念,学计算机看到这些词的肯定都能懂,你可以在:

                  里看到这些必要的知识:
                  (虚拟内存映像)

                  (调用栈结构)

                  学计算机的没事倒是可以看一看这本书,不是这个专业的就别看了,我给你一些关键词,你用什么手段都好,花几个小时弄懂就行,看这书就是纯浪费时间:
                  key1.操作系统 调用函数 栈
                  key2.操作系统 进程结构 内存分配结构
                  key3.汇编 Intel语法 寻址
                  好啦好啦,一些必要的操作就先介绍到这里,你可能也看的有些烦了,但是不会这些就和不会呼吸不会走路无异,谈何跑过终点?接下来的跟踪思路我和你讲了你也吸收不到营养的,所以说希望你能理解。


                  IP属地:吉林71楼2025-05-10 23:48
                  收起回复
                    ## L17
                    这边纠正一个误区啊,有些人(特别是写过一些代码的)会有一种想法,觉得跟踪这个和平时调试源代码程序差不多,只要按f7跟住就行,不对啊这是不一样的,一直按f7跟不行的。
                    先不说一点一点跟随便就要按几k次几w次f7你能不能受得了,如果你跨模块还很容易“跟丢”,你会发现eip卡住了之类的,你必须在你感兴趣的地方下断点才可以跟的住,能理解吗?
                    知道要在哪里断要熟悉win api,这些就不提了。
                    前面(L11)说到我们怀疑start.ps3这个文件是程序的脚本载入的入口点,接下来我们要把视角想办法去跟踪这个start.ps3文件的载入,然后再单步调试,看看主程是怎么处理这个start.ps3的:
                    介绍一个非常常用的win系统api:createfile
                    你想一下,我们要使用,读取一个文件之前,不管之后对它再怎么样,都要把磁盘上的文件load到内存里对吧?然后操作系统创建这个文件描述符df,然后...的,然后你的程序就可以通过文件管理系统读写这个文件嘛,最开始调用的就是createfile这个api。 所以我们主程序模块(cmvs)上查找这个函数的调用,在createfileA上打断点:

                    你可以在这个标签管理你的所有断点:

                    为什么在createfileA上打而不在createfileW上打呢?因为CreateFileA是读取ASCII码作为函数参数的版本,CreateFileW中W是指宽字符,宽字符就是单字符占多字节的的字符,比如utf-16字符,很多什么软件不支持中文路径的罪魁祸首就是这种东西啊。反正我们把两个都试一遍,你会发现只有这个CreateFileA可以,接下来你按f9运行程序,死死盯住栈区(记住这些栈主要是和函数调用有关就行):看到这里调用读取了一个info.txt,我可以事先告诉你这个没用,但是你自己逆的时候要社区看看这个info.txt是什么啊。

                    好,忽视那些断出的明显没什么用的系统文件,终于在我们兴趣的地方断下来了,确实是通过这个文件开始载入的:

                    现在我们处于调用入口,我们把鼠标放在cmvs32.004198d9那个地方看看是什么地方在调用这个start.ps3:
                    为什么要回去看?为什如果是你写程序,你打开了一个文件,这个文件是加密的,你接下来马上要做什么?
                    解密。
                    解到什么地方?
                    内存。
                    所以我们跟踪他调用它的这个地方,跟一会大概率马上就从内存里能获取到解密后(你也可以通过这个过程分析出.ps3的解密算法)的start.ps3。


                    IP属地:吉林72楼2025-05-10 23:58
                    回复
                      ## L18
                      跟过区发现这个地方在调用createfileA:

                      你看看它在干什么?标黄的地方:分配内存读取文件这是在干嘛?当然是把start.ps3载入到内存,所以我们赶紧下断点,开始单步跟踪(步过);

                      OK,我们在步过到readfile后面的时候,发现提示(dbg提示你ebx中的地址指向一块以“PS2A0”字符串开头的地址)出现了这些PS2A0,你想到了什么?
                      这不就是我们前面看过的的start.ps3嘛,现在它进内存了,我们赶紧dump(*这个词后面解释)住它,看看它在内存的哪里:

                      继续跟踪,我们ret回到了调用处的上层:

                      继续单步,发现程序在这个地方面写了有些什么东西,反复的读写一个内存区段,dump它在写的内存的地方过去看下:发现他在这个内存的这个地区(其实就在文件头下一点)搞了一堆看不懂的什么东西(可能是密钥之类的?瞎猜的),不管它记住这个位置动了,打个断点先跳出来继续走:

                      跟到后面发现一个大localAlloc分配内存,这个时候你分配内存,你觉的它想干嘛?是个人都猜出来了它要为解密后的start.ps3分配内存:

                      call cmvs32.46fea0 这条过完再dump过去看看:

                      是不是发现这个:PS2A0非常的“稀疏”,是不是和garbro中解密出来的.ps3文件文件很像,这是典型的明文机器码。那么按惯例.ps3文件后面应该跟着一些明文字符串,我们拉到后面看看:

                      一堆路径,指向我们的封包文件。你猜这些路径是做什么用的?没错,导入封包的。
                      那么,我们现在产生了一个大胆的想法,如果把script.cpz文件改成指向没有封包的文件夹路径,然后再修改exe跳过.ps3的解密过程,我们是不是就可以免封包解密script了?


                      IP属地:吉林73楼2025-05-11 00:03
                      回复
                        ## L19
                        好,我们先把解密后的start.ps3 dump出来,然后暂停调试:
                        点击plugin > scylla > file > dump memory填写起始地址和dump长度:

                        这个就是解密后的start.ps3了,hex打开看一下:

                        这个是脚本cpz载入的路径,我们把它改成我们解包出来的路径


                        然后把它替换掉原来的start.ps3,这样就可以了为什么可以这样改?你看我标记的位置:

                        这个video文件夹它自己就是这么导入的,说明这个系统有这样full load的能力嘛,反正逆向都是猜我们都是猜试试又不花钱。然后把解密后的start.ps3覆盖原来的文件,把script.cpz解包到pack\code

                        然后我们开始修改exe来了实现跳过.ps3加密:

                        我们来分析这些代码,算了我直接告诉你吧,蓝圈部分是生成密钥部分,红圈是用密钥解密和生成明文部分,并且所有ps3解密逻辑都是走这里的,我们把两处je改成jmp,按空格:

                        点击创可贴,patch file > 选择原文件exe,保存为修改后的的exe。

                        发现可以正常打开游戏,至此,汉化完成了一半,我们已经完成了免封包,可以在明文的snkyxx.ps3文件中随意修改文本了。剩下的明天再写吧。


                        IP属地:吉林74楼2025-05-11 00:09
                        回复
                          好帖。但是说实在的,对于非主流引擎,一个没有逆向经验的人即使看了帖子也是大概率没有能力做内嵌的。逆向这种东西...网上发帖很难教会人。不过楼主的这篇教程确实是目前我看过的最清晰的基础教学了,御爱那边的信息基本没多少逆向相关的内容,有的一些也都明显不是给完全没经验的人入门的。那边我看了半天没找到一个帖子介绍dbg的四个区域的。那边的进阶经验更像是那一批同好作者之间互相交流的文章,新人只能望洋兴叹。我很乐意学习逆向相关的知识,有推荐的书籍吗?基础为优先,由浅入深的书籍。


                          IP属地:河南75楼2025-05-11 00:33
                          收起回复
                            汉化对程序要求是挺高的,主流的有些已经有完整一套工具,可能小白学一下怎么操作很快也能摸索到。非主流引擎需要做分析逆向,再写代码解包封包,复杂的二进制脚本分析,有些还要考虑下字库问题,还有些游戏带壳或检测,发现异常给你整活例如进不了角色线或者演出效果简化,没有一定水平简直是天书


                            IP属地:广东来自Android客户端76楼2025-05-11 10:09
                            回复
                              2025-12-30 20:26:04
                              广告
                              不感兴趣
                              开通SVIP免广告
                              好帖 顶顶


                              IP属地:重庆来自Android客户端77楼2025-05-11 11:30
                              回复