欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

某手游反外挂分析

某手游反外挂分析

个人博客: http://www.cnblogs.com/2014asm/

工具与环境:

IDA7.0

JEB2.2.5

Nexus 5

Android 4.4

目录:

一:app简单分析与java层反编译

二: compatible.so反调试与反反调试

三: compatible.so注册jni函数分析

四: stub.so反调试与反反调试

五: stub.so注册jni函数分析

六: Assembly-CSharp.dll解密分析

七: libengine模块分析

八:总结

:app简单分析java层反编译

整体图:


1.最近在学习手游保护方面的技术,本文是学习过程中分析某反外挂的一点记录,高手莫要见笑,有不对的地方还请指教,首先简单通过资源目录中文件名做基本了解,

lib目录中有libmono.solibunity.so,资源目录中存在(assets\bin\Data\Managed\Assembly-CSharp.dll),应该是unity 3D编写,通过反编译发现该文件己被加密,在资源目录下armeabi文件夹中还存放着libengine.soxlibstub.sox文件,看名字猜测很可能这两个文件就是反外挂其中的一些模块了,在看看lib目录下只有libcompatible.so模块比较可疑。如下图所示:


当我们用调试器附加游戏程进时会有如下提示:


被发现有调试器附加,下节我们将分析它的反调试机制。

2.通过JEB反编译来看看大致流程,反编译后先找到application类,代码如下图:


主要是加载so模块,so名称字符串被加密了,解密出来后so名称"compatible",compatible.so放到IDA中反编译发现函数名被混淆了,字符串己加密,如下图:

通过以上简单分析,我们主要关注的重点关注的模块主要有lib目录下的libcompatible.so与资源目录中的libengine.soxlibstub.sox,还有就是发现java层的字符串与函数名都被混淆,so模块中的字符串也函数名也被混淆。

3.拷贝资源,解密libstub.sox并加载 。

Lcom/inca/security/Core/AppGuardEngine初始函数<init>(Landroid/content/Context;Lcom/inca/security/AppGuard/AppGuardEventListener;Z)V中将判断X86ARM平台并将对应的\assets\appguard中的libengine.soxlibstub.soxupdate.dat拷贝到程序安装目录。JEB未能正常反编译出java代码,smali代码。

    

:1946 

00001946  const/4             v9, 3 

00001948  if-ge               v6, v9, :1C16 

:194C 

0000194C  invoke-static       Binder->getABI()I 

00001952  move-result         v6 

00001954  move-object/from16  v0, p0 

00001958  move-object/from16  v1, p1 

0000195C  invoke-virtual      AppGuardEngine->iiIIIiiiIi(Context, I)Z, v0, v1, v6  # 拷贝资源 

00001962  move-result         v6 

00001964  if-eqz              v6, :1BE0 

:1968 

00001968  new-instance        v6, qb 

0000196C  invoke-static       JNISoxProxy->getContext()Context 

00001972  move-result-object  v9 

00001974  invoke-direct       qb-><init>(Context)V, v6, v9 

0000197A  const-string        v9, "fChY~_h\u0004yEr"  # libstub.sox 

0000197E  invoke-virtual      qb->iiIIIiiiIi([B)V, v6, v8 

00001984  invoke-static       b->iiIIIiiiIi(String)String, v9 

0000198A  move-result-object  v9 

0000198C  const-string        v10, "j\u000Fd\u0015r\u0013dHu\t"  # libstub.so 

00001990  invoke-static       yb->iiIIIiiiIi(String)String, v10 

00001996  move-result-object  v10 

00001998  const/4             v11, 0 

0000199A  invoke-virtual      qb->iiIIIiiiIi(String, String, [B)Z, v6, v9, v10, v11  # 解密libstub.sox((最终传入so层解密private static native byte[] iIiIIIiIiI(byte[] arg0, int arg1))) 

000019A0  move-result         v6 

000019A2  if-eqz              v6, :1BE0 

:19A6 

000019A6  new-instance        v6, File 

000019AA  new-instance        v9, StringBuilder 

000019AE  invoke-direct       StringBuilder-><init>()V, v9 

000019B4  const/4             v10, 0 

000019B6  invoke-static       JNISoxProxy->getContext()Context 

000019BC  move-result-object  v11 

000019BE  invoke-virtual      Context->getFilesDir()File, v11 

000019C4  move-result-object  v11 

000019C6  invoke-virtual      File->getAbsolutePath()String, v11 

000019CC  move-result-object  v11 

000019CE  invoke-virtual      StringBuilder->insert(I, String)StringBuilder, v9, v10, v11 

000019D4  move-result-object  v9 

000019D6  const-string        v10, "%FcHy^\u007FH$Ye"  # /libstub.so 

000019DA  invoke-static       b->iiIIIiiiIi(String)String, v10 

000019E0  move-result-object  v10 

000019E2  invoke-virtual      StringBuilder->append(String)StringBuilder, v9, v10 

000019E8  move-result-object  v9 

000019EA  invoke-virtual      StringBuilder->toString()String, v9 

000019F0  move-result-object  v9 

000019F2  invoke-direct       File-><init>(String)V, v6, v9 

000019F8  invoke-virtual      File->exists()Z, v6 

:19FE 

000019FE  move-result         v9 

00001A00  if-eqz              v9, :1BE0 

:1A04 

00001A04  invoke-virtual      File->getAbsolutePath()String, v6 

00001A0A  move-result-object  v9 

00001A0C  invoke-static       System->load(String)V, v9  # 加载指定路径的SO 

00001A12  invoke-direct/range AppGuardEngine->lllIIIlllI(Context)V, p0 .. p1  # 调用Native 

:1A18 

00001A18  invoke-virtual      File->delete()Z, v6 

00001A1E  new-instance        v6, File 

00001A22  new-instance        v9, StringBuilder 

00001A26  invoke-direct       StringBuilder-><init>()V, v9 

00001A2C  const/4             v10, 0 

00001A2E  invoke-static       JNISoxProxy->getContext()Context 

00001A34  move-result-object  v11 

00001A36  invoke-virtual      Context->getFilesDir()File, v11 

00001A3C  move-result-object  v11 

00001A3E  invoke-virtual      File->getAbsolutePath()String, v11 

00001A44  move-result-object  v11 

00001A46  invoke-virtual      StringBuilder->insert(I, String)StringBuilder, v9, v10, v11 

00001A4C  move-result-object  v9 

00001A4E  const-string        v10, ")\no\u0004u\u0012s\u0004(\u0015i\u001E"  # /libstub.sox 

00001A52  invoke-static       yb->iiIIIiiiIi(String)String, v10 

00001A58  move-result-object  v10 

00001A5A  invoke-virtual      StringBuilder->append(String)StringBuilder, v9, v10 

00001A60  move-result-object  v9 

00001A62  invoke-virtual      StringBuilder->toString()String, v9 

00001A68  move-result-object  v9 

00001A6A  invoke-direct       File-><init>(String)V, v6, v9 00001A70  invoke-virtual      File->delete()Z, v6  


注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功