galgame吧 关注:1,745,711贴子:25,280,323

【摸鱼】KrkrZ找CxEncrypt参数的方法

只看楼主收藏回复



IP属地:广西1楼2020-06-20 03:23回复
    首先IDA载入游戏主程序
    找到“tTVPXP3ArchiveStream”的虚函数表
    第1个就是“tTVPXP3ArchiveStream::Read”

    为了固定基址方便调试,先修改一下EXE的FLAG

    把这个勾上即可。
    用OD或者x32dbg载入主程序。
    找到“tTVPXP3ArchiveStream::Read”下断点。
    直接F9跑程序。
    断下来之后Ctrl+F9、F8跟出这个函数。
    从“tTVPXP3ArchiveStream::Read”出来之后就到了这里。

    然后继续Ctrl+F9、F8跟出这个函数。
    你会发现,EIP都不在EXE的地址空间里了。

    此时先不继续跟踪,把这块代码搞出来。

    如果用的是x32dbg就可以非常方便地dump这块内存了。
    记住基址“0x10000000”
    然后直接把文件拖到IDA里,这里需要选“Binary file”。

    然后选“Yes”进行32位代码反编译

    载入代码之后,先Rebase一下,把基址对齐。

    刚才dump出来的时候这块内存的基址是0x10000000,所以这里照填。

    点击“OK”即可对齐基址。


    IP属地:广西2楼2020-06-20 03:45
    收起回复
      现在就可以用IDA分析代码了。
      按G输入当前EIP,跳到当前执行的代码。
      此时IDA中显示的反汇编跟x32dbg中是一模一样的,所以很方便调试。

      跳过来之后发现IDA并没有自动分析到这个函数。
      往上翻找到函数头10004E90把光标移过去之后按P分析这个函数。

      然后就可以F5了。
      在伪代码界面,依然可以按G输入地址进行跳转,IDA会自动把光标放到对应的那一行上。
      这样就方便跟踪函数执行的流程了。

      回到x32dbg继续跟踪
      用F8单步往下走到这个CALL
      它会CALL到解密函数

      F7跟这个函数。
      然后IDA中也跟进来。

      这个就是真正的解密函数了。

      直接进入sub_10001150就可以发现熟悉的CxEncrypt代码了。

      如果不了解CxEncrypt建议阅读GARbro或者arc_unpacker的代码。
      下面我也会简单地说明一下。


      IP属地:广西3楼2020-06-20 04:01
      回复
        CxEncrypt是Krkr专用的加密算法,其实现手法极其朋克。
        它通过输入一个key来生成两个函数,对你没看错,动态创建两个函数的汇编代码。
        然后执行这两个函数,并生成两个新的key
        这两个新的key才用来对资源数据进行解密。
        详细的算法实现可以参考GARbro或者arc_unpcker这里就不多解释了。


        IP属地:广西4楼2020-06-20 04:08
        回复
          以GARbro中的代码为例
          为了运行CxEncrypt算法,需要几个参数,如下:
          uint Mask
          uint Offset
          byte[3] PrologOrder
          byte[6] OddBranchOrder
          byte[8] EvenBranchOrder
          uint[] ControlBlock
          (位于KiriKiriCx.cs文件)
          这些参数都可以在IDA中找到,只是需要少许耐心。
          我们先从简单的来。

          在左边函数列表里上下翻找即可简单找到mask和offset

          如果没有找到类似的函数,那就切换到反汇编代码,看看是不是IDA没有自动分析出来,如果没有分析出来,那就像上面一样找到函数头然后按P就行了。
          然后找找ControlBlock
          回到sub_10001150,进入sub_10008920

          你会看到里面有个 sub_10001250 这个函数返回ControlBlock的指针

          把这个数值复制一下,回到x32dbg
          在内存窗口中按Ctrl+G跳转到这个地址。
          从这个地址开始4096个字节就是ControlBlock了。
          把它dump出来即可。

          最后找三组order
          进入这个函数
          里面只有一个函数调用,继续跟进

          就到了这样的地方

          这个函数一般情况下都无法F5反编译的
          它会告诉你这个switch分析不了

          可以尝试修复一下,如果不行,那就只能人力反编译了。


          IP属地:广西5楼2020-06-20 04:29
          回复
            双击 jmp 后面的 off_10008DBC 来到这里
            这里是一个switch跳转表,它应该是几个整数的跳转地址。

            把光标移到10008DC0然后按D调整数据类型

            随便选中一个分支过去看看,都没有识别成代码

            只需要按C让IDA分析它就行了

            这样就可以读了,其它分支也用相同的方法处理一下。

            回到刚才的switch jmp尝试F5还是不行,所以干脆就放弃了。
            有这个switch就够了,不需要看反编译代码。
            继续看这个switch jump

            它有6个分支,对应的是OddBranchOrder这一组。

            morkt已经把关键数字标出来了。
            我们需要做的就是找到对应关系

            把光标放到第一个分支上,此时IDA会弹出这个分支处的反汇编代码,然后可以滚动鼠标滚轮往下翻。
            对比上面两张图,很容易就会发现IDA中的这个(分支1)会对应源码中的【分支0】。
            所以我们记录下来:

            然后看下一个(分支2)

            对应源码中的【分支4】,所以接着记录:


            IP属地:广西6楼2020-06-20 04:44
            收起回复

              重复上述步骤就可以把这一组6个数字找完了。
              由于这个函数不能F5反编译,所以只能手动找其它组的switch了。
              回到sub_10008BA0函数头,稍微往下翻,就能找到一个CALL

              跟进这个函数,往下翻,就会发现非常相似的代码。

              按照同样的方式处理即可。

              这里有8个分支,所以对应的是:

              然后就跟上面一样找对应关系,并且记录下来就可以完成这一组数字了。

              (遇到IDA没有识别出来的代码,可以按C让IDA进行分析)
              再次回到sub_10008BA0函数头。
              往下一点的地方就有一个CALL。

              跟进去之后发现是可以F5反编译的。


              可以看到有3个分支,所以这里对应:

              分支识别出来之后,还是按照上面的方式,找对应关系。
              找完三个数字即可。


              IP属地:广西7楼2020-06-20 04:59
              回复
                把参数都找全之后,就可以测试一下了。我就随便找了个地方把算法弄了进去。
                注意:GARbro里用到的ControlBlock每个字节都经过位取反。(阴公,浪费咗半个钟头,丢)


                IP属地:广西8楼2020-06-20 05:11
                收起回复
                  Kirikiroid我试了一下,一堆BUG,主界面不显示,点几个东西又报错。
                  我是不会修的,Kirikiroid这种高端APP我怎么可能看得懂(


                  IP属地:广西9楼2020-06-20 05:16
                  回复
                    mark一下,楼主还加了注释


                    IP属地:广东来自Android客户端10楼2020-06-20 05:57
                    回复
                      sdl


                      IP属地:北京来自Android客户端11楼2020-06-20 06:52
                      回复
                        太强了收藏了(虽然看不懂


                        IP属地:日本来自Android客户端12楼2020-06-20 07:40
                        回复
                          不明觉厉


                          IP属地:山东来自Android客户端13楼2020-06-20 09:09
                          回复
                            大佬太厉害了这游戏我卡在第一步上了,就是怎么绕过steam的drm去调试?


                            IP属地:日本14楼2020-06-20 09:55
                            收起回复
                              逆向大佬


                              来自Android客户端15楼2020-06-23 17:23
                              回复