安卓逆向——某力播逆向分析(脱壳)

44 篇文章 3 订阅
30 篇文章 22 订阅

安卓逆向——某力播逆向分析(脱壳)

 

一、环境

这一步真的头疼,环境很重要,各种测试,一下是我测试的环境,由于没有真机,就拿虚拟机做测试

1.  Xposed       2. FDex2         3. fiddler     4. 软件 

 

二、抓包

通过 fiddler 抓包分析参数

可以看到,俩次请求的参数, udid 是一样,可以不用变,timestamp 应该是个时间戳,signature 可以经过某种变化的,也是主要分析的

三、脱壳

1、查看加固  

首先对apk进行反编译

# 首先对apk进行反编译
apktool d com.iCitySuzhou.suzhou_8.2.apk

进入到反编译后的文件夹

进入到反编译后的文件夹
cd com.iCitySuzhou.suzhou_8.2

查看lib文件夹下的so文件

.
├── libBugly.so
├── libYLEncode.so
├── libjcore110.so
├── liblbs.so
├── liblocSDK6a.so
├── libshella-2.9.0.2.so
├── libshellx-2.9.0.2.so
├── mix.dex
└── mixz.dex

如何确认是什么加固呢? 不同的加固厂商有不同的加固特征, 查看lib下的so文件libshella这个就是 乐加固 的特征,可以直接百度搜索一下, 不知道如何确认 就把每个文件都在百度搜索一下。

2、进行脱壳

通过上一步我们知道了该App为乐加固, 现在我们通过FDex2来进行脱壳, 打开我们已经安装好的FDex2

             

点击引力播

            

将这几个文件 使用adb pull 拉取到本地 

使用jadx把这几个文件打开看下, 看看哪个是我们所需要的脱壳后的文件,

经过验证com.iCitySuzhou.suzhou0015542488.dex

这个就是我们脱壳后所需要的文件。 脱壳成功

四、signature分析

1、定位signature

全局搜索signature

可以看到很多结果,这个就需要自己一个一个去看看,去找到正确的,

可以看到这里,应该可以看出是个赋值的操作吧,点进去

我这里用了反混淆,更好的分析代码,不然搜索一下出现很多不太好分析,找到 那个方法 鼠标右击 跳转申明 (跳到申明函数的地方)

(这里反混淆,只是吧方法或者变量变成 唯一的好查找而已,工具----》反混淆)

m12059a(udid, valueOf)  这里传了俩个参数,应该udid 应该获取的设备号,valueOf 是获取的时间戳

这里 signature 参数方法,在 跳转声明 到下面这个地方,这里应该是调用了什么 MD5 的加密方法

通过 上面应该函数的 参数,进行 MD5 加密  在经过 字节偏移 得到的值

这里 有俩种方法,1.  自己 重写 signature算法    2. 复制 原来的 java 代码

我用 第二种方法吧,

1.   复制 java代码,保持为 java 文件 

2.   编译Java成class javac MySig.java

2.   把class文件打包成jar包   jar  cvf  (新jar的名字)  (.class文件,多个则中间用空格隔开)  

         如: jar  cvf  test.jar test.class  test2.class

3.   python 来执行 jar 包 ,jpype 包,,用 pip install jpype1 安装

5.  撸代码

把 3个 signature ,timestamp,udid 参数配置好就可以模拟请求了。代码如下

from jpype import  *
import time
import requests

uuid = 'IMEI860000000065903-IMSI460001993232212'
# udid = "IMEI867686021698806-IMSI460NNNNNNNNNNNN"

str_2 = str(int(time.time()))
str_1 = "f1190aca-d08e-4041-8666-29931cd89dde"

str_sign = "%s&&%s&&%s"%(uuid,str_2,str_1)

def Getsignature(str_sign):
    jvm_path = getDefaultJVMPath()

    jar_path = 'F:\\mysig.jar'   # jar包路径
    startJVM(jvm_path, '-ea', '-Djava.class.path=%s' % jar_path)     # 启动虚拟机
    JClass2 = JClass('mysig')
    instance = JClass2()
    sum = str(instance.get_sign(str_sign))
    print(type(sum),str(sum))
    print(type(str(sum)),str(sum))

    # shutdownGuiEnvironment()
    # shutdownJVM()
    return sum

def GetDate(signature):
    Headers = {
        'sys': 'Android',
        'sysVersion': '6.0.1',
        'appVersion': '8.2',
        'appVersionCode': '54',
        'udid': uuid,
        'clientType': 'android',
        'timestamp': str_2,
        'signature': signature,
        'Host': 'app.suzhou-news.cn',
        'Connection': 'Keep-Alive',
        'Accept-Encoding': 'gzip',
        'User-Agent': 'okhttp/3.9.0',
    }

    for i in range(1,100):
        Url = 'https://app.suzhou-news.cn/api/v1/appNews/getBannerNewsList7?page={}&bannerID=11 '.format(i)
        res = requests.get(Url,headers=Headers, verify=False)
        print('弟 %s 页'%(i),res.json())

 模拟请求了100页,下面是 运行的结果,

 

作者 源代码  下载

 

补充 :

环境要慢慢测试,模拟器很多问题,建议真机,最好 Android 6 ,以下是我测试过的环境

        

 

总结:

安卓逆向,目前只是用工具脱壳,分析源代码,简单的案例,找到对应的参数,然后模拟请求,难点在于环境准备和脱壳工具的使用,后面才是分析代码和逻辑。

问题:

   1.  如果脱壳工具不能脱壳,怎么搞?

   2.  关联性强的话,代码不能复制一小段,引用文件麻烦,导入第三方包的问题 

 

小生入门,还请大佬指导。

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.含笑.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值