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/105988683
iconst_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的一些结果标签
人的精力真的有限。。。现在我都不想看了。