Unity3D培训
美国上市Unity3D培训机构

400-111-8989

VR培训

unity3d手游破解--基于inline hook

  • 发布:Unity3D培训
  • 来源:Unity3D教程
  • 时间:2018-05-11 17:32

再分享一个,目标APK--风之旅X,挺好玩的。

一、前言

有的时候 unity3d 的解密函数被保护起来,因此这里提供一套基于inline hook的方案来实现破解,当前这个APK的 Assembly-CSharp.dll 是加密的,如下图所示,而且在libmono.so 的mono_image_open_from_data_with_name 的函数上下文找了几圈都没找到解密函数。

unity3d手游破解-基于inline hook

二、思路

首先,APK的所有dll都是通过libmono.so 的 mono_image_open_from_data_with_name的函数加载的,输入的是原始的dll,返回的时候解密后的dll,因此我们通过hook这个函数来实现dll的dump和替换,把修改过的dll替换掉原来的实现破解。

三、Hook

首先获取 libmono.so 的基址,这里我们通过读maps来获取,再从IDA里面找到mono_image_open_from_data_with_name 的偏移0x196C4C,相加得到函数的地址,然后把该函数hook到我们自己的 new_game_proxy 函数,在 new_game_proxy 函数里面实现dll的dump和替换。

unity3d手游破解-基于inline hook
unity3d手游破解-基于inline hook

这个APK上只有ARM的so,因此我们做arm的inline hook,把目标函数的前两条指令,替换成跳转指令( ldr pc,[pc,#-4] )+跳转地址( new_game_proxy 函数),实现跳转到new_game_proxy 函数,替换之前先把指令保存到缓存g_OrigCode_game_proxy 数组。

接着再在 g_OrigCode_game_proxy中添加跳转回原函数的指令: 跳转指令(ldr pc,[pc,#-4])+跳转地址(原函数+8),最后把g_OrigCode_game_proxy 的内存设置可执行,在new_game_proxy 函数中调用g_OrigCode_game_proxy 就回到原函数继续执行了。

unity3d手游破解-基于inline hook
unity3d手游破解-基于inline hook

mono_image_open_from_data_with_name 函数的返回结构如下图所示

unity3d手游破解-基于inline hook

其中raw_data就是解密dll的内存,raw_data_len就是dll的大小,在 new_game_proxy 函数中把 dll dump到 /data/local/tmp/ 目录中,如果这个目录已经存在 Assembly-CSharp.dll 就把该dll加载替换原来的dll。剩下的就是对dll的修改了。

unity3d手游破解-基于inline hook

四、加载so

把APK中的dex拉出来反编译,找到 com.silverera.sao.YHGameActivity 的smali,把加载so的代码插进去,回编译替换回去。再把上面的hookso放进APK的lib目录,重打包APK。

unity3d手游破解-基于inline hook

hookso被加载之后会开一个线程等待libmono.so完成加载再hook,至于为什么不直接先加载libmono.so,再加载hookso直接hook的原因后面会说。

unity3d手游破解-基于inline hook

五、修改dll

把解密后的dll拉出来,用reflector打开,找关键函数,通常要经过各种尝试和修改才能找到合适的函数。这里展示一个我之前改过的函数吧,在这个游戏里面ChangeSP是释放技能消耗魔法的函数,因为这个游戏技能是没有CD的,但是魔法很少,放不了几个技能。把 ChangeSP函数直接return,然后就不掉魔法,所以可以无限技能。

unity3d手游破解-基于inline hook

有一个问题就是用reflector反编译过的dll替换回去是加载不了的,原因我还没找到,因此我们只能手动修改二进制来实现破解,不过也不复杂,用IDA打开 Assembly-CSharp.dll,查找ChangeSP函数,可以看到这个函数的地址是0x19c994,用UltraEdit打开 Assembly-CSharp.dll定位到这个地址,把第一个字节改成0x2A,也就是ret,替换回去就实现了无限技能。还有无敌、秒杀之类的有兴趣的可以自己摸索一下。

unity3d手游破解-基于inline hook

六、彩蛋

运行的时候查看HOOK日志,发现我们要hook的mono_image_open_from_data_with_name 函数居然还被其他人hook过,original code日志显示的应该是mono_image_open_from_data_with_name 的前8个字节,但是这里变成了ldr pc,[pc,#-4]+0x14d038d0,跟下面我们的hook一样,地址不同。

unity3d手游破解-基于inline hook

跟踪一下地址0x14d038d0,发现这个地址位于libexecdll.so。

unity3d手游破解-基于inline hook

用IDA打开 libexecdll.so,发现是ijiami的,应该是ijiami把解密函数保护起来了。之前hook太快导致程序崩溃,所以我们先让ijiami hook,然后我们再hook。

unity3d手游破解-基于inline hook

七、结束语

hookso的源码放在附件。下图是我把怪物的攻击和血量都改成1。

unity3d手游破解-基于inline hook

感谢大家阅读由Unity3D教程分享的“unity3d手游破解-基于inline hook”希望对大家有所帮助,更多精彩内容请关注Unity3D培训机构官网

免责声明:本文由小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:使用Unity 2018.1项目模板功能
下一篇:Unity3D 软件下载
Unity|超级兔子

Unity|超级兔子

Unity超级角色控制器物理API分析与功能实现

Unity超级角色控制器物理API分析与功能实现

教程:让Unity中物理效果更加逼真

教程:让Unity中物理效果更加逼真

Unity3D 软件下载

Unity3D 软件下载

选择城市和中心
贵州省

广西省

海南省