首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Dji Mimo APP逆向.3

Dji Mimo APP逆向.3

作者头像
云深无际
发布2021-05-18 11:26:18
发布2021-05-18 11:26:18
9752
举报
文章被收录于专栏:云深之无迹云深之无迹

对jar8的分析

先看结构

内部有对版本号码的判断,且打印log

Android x应该是对实现的包

和注解

什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”

下面随便看个代码,是关于尺寸的

代码语言:javascript
复制
package androidx.annotation;

import java.lang.annotation.*;

@Retention(RetentionPolicy.CLASS)
@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
public @interface Size {
    long max() default Long.MAX_VALUE;
    
    long min() default Long.MIN_VALUE;
    
    long multiple() default 1L;
    
    long value() default -1L;
}
代码语言:javascript
复制
https://developer.android.google.cn/jetpack/androidx?hl=zh-cn

mimo的实现是很新的

代码语言:javascript
复制
package androidx.activity;

interface Cancellable
{
    void cancel();
}

这个就是兼容的API

代码语言:javascript
复制
https://developer.android.google.cn/jetpack/androidx/releases/appcompat?hl=zh-cn

其实感兴趣的东西,都是在dji这样的东西里面放着

java没捣鼓明白,这是啥,结构和前面的包实现一样

数据类型

我们知道 Java 是强类型语言,在使用之前肯定已经确定了它的类型。而数据类型,无非就是基本数据类型和引用类型。它们对应的字节码,其实就是用它们的对应类型的英文首字母来表示的。(引用类型除外)

例如,s 代表 short , i 代表 int, l 代表 long ,f 代表 float,d 代表 double,b 代表 byte(不包括boolean),c 代表 char,a 代表 reference 引用。

加载和存储指令

我们知道,一个方法的运行,会在栈的栈帧中执行。方法中的变量称为局部变量,数的操作需要用到操作数栈。因此,加载和存储指令,就是数据在局部变量表和操作数栈中来回传输。

将一个局部变量加载到操作数栈:如 iload、iload_ 。表示加载的是 int 类型变量。

iload_ 后边带数字代表第几个 int 型变量。例如 iload_0 代表把第一个 int 型局部变量加载到操作数栈。

其他类型变量同上:lload ,fload ,dload,aload 。

将一个数值存储到局部变量表:istore,istore_,lstore,lstore_,fstore,fstore_,dstore,dstore_,astore,astore_ 。

将一个常量加载到操作数栈:aconst_null,iconst_m1,iconst_,lconst_,fconst_,dconst_ ,bipush,sipush。

ldc 代表把 int、float、String类型常量从常量池中加载到操作数栈。ldc_w 代表宽索引。

ldc2_w 代表把 long 或 double 类型常量从常量池中加载到操作数栈。(宽索引)

这里需要说的是,int 类型根据数值的取值范围不同,而采用不同的字节码指令。

代码语言:javascript
复制
https://blog.csdn.net/qq_26542493/article/details/105988683

iconst_m1 代表 -1 ,

iconst_ 代表 0~5 。

bipush 代表 -128~127(byte取值范围),

sipush 代表 -32768~32767(short取值范围),

ldc 在 int 中代表 -2147483648~2147483647(int取值范围)。

贴个解释看看

反正这个里面就是一些对文件的操作,比如创建文件夹,适配地区代码

代码语言:javascript
复制
public static boolean a() {
        return (new File("/system/bin/su").exists() && 
        b("/system/bin/su")) || 
        (new File("/system/xbin/su").exists() && 
        b("/system/xbin/su"));
    }

你看这个代码,它在判断什么?

代码语言:javascript
复制
 public enum TextEffectType
    {
        A(170), 
        B(181), 
        C(190), 
        D(200), 
        E(211), 
        F(220), 
        G(240), 
        H(250), 
        I(251), 
        J(260), 
        K(270), 
        L(271), 
        M(280), 
        N(281), 
        O(290), 
        P(291), 
        Q(300), 
        R(310), 
        S(320), 
        T(330), 
        U(331), 
        V(350), 
        W(370), 
        X(390), 
        Y(391), 
        Z(401), 
        a(0), 
        aa(410), 
        ab(430), 
        ac(431), 
        ad(440), 
        ae(451), 
        b(10), 
        c(11), 
        d(20), 
        e(21), 
        f(30), 
        g(31), 
        h(40), 
        i(41), 
        j(50), 
        k(51), 
        l(60), 
        m(61), 
        n(70), 
        o(71), 
        p(80), 
        q(81), 
        r(90), 
        s(101), 
        t(110), 
        u(111), 
        v(121), 
        w(130), 
        x(140), 
        y(151), 
        z(160);

这个是一些关于文字的效果

网络封包

第一包看来一下,是监测性能的

代码语言:javascript
复制

public interface APIService
{
    @GET
    @Streaming
    k<ac> downloadFile(@Url final String p0, @Query("isDownload") final boolean p1);
    
    @GET("api/user/v3/{userId}/info")
    Call<Object> getUserInfo(@Path("userId") final String p0);
    
    @GET("/id={testId}")
    Call<Object> test(@Path("testId") final String p0);
}

这个就有趣了,可以看到是一个下载服务,

逆向嘛,想象力很重要。

那就猜!这个是网络的包里面的,可以看到abc,这些东西没有意义,但是

是继承a的接口,a又是性能测量,所以很自然的想应该是一个性能相关的函数

所以,和我没有什么锤子事

从这里其实可以证实猜测

继续看,看见串了,400。

以及下面的安卓浏览器内核,我有空研究下应用层抓包

代码语言:javascript
复制
package com.dji.network.d;

import android.content.*;
import android.database.sqlite.*;

public class d extends SQLiteOpenHelper
{
    public d(final Context context) {
        super(context, "download.db", (SQLiteDatabase$CursorFactory)null, 1);
    }
    
    public void onCreate(final SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("create table download_info(_id integer PRIMARY KEY AUTOINCREMENT, start_pos integer, end_pos integer, compelete_size integer,url char)");
    }
    
    public void onUpgrade(final SQLiteDatabase sqLiteDatabase, final int n, final int n2) {
    }
}

是和数据库相关的操作,可以创建一个SQL的数据库

还可以写数据,真的很不错

中间很多细节,先走马观花的看看

代码语言:javascript
复制
package com.dji.qsmcl;

public final class BuildConfig
{
    public static final String APPLICATION_ID = "com.dji.qsmcl";
    public static final String BUILD_TYPE = "release";
    public static final boolean DEBUG = false;
    public static final String FLAVOR = "";
    public static final int VERSION_CODE = 1;
    public static final String VERSION_NAME = "1.0";
}

这个是关于ML的一些结果标签


人的精力真的有限。。。现在我都不想看了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档