吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2147|回复: 2
收起左侧

[Android 原创] 仨笨贼深入研究分析第一部

[复制链接]
AItechnology 发表于 2020-5-11 23:01
写在前面,最近突然想分析一下[仨笨贼]这款游戏。先感谢这篇帖子,连接https://www.52pojie.cn/thread-607019-1-1.html
这篇帖子是在smali层直接破解游戏。但在第19关会闪退。感到头疼的问题,那么我们能不能直接解锁所有关卡,那不就不怕闪退了吗?
另外,为什么会闪退,只能深入去找了。这篇帖子就是我自己去分析这款apk的过程。本人能力最终未能成功找到原因,分析过程记录下来,希望有高人指点,能成功搞死它。
废话有些多了,直接开始。
将apk拖入androidkiller,查看androidManifest.xml文件。发现如下:

  • 首先进行权限分析,发现需要的权限


  • 访问网络状态
  • 读取电话状态
  • 发送短信
  • 联网
  • 写入外部sd
  • 装载卸载sd
  • 更改网络状态
  • 更改wifi状态
  • 手机电池
  • 唤醒手机
  • 读取设置
  • 杀死背景服务
  • 开机启动
  • 写入外部sd
  • SIGNAL_PERSISTENT_PROCESSES


从需要的权限来看这个app的行为奇怪。为什么要杀死后台服务?

为什么开机启动?

完全的互联网控制权限?

这是一个被植入了木马的游戏?

下面进入进一步分析这个游戏的ActivityService等组件



包名: com.caimeng.sbz2

Application中强制横屏显示,且是全屏没有标题栏

application中没有name属性,看样子应该没有在Application做一些初始化工作。

奇怪的是为什么debuggable开关是打开的,这进一步加剧了被植入木马的可疑性。



第一个Activitycom.caimeng.sbz2.sbz2,这是入口点

第一个Servicemm.purchasesdk.iapservice.PurchaseService,根据包名来看是一个购买的集成工具包。应该与游戏内购有关。



第二个Activitymm.purchasesdk.iapservice.BillingLayoutActivity为内购的调用的购买界面。



第二个Servicesafiap.framework.SafFrameworkManager,这个是干什么的呢?百度一下吧。结果发现中国移动互联网基地计费能力的接入文档。看来就很明白了。

附上文档地址https://www.docin.com/p-871958397.html

好了里面的多数声明都是为了集成移动支付用的。



好了,没兴趣阅读过多的接入文档。我们接着看。发现除了接入支付需要的权限外,多了的权限有

  • 更改网络状态
  • 更改wifi状态
  • 手机电池
  • 唤醒手机
  • 读取设置
  • 杀死背景服务
  • 开机启动
  • SIGNAL_PERSISTENT_PROCESSES




接下看,发现com.cmcc.aoe.activity.MessageAlert这样一个Service是干什么的?不知道,我们百度发现是集成了中国移动的有推”AOE,在这个集成文档中看到需要的权限刚好覆盖了前面多出来的权限,但是还是有一个SIGNAL_PERSISTENT_PROCESSES不包括,这是干什么的呢?不着急,慢慢看。(百度是发送永久进程信号)

接下来的AoeNetReceiverBootReceiverPackageReceiverSMSDataReceiverSMSNotifyReceiverSMSWakeupReceiverRebindReceiverBindAoeServiceAoeServiceNotifyCationReceiver

好了,至此,所有的内容分析完毕。

那么这个AOE是干什么的,读读接入文档,发现这么一个定义有推系统是中国移动定义的永远在线平台,手机应用平台可以通过有推系统向终端发送消息,呵呵,广告吧。

这个应用貌似很难被杀死,拥有一直在线能力。不过时至今日,这个一直在线能力估计不行了。不过谁知道呢。



至此,该应用尚未在真机测试,没有测试过是否真的一直在线。不过开发者真没良心,集成了支付,还要放广告。也有可能是被二次开发,接入了广告,谁知道呢。这款应用现在直接百度很难找到官网运维,估计开发商早不管了。



把所有权限删了。哈哈。狠毒。



回编译,看看。(本文所有的分析都用的androidKiller

编译成功。



好的。我们还是不看应用的运行效果,继续静态分析。哈哈



找到入口类:

com/caimeng/sbz2/sbz2



翻译这些smali代码,结果如下:

Package com/caimeng/sbz2;

Public class sbz2 extends org/cocos2dx/lib/Cocos2dxActivityimplements com/caimeng/sbz2/Info{

         Publicfinal static int BILLING_CANCEL=0;

Public finalstatic int BILLING_FAILD=0;

Public finalstatic int BILLING_SUCCEED=0;

Private finalstatic String PAYCODE=”Paycode”;

Private finalstatic String PRODUCTNUM=”ProductNUM”;

Public staticHandler handler;

Static BooleanisMireGameScene;

Public Static mm/purchasesdk/Purchasepurchase;//哈哈,肯定是调用这个包发起的购买方法

Public staticint sbillinigIndex;//这个应该是购买的哪个道具

Private com/cmcc/aoe/sdk/AoiSDKaoi;

Public com/caimeng/sbz2/OneCallbackcb;

Private Context context;

Private StringgoodInfos;//购买的哪个物品

Private org/cocos2dx/lib/Cocos2dxGLSurfaceViewmGLView;

Private com/caimeng/sbz2/IAPListenermListener;

Private EditTextmPaycodeView;

PrivateProgressDialog mProcessDialog;





Class IAPHandlerextends Handler{

         Public IAPHandler (){

         

}

}

//接下来的代码就多了,所有先由onCreate方法看起

Void onCreate(BundlesavedInstanceState){

         super.onCreate(savedInstanceState);

         StringpackageName=this.getApplication().getPackageName();

         Log.v(“tag”,”onCreate”);

         IAPHandler iapHandler=new IAPHandler();

         handler = innersbz2;

         this.initEOe();

         this.initIAP();

//经过以上分析,发现新建了一个hanlder传递消息

//initEoe()initIAP()是干什么的,跟踪一哈

}



Public voidinitEoe(){

         cmcc/aoe/sdk/AoiSDK aoi=new cmcc/aoe/sdk/AoiSDK();

         com/caimeng/sbz2/OneCallback cb=new com/caimeng/sbz2/OneCallback();

         cb.setContext(this);

         aoi.init(this.getApplicationContext(),"300008918159",cb);

}

//好吧,这个是初始化这些集成的SDK

//下面来看initIAP()这个方法

Public booleaninitIAP(){

         ProgressDialog mProgressDialog=newProgressDialog();

         mProgressDialog.setIndeterminate(true);//1代表true

         mProgressDialog.setMessage(“请稍等”);

         IAPHandler iapHandler=new IAPHandler(this);

         IAPListener mListener=newIAPListener(this, iapHandler);

         purchase= mm/purchasesdk/Purchase.getInstance();

try{

         purchase.setAppInfo("300008918159","5FB6C0FD7CEC31AAEEA011FF45E24513");//初始化app信息

         }catce(Exception e){

                  e.printStackTrace ();

}



Try{

         Purchase.init(this,mListener);

}catch(Exception e){

         e. printStackTrace();

}

Return true;

}

//ok,至此,onCreate干了什么分析完毕,就是初始化集成的SDK

//接下来要分析onStart()方法干了什么

//发现没有onStart方法,那么看看onResume方法



Void onResume(){

                  org/cocos2dx/lib/Cocos2dxActivity.onResume();

log.v(“tag”,”onResume”);

}

//哈哈,竟然没线索了,怎么办。我不了解cocos引擎。

//发现一个nativeResume()的方法,ndk层的代码了。看来进一步追踪有难度。

//有些困了,先不看native层的代码了。我们看看如何让它购买成功吧

//把权限取了,结果apk异常

//那么把上面两个初始化的方法注释掉,程序正常。今天就到这吧

//今天看购买方法

Public void billingSuccessed(String orderId){

         Log.d(“tag”,”成功”);

         If(sbillingIndex>=0){

         If(sbillingIndex<=(goodInfos.length()-1)){//这个判断是看index是否超出物品////长度

         If(goodInfos[sbillingIndex].equals(orderId)){

         nativeBillingSuccess(sbillingIndex,1);

return;

}else{

         Int i=0;

   If(i<goodInfs.length()){

         

}

}

                  



}

}else{

         Return;

}

}

}
以上的java代码是自己直接翻译smali的结果,发现该程序其实就一个Activity,所以,androidManifest.xml文件最终就删成了这样:<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto" package="com.caimeng.sbz2">
    <uses-feature android:glEsVersion="0x00020000"/>
    <application android:debuggable="true" android:icon="@drawable/iconx" android:label="@string/app_name" android:hardwareAccelerated="false">
        <activity android:configChanges="orientation" android:label="@string/app_name" android:name=".sbz2" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true"/>
</manifest>
是不是很简洁。在代码中正如上面所说,注释掉了initEoe()和initIAP()的smali调用。这两个初始化必须干掉,否则因为权限等问题,会闪退。另外,在入口Activity中,删掉除了加载cocos2dxcpp.so的语句,并不出错,因为其它so文件都集成sdk使用的。这个游戏是cocos2d引擎开发,这个库肯定必不可少。
接着分析onResume()方法,发现没有任何加载游戏关卡等函数信息。那么安装后打log看看吧,发现其实这个游戏加载界面等方法放在了Lorg/cocos2dx/lib/Cocos2dxGLSurfaceView;这个包里面,越来越麻烦了。自己在代码中注入log信息,发现在onTouchEvent()的重写方法中switch语句在swith case:5的情况下会加载游戏关卡,用jeb3打开apk,查看其反编译的Java代码后,发现调用了这样一个anative方法,这个方法是在Cocos2dxRenderer.nativeTouchesEnd,这样一个native方法。好了,一路跟踪到了这里。


然后接着打印log,发现有tag为cocos2dx debug info的Log打印出来。我ndk层分析能力不好,华为手机又及其坑die,IDA动态调试竟然只能附加system/bin/sh,除此之外找不到任何进程,真的是莫名其妙,huawei手机对反编译者极不友好。百度也没找到解决办法。只能作罢,那么接着静态分析,找到了打印log的几处函数,最终还是没有成功。
我已经精疲力竭了。希望有大神看到之后指点一二。


免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
qtfreet00 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| AItechnology 发表于 2020-5-11 23:20
深夜发帖,加上刚刚分析的头昏脑胀,内购破解的方法参见帖子中https://www.52pojie.cn/thread-607019-1-1.html的方法,不过由于我干掉了所有集成支付sdk,所有我放在了onPause中调用支付方法。运行apk后再弹出的购买界面点击购买按钮(那个对号),按home键,再进入游戏,就可以购买成功,成品地址附上:https://pan.baidu.com/s/1DmS1REUpHJa2DvXCHRcS_Q,提取码:y14g
13142887278 发表于 2020-5-16 08:07
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表