刚开始学习逆向工程,记录一下逆向Unity的过程,可能有些写的不够完善或者有错误的地方欢迎大佬们指正~
使用工具
IDA Pro 64
x64dbgx64dbg
插件dbgChild
破解过程
删除证书文件,直接启动Unity.exe,弹出窗口
1、使用dbg打开,在dbg中搜索弹窗的字符串引用
2、打上断点,在此使用dbg打开,启动并运行,发现可以运行到断点处
3、在IDA中找到这段代码,按F5查看伪代码,找到执行该语句的条件判断,可以看到这里是调用了一个虚函数,传入v48,然后判断v48偏移值为0的位置是否为true
4、找到这个函数,查看其返回值,可以看到有两处设置了它,其中一处直接将其设置为0,猜测是在没有许可证的时候直接返回错误
5、返回到汇编语言,找到这段代码,将其改为1
6、现在不会在弹窗,可以直接进入Unity Hub了,使用Unity命令行打开工程,发现不会打开工程,而是打开Unity Hub。重新加载许可证,使用Unity命令行打开工程,发现可以直接跳转到工程。由此可以推断出Unity.exe应该是在某个时机又进行了一次。
7、删除许可证,加载dbg插件dbgChild,使用dbg打开cmd,然后使用Unity命令行打开工程,等待附加了Unity的dbg打开,执行到弹出Unity Hub,发现在弹出Unity Hub前会停止,反复尝试几次可以得知在Application::InitProjectSettings中调用的HomeWindow::Show是打开Unity Hub的函数。
8、猜测就是在这之前进行了某种判断,如果许可证通过则直接打开工程,如果许可证不通过则打开hub,在IDA中查看伪代码,发现是这段判断,在dbg中将jz改为jmp,直接强制跳过跳转到Unity Hub的逻辑
9、再次使用命令行运行,直接打开工程,成功!但是问题又来了,发现使用Unity命令行打开工程运行打开的始终是上一个打开的工程,所以要继续分析。
10、继续分析InitProjectSetting函数,因为是使用命令行的projectPath参数打开的工程,所以可以寻找projectPath相关逻辑,找到一段代码和projectPath有关,并且在此处验证了许可证
11、直接跳过许可证验证
12、保存后再次使用命令行打开,可以正常打开了。
13、但是问题又又来了,当我打开一个安卓工程时会弹窗需要切换平台,猜测应该是build相关的逻辑也需要验证许可证
14、这个问题很好找,直接和第一步一样找弹窗信息就好,非常轻松的就找到了弹窗的位置
15、分析Application::PromptToChangeBuildTarget函数的伪代码后可以看出弹窗代码是没有判断的逻辑的,那么应该就是在调用该函数的地方进行的判断,查找Application::PromptToChangeBuildTarget函数的交叉引用,找到了调用它的函数Application::ValidateBuildTargetSupport
16、分析伪代码,找到了它的判断条件,可以看到如果IsBuildTargetSupported为true,就会直接返回,也就不会弹窗了
17、分析IsBuildTargetSupported,找到了许可证相关的函数
18、查看该函数,发现调用了大量的ILicensingInternal接口的第一个虚函数,找到找到这个虚函数(这一步应该也可以直接让BuildPlayerLicenseCheck强制返回1,但是因为dbg调试的时候这个虚函数被调用了很多次,所以直接从这个虚函数入手)
19、找到这个虚函数,查看其返回值为0或1,那么只要将其强制返回1即可
20、改完后再次测试,可以顺利运行了!