Android-查找讯飞输入法下载的离线资源02

目标

找到跟离线包相关的所有下载的文件

结果

  1. 下载的是个zip,解压之后是两个so。这个就是它下载的所有东西了。
  2. 下面是截取的下载地址:

http://183.91.33.82/download.voicecloud.cn/ygxt/20161025/c8f798bb-f87d-4860-a6b9-3f64275af70d.zip

1
07-03 19:12:56.533 17441-18271/com.iflytek.inputmethod.assist D/iFlyIME_Network: [970] alm.a: HTTP response for request=<[ ] http://download.voicecloud.cn/ygxt/20161025/c8f798bb-f87d-4860-a6b9-3f64275af70d.zip 0xade53710 NORMAL null> [lifetime=22703], [size=null], [rc=200], [retryCount=0]
  1. 下载的zip文件会先放在sd的IflyIme下的download文件夹下面,之后才会放到之前找到的隐藏目录下。
1
7-03 19:12:56.533 17441-17441/com.iflytek.inputmethod.assist D/DownloadHandleManager: onFinish filename : /storage/emulated/0/iFlyIME/Download/c8f798bb-f87d-4860-a6b9-3f64275af70d.zip

实验成功过程

  1. 修改smali文件(Logging.smali)
  2. 新建一个injectLog.smali文件添加到工程中,通过python脚本给downLoad下所有的smali文件的每个方法添加输出日志。可以看到方法调用的顺序。参考https://blog.csdn.net/charlessimonyi/article/details/52027563
  3. 重新打包
  4. 重新签名
  5. 安装
  6. 查看assist进程下的日志,可以看到下载进度,完成之后可以看到下载路径。且下载的zip包跟提示消耗的流量一致,进一步可以确认下载的只有这两个so文件。

反编译思路

  1. 利用dex2jar+jd-gui 获取class文件
  2. 利用apkTool获取smali文件跟资源文件
  3. 利用log注入给指定包名下的smali文件中的方法注入log:参考https://blog.csdn.net/charlessimonyi/article/details/52027563
  4. 触发关注的事件,观察log,找出相关的类,阅读java代码
  5. 在对应的smali文件中加断点调试代码 参考:https://kbjay.github.io/2018/06/29/Android-%E5%8F%8D%E7%BC%96%E8%AF%91%E8%B0%83%E8%AF%95smali%E6%96%87%E4%BB%B6/

ps

在查找关键词的过程中发现了Aitakl5.class,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class Aitalk5
{
...

private static native int JniAddLexiconItem(String paramString, int paramInt);

private static native int JniAddLexiconItemPhoneme(String paramString1, String paramString2, int paramInt);

private static native int JniAppendData(byte[] paramArrayOfByte, int paramInt);

private static native int JniBeginLexicon(String paramString);

private static native int JniBuildGrammar(byte[] paramArrayOfByte, int paramInt);

private static native int JniCreate(String paramString, int paramInt);

private static native int JniDestroy();

private static native int JniEndData();

private static native int JniEndLexicon(String paramString);

private static native int JniGetConfidence(int paramInt);

private static native int JniGetEngineState();

private static native int JniGetItemId(int paramInt1, int paramInt2, int paramInt3);

private static native int JniGetItemNumber(int paramInt1, int paramInt2);

private static native String JniGetItemText(int paramInt1, int paramInt2, int paramInt3);

private static native int JniGetResCount();

private static native int JniGetSlotConfidence(int paramInt1, int paramInt2);

private static native String JniGetSlotName(int paramInt1, int paramInt2);

private static native int JniGetSlotNumber(int paramInt);

private static native int JniLoadNetwork(String paramString);

private static native int JniOnReadResource(byte[] paramArrayOfByte, int paramInt1, int paramInt2);

private static native int JniRunTask();

private static native int JniSetHotWords(String paramString, String[] paramArrayOfString, int paramInt);

private static native int JniSetParam(int paramInt1, int paramInt2);

private static native void JniStart(String paramString);

private static native int JniStop();

private static native int JniUnLoadNetwork(String paramString);

private static native int JniUpdateGrammar(String paramString);

...
}