安卓逆向要学多久(安卓逆向基础)

0x01 activity 跳转

demo还是上一次的demo,这次我们更改一下Button逻辑,改成跳转。

建一个新的Activity

安卓逆向要学多久(安卓逆向基础)(1)

安卓逆向要学多久(安卓逆向基础)(2)

跳转Activity

这里跳转到我们新建的Activity。

使用intent进行跳转,Intent相当于一个载体。

具体代码如下:

Intent i=new Intent(MainActivity.this,Main2Activity.class); startActivity(i);

安卓逆向要学多久(安卓逆向基础)(3)

设置标识

安卓逆向要学多久(安卓逆向基础)(4)

生成apk测试

安卓逆向要学多久(安卓逆向基础)(5)

0x02 Androidmanifest.xml说明

首先来看下Androidmanifest.xml的内容

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hanlei.first_demo"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Main2Activity"></activity> </application> </manifest>

在这里我们可以看到有两个Activity。

如何设置最先启动?

这里有两个Activity,那么app是怎么识别那个是最先启动的Activity呢。

这里我们对比一下两个Activity的区别。

这是第一个Activity

<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

这个是我们的第二个Activity

<activity android:name=".Main2Activity"></activity>

是不是区别很明显,一个有一大堆的内容,一个只有一句话。

所以我们的重点就是:

<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>

很容易就发现是因为这个所以才是最先启动的。

我们来做一个简单的测试。

我们把这个移动一下位置。

现在Androidmanifest,xml是这个样子。

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hanlei.first_demo"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> </activity> <activity android:name=".Main2Activity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

测试

现在我们生成apk。

安卓逆向要学多久(安卓逆向基础)(6)

我们发现,点开之后发现已经不是之前的Activity,而是我们之后自己添加的Activity。

基于这个思路,我们可以想嘛,如果有第三方的Activity注入,我们是不是可以通过改变启动的Activity从而避开一些验证问题。

恩,之后通过实战来进行一个测试。

0x03 反编译

有到了学习smali的时候到了。可能很无聊吧,但是写的人却是很有兴趣呢。

废话不说,开始吧。

1. 丢Android Killer里。

2.找到关键代码

恩。在$2里。

.method public onClick(Landroid/view/View;)V .locals 3 .param p1, "v" # Landroid/view/View; .prologue .line 33 new-instance v0, Landroid/content/Intent; iget-object v1, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity; const-class v2, Lcom/example/hanlei/first_demo/Main2Activity; invoke-direct {v0, v1, v2}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V .line 34 .local v0, "i":Landroid/content/Intent; iget-object v1, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity; invoke-virtual {v1, v0}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent;)V .line 35 return-void .end method

这里我们不一句一句翻译,想看的回去翻之前的内容,很多。

我们来看这里的主要代码:

新建一个 Intent对象

new-instance v0, Landroid/content/Intent;

获取MainActivity对想存储在v1中

iget-object v1, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity;

把Main2Activity存入v2中

const-class v2, Lcom/example/hanlei/first_demo/Main2Activity;

然后把v1和v2放入v0中。

invoke-direct {v0, v1, v2}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

startActivity调用即可。还是很简单的,很容易理解的。

.line 34 .local v0, "i":Landroid/content/Intent; iget-object v1, p0, Lcom/example/hanlei/first_demo/MainActivity$2;->this$0:Lcom/example/hanlei/first_demo/MainActivity; invoke-virtual {v1, v0}, Lcom/example/hanlei/first_demo/MainActivity;->startActivity(Landroid/content/Intent;)V

怎么说呢,smali见过了,虽然不知道什么意思,但是很熟悉,一下子就理解了。恩,语言还是多看看,多分析分析,有好处的。当初学c语言的时候就是,敲了很多行,做了几个项目恩就很熟练了。

0x04 实战分析

样本

样本为了方便我就传在百度云里了

原APK:链接:https:///s/1pMwcuef 密码:a673

试玩

不知道为什么我的夜深模拟器打不开了。试试别的模拟器。

安卓逆向要学多久(安卓逆向基础)(7)

一打开游戏,就弹出个这个界面,很不喜欢,我想直接弹出我的游戏界面。

好,我们用我们刚开始的技能。

1.apk反编译

安卓逆向要学多久(安卓逆向基础)(8)

2.查看Androidmanifest.xml文件

<?xml version="1.0" encoding="utf-8" standalone="no"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.sxiaoao.farm.farmherohx"> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name=""/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.GET_TASKS"/> <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/> <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <application android:icon="@drawable/icon" android:label="美人鱼消消" android:name="com.sxiaoao.farm.farmherohx.CmgameApplication"> <activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:label="美人鱼消消" android:launchMode="singleTask" android:name="MainActivity" android:screenOrientation="sensorPortrait"/> <activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:label="美人鱼消消" android:launchMode="singleTask" android:name="LogActivity" android:screenOrientation="sensorPortrait"/> <activity android:configChanges="keyboard|orientation|screenSize" android:name="cn.cmgame.billing.api.GameOpenActivity" android:screenOrientation="sensorPortrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <category android:name="tv.ouya.intent.category.GAME"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.CHINAMOBILE_OMS_GAME"/> <category android:name="android.intent.category.CHINAMOBILE_GAMES"/> </intent-filter> </activity> <activity android:name="cn.cmgame2_0.launch_model.shortcut.main.MiguHomeActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.Dialog"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="cn.cmgame2_0.category.migu_home"/> </intent-filter> </activity> <service android:name="cn.cmgame.billing.service.GameService"/> <activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:exported="true" android:label="美人鱼消消" android:launchMode="singleTop" android:name="com.sxiaoao.farm.farmherohx.wxapi.WXEntryActivity" android:screenOrientation="sensorPortrait"/> <receiver android:name="com.xiaoao.pay.util.update.UpdataBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/> </intent-filter> </receiver> <meta-data android:name="UMENG_APPKEY" android:value="552f4eeafd98c57677001cb8"/> <meta-data android:name="UMENG_CHANNEL" android:value="8556"/> </application> </manifest>

3.尝试跳转

首先来看下我们的跳转。

<activity android:configChanges="keyboard|orientation|screenSize" android:name="cn.cmgame.billing.api.GameOpenActivity" android:screenOrientation="sensorPortrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <category android:name="tv.ouya.intent.category.GAME"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.CHINAMOBILE_OMS_GAME"/> <category android:name="android.intent.category.CHINAMOBILE_GAMES"/> </intent-filter> </activity>

跳转的Activity名称为:cn.cmgame.billing.api.GameOpenActivity,Gameopen。。。恩,这是什么唉,好奇怪。但是呢,肯定就是我们打开的界面。恩。我觉得这个有点重要,以后可能会涉及到。所以还是找个小本子记下来。我应该建立一个小本子。

我们来看一下我们的Activity。

<activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:label="美人鱼消消" android:launchMode="singleTask" android:name="MainActivity" android:screenOrientation="sensorPortrait"/> <activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:label="美人鱼消消" android:launchMode="singleTask" android:name="LogActivity" android:screenOrientation="sensorPortrait"/>

这里有两个Activity:

第一个Activity的name:android:name="MainActivity"

第二个Activity的name:android:name="LogActivity"

作为开发人员,MainActivity,就是一个开始恩。我们直接开始更改。

<activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:label="美人鱼消消" android:launchMode="singleTask" android:name="MainActivity" android:screenOrientation="sensorPortrait"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <category android:name="tv.ouya.intent.category.GAME"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.CHINAMOBILE_OMS_GAME"/> <category android:name="android.intent.category.CHINAMOBILE_GAMES"/> </intent-filter> </activity>

这个是修改后的Activity。

其实我也只是对

<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>

这两句有了解。但是还有三句是什么,一起来看一下吧。关于测试的问题,我们学习完之后再进行测试吧。

首选是

<category android:name="tv.ouya.intent.category.GAME"/>

国内百度搜不到。

收藏的谷歌镜像掉链子。

bing或许是一个不错的选择。

安卓逆向要学多久(安卓逆向基础)(9)

这个是我找到的结果。

Cortex,ARM公司在经典处理器ARM11以后的产品改用Cortex命名,并分成A、R和M三类,旨在为各种不同的市场提供服务。

For your Cortex app to show up in the PLAY section,这句话的含义就是,在你的ARM app 展现的游戏部分。我用百度翻译 自己瞎编的也不知道对不对哈。

it must have an activity that contains a filter for either。它必须有一个包含过滤器的活动。

说这么多废话。我又不做游戏开发。说不定以后要做,但是现在不做。所以说白了,就是必须的。

其实我之前做了一个错误的测试就是直接把

<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>

这两个直接挪过去,直接失败。所以,还是分析一下吧。

刚才说的

<category android:name="tv.ouya.intent.category.GAME"/>

这句就是必须的。

还有两句

<action android:name="android.intent.action.CHINAMOBILE_OMS_GAME"/> <category android:name="android.intent.category.CHINAMOBILE_GAMES"/>

好了,我们搜一搜,最后发现是:移动基地运营商sdk需要添加所必须的。

好嘛,做测试的时候直接挪过来的。现在我们删了做一下测试吧。

4.测试

测试结果,成功了。不过值得一说的是蓝叠模拟器也掉链子了。还是自己的手机好用啊。成功的跳过了。手机发图好麻烦的,恩,自己做测试吧。

以上。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页