好友
阅读权限10
听众
最后登录1970-1-1
|
写在前面,最近突然想分析一下[仨笨贼]这款游戏。先感谢这篇帖子,连接https://www.52pojie.cn/thread-607019-1-1.html
这篇帖子是在smali层直接破解游戏。但在第19关会闪退。感到头疼的问题,那么我们能不能直接解锁所有关卡,那不就不怕闪退了吗?
另外,为什么会闪退,只能深入去找了。这篇帖子就是我自己去分析这款apk的过程。本人能力最终未能成功找到原因,分析过程记录下来,希望有高人指点,能成功搞死它。
废话有些多了,直接开始。
将apk拖入androidkiller,查看androidManifest.xml文件。发现如下:
- 访问网络状态
- 读取电话状态
- 发送短信
- 联网
- 写入外部sd卡
- 装载卸载sd卡
- 更改网络状态
- 更改wifi状态
- 手机电池
- 唤醒手机
- 读取设置
- 杀死背景服务
- 开机启动
- 写入外部sd卡
- SIGNAL_PERSISTENT_PROCESSES
从需要的权限来看这个app的行为奇怪。为什么要杀死后台服务?
为什么开机启动?
完全的互联网控制权限?
这是一个被植入了木马的游戏?
下面进入进一步分析这个游戏的Activity和Service等组件
包名: com.caimeng.sbz2
在Application中强制横屏显示,且是全屏没有标题栏
在application中没有name属性,看样子应该没有在Application做一些初始化工作。
奇怪的是为什么debuggable开关是打开的,这进一步加剧了被植入木马的可疑性。
第一个Activity为com.caimeng.sbz2.sbz2,这是入口点
第一个Service为mm.purchasesdk.iapservice.PurchaseService,根据包名来看是一个购买的集成工具包。应该与游戏内购有关。
第二个Activity为mm.purchasesdk.iapservice.BillingLayoutActivity为内购的调用的购买界面。
第二个Service为safiap.framework.SafFrameworkManager,这个是干什么的呢?百度一下吧。结果发现”中国移动互联网基地计费能力”的接入文档。看来就很明白了。
附上文档地址https://www.docin.com/p-871958397.html
好了里面的多数声明都是为了集成移动支付用的。
好了,没兴趣阅读过多的接入文档。我们接着看。发现除了接入支付需要的权限外,多了的权限有
- 更改网络状态
- 更改wifi状态
- 手机电池
- 唤醒手机
- 读取设置
- 杀死背景服务
- 开机启动
- SIGNAL_PERSISTENT_PROCESSES
接下看,发现com.cmcc.aoe.activity.MessageAlert这样一个Service是干什么的?不知道,我们百度发现是集成了中国移动的”有推”AOE,在这个集成文档中看到需要的权限刚好覆盖了前面多出来的权限,但是还是有一个SIGNAL_PERSISTENT_PROCESSES不包括,这是干什么的呢?不着急,慢慢看。(百度是发送永久进程信号)
接下来的AoeNetReceiver,BootReceiver,PackageReceiver,SMSDataReceiver,SMSNotifyReceiver,SMSWakeupReceiver,RebindReceiver,BindAoeService,AoeService,NotifyCationReceiver。
好了,至此,所有的内容分析完毕。
那么这个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的几处函数,最终还是没有成功。
我已经精疲力竭了。希望有大神看到之后指点一二。
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|