某手游反外挂分析
个人博客: http://www.cnblogs.com/2014asm/
工具与环境:
IDA7.0
JEB2.2.5
Nexus 5
Android 4.4
目录:
一:app简单分析与java层反编译
整体图:

1.最近在学习手游保护方面的技术,本文是学习过程中分析某反外挂的一点记录,高手莫要见笑,有不对的地方还请指教,首先简单通过资源目录中文件名做基本了解,
在lib目录中有libmono.so、libunity.so,资源目录中存在(assets\bin\Data\Managed\Assembly-CSharp.dll),应该是unity 3D编写,通过反编译发现该文件己被加密,在资源目录下armeabi文件夹中还存放着libengine.sox与libstub.sox文件,看名字猜测很可能这两个文件就是反外挂其中的一些模块了,在看看lib目录下只有libcompatible.so模块比较可疑。如下图所示:


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

被发现有调试器附加,下节我们将分析它的反调试机制。
2.通过JEB反编译来看看大致流程,反编译后先找到application类,代码如下图:

主要是加载so模块,so名称字符串被加密了,解密出来后so名称"compatible",将compatible.so放到IDA中反编译发现函数名被混淆了,字符串己加密,如下图:
通过以上简单分析,我们主要关注的重点关注的模块主要有lib目录下的libcompatible.so与资源目录中的libengine.sox与libstub.sox,还有就是发现java层的字符串与函数名都被混淆,so模块中的字符串也函数名也被混淆。
3.拷贝资源,解密libstub.sox并加载 。
在Lcom/inca/security/Core/AppGuardEngine初始函数<init>(Landroid/content/Context;Lcom/inca/security/AppGuard/AppGuardEventListener;Z)V中将判断X86或ARM平台并将对应的\assets\appguard中的libengine.sox、libstub.sox、update.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。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
