Dji Mimo APP逆向.3
对jar8的分析

先看结构

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

Android x应该是对实现的包
和注解
什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”
下面随便看个代码,是关于尺寸的
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;}
https://developer.android.google.cn/jetpack/androidx?hl=zh-cn
mimo的实现是很新的
package androidx.activity;
interface Cancellable{ void cancel();}


这个就是兼容的API
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 类型根据数值的取值范围不同,而采用不同的字节码指令。
https://blog.csdn.net/qq_26542493/article/details/105988683iconst_m1 代表 -1 ,
iconst_ 代表 0~5 。
bipush 代表 -128~127(byte取值范围),
sipush 代表 -32768~32767(short取值范围),
ldc 在 int 中代表 -2147483648~2147483647(int取值范围)。
贴个解释看看


反正这个里面就是一些对文件的操作,比如创建文件夹,适配地区代码
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")); }你看这个代码,它在判断什么?
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);
这个是一些关于文字的效果

网络封包

第一包看来一下,是监测性能的
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。

以及下面的安卓浏览器内核,我有空研究下应用层抓包
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的数据库
还可以写数据,真的很不错


中间很多细节,先走马观花的看看
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的一些结果标签
人的精力真的有限。。。现在我都不想看了。
