记一次Andriod的apk逆向

记一次Andriod逆向

前言

之前看安全客的时候,发现有大佬逆向了一个流氓app,觉得反看一手app很有意思,趁着下午空闲,自己也试着研究了一下如何逆向Andriod的App,好不容易挑了个流氓软件,挑去过程请省略。。。

正文

首先介绍一下下面要用到的三款工具

  • apktool作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
  • dex2jar作用:将apk反编译成java源码(classes.dex转化成jar文件)
  • jd-gui : 作用:查看APK中classes.dex转化成出的jar文件,即源码文件

如何使用?

apktool.bat d -f  test.apk test

命令中test.apk指的是要反编译的APK文件全名,test为反编译后资源文件存放的目录名称,即为apktool.bat d -f [apk文件 ] [输出文件夹])

记一次Andriod的apk逆向_第1张图片

这是得到的整个资源文件。

把apk文件重命名为zip文件后,再提取出来,能够得到classes.dex文件,如图:

记一次Andriod的apk逆向_第2张图片

接下里就是使用dex2jar将其转化为jar文件,用法如下:

记一次Andriod的apk逆向_第3张图片

这里参数直接是classes.dex文件即可,这样直接得到了jar文件

最后用jd-gui反编译.jar文件就能看到其源码:

记一次Andriod的apk逆向_第4张图片

接下来就是对这个流氓软件进行分析了:

先从主类MainActivity入手:

记一次Andriod的apk逆向_第5张图片

服务器地址是少不了的,要不然怎么发数据给服务器呢?知道了这个服务器地址,但是挂了。。无语,反查了一波是国内杭州的服务器,并且还有注册公司,端口开了3306和ssh,这里就不爆破端口了,还有宝塔

记一次Andriod的apk逆向_第6张图片

记一次Andriod的apk逆向_第7张图片

既然是流氓软件,那就看实现了哪些功能,不过有一说一,这个实现的功能比起其他流氓软件确实少很多。。。

tools这个package下看到了以下功能,看了一看,最重要的功能就是获取手机通讯录,然后将手机通讯录的信息发送给指定服务器,其他什么获取地理位置啥的api我都没找到。。。

记一次Andriod的apk逆向_第8张图片

还有就是获取文件安装的绝对路径:

记一次Andriod的apk逆向_第9张图片

Mainactivity中我们可以看到这一段:

记一次Andriod的apk逆向_第10张图片

也就是说,设置了webview使用了函数setAllowFileAccess(),通过这个函数使其可以使用file协议,那么就可以通过file协议来读取任意文件,可以说是十分危险,如果此时将Load_URL设置为file:///etc/hosts是可以读取文件的,不过这里加载了如上的地址。

并且我们在这里可以看到:

记一次Andriod的apk逆向_第11张图片

该文件是使用javascript代码编写而成。在该文件中实现了获取用户隐私数据主要代码调用。通过@ReactMethod方式在js文件中调用android原生API代码。实现js与java的交互,这有助于避免被杀毒软件查杀,这点也可以在上图WebView控件之WebSettings中setJavaScriptEnabled(True)得到印证。并且当打开程序时,程序会自动跳转到系统管理应用设置页面:

private void openSetting() {
    Intent intent = new Intent("android.settings.APPLICATION_DETAILS_SETTINGS");
    intent.setData(Uri.fromParts("package", this.main.getPackageName(), null));
    this.main.startActivity(intent);
  }
  
  @JavascriptInterface
  public boolean checkContactPermission() { return (ContextCompat.checkSelfPermission(this.main, "android.permission.READ_CONTACTS") == 0); }
  
  @JavascriptInterface
  public String getContactList() {
    if (ContextCompat.checkSelfPermission(this.main, "android.permission.READ_CONTACTS") != 0) {
      ActivityCompat.requestPermissions(this.main, new String[] { "android.permission.READ_CONTACTS" }, 1);
      return "";
    } 
    ArrayList arrayList = rapid.getBuild().getAllContacts(this.main);
    return (new Gson()).toJson(arrayList);
  }

并且判断是否具有获取通讯录的权限,如果这个时候你手误点允许的话,那么恭喜你,你的通讯录成功被发到了对方服务器上了,最后放一张服务器的后台登录页面,看了下是shiro的框架,指不定反序列化的payload能打通哦~

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UoJSMqq9-1593683489290)(C:\Users\86189\AppData\Roaming\Typora\typora-user-images\image-20200702173634575.png)]

,最后放一张服务器的后台登录页面,看了下是shiro的框架,指不定反序列化的payload能打通哦~

记一次Andriod的apk逆向_第12张图片

你可能感兴趣的:(逆向入门,反编译,android,java)