0x00:写在前面

 一直想入门Android安全,当时是极客大挑战出题的时候,被cx表哥甩锅强行去学了点android的开发,之后慢慢接触,感觉还是挺有意思的。cx表哥说先从逆向分析入门吧,之后可以搞加固/漏洞方向。

这篇文章是在学习蒸米的文章七武器的一个记录。

0x01:

 这次记录的是2014阿里移动挑战赛里的一个简单的cm的分析,主要是native层的调试和对简单反调试的bypass。

因为原来自用的三星放家里了,就只能使用模拟器来搞了,坑还是不少。

  • 本来我是想用Genymotion的,但是这个模拟器是x86构架,IDA的调试的server并没有支持的,只能用Android Studio自带的模拟器。
  • 使用模拟器调试so里的代码时有问题(后面会提到)



对于我这样的新手,我一般会把apk拖进jeb直接分析看看,这个apk的验证是在so中做的验证,所以使用IDA对so做初步的分析。

0x02:

 找到验证的函数



根据以前搞pc端的经验,下一步直接起调试器,对这个函数下断点,单步跟就好了。但是这个程序在IDA attach上之后程序就退出了,需要对JNI_Onload()函数进行调试分析。

根据蒸米的文章,步骤如下

 首先是上传IDA的server到模拟器中,这里我遇到了一个问题



提示只读,对应的解决方法是

root@generic:/ # umount /
root@generic:/ # mount -o remount rw /

之后再上传运行就可以啦。

然后,需要端口转发 adb forward tcp:23946 tcp:23946;一般IDA去attach的时候这个函数早就执行过了,所以需要调试JNI_Onload();因为需要用到jdb,所以需要打开ddms。

之后再使用adb以调试的模式启动程序adb shell am start -D -n com.yaotong.crackme/.MainActivity



IDA里attach



设置调试选项后F9



此时使用jdb工具恢复程序 jdb.exe -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

然后对含有验证算法的so的JNI_Onload()方法下断点,F9,就断下来了。

0x03:

 使用IDA调试方便在于,使用P将代码块识别成函数后,可以直接F5。单步执行到



之后,就跑飞了,应该是有反调试,F7进去看看是什么反调试。



应该是创建子进程去检测有没有调试器了。 so中的反调试策略应该和linux那些差不多,这个so中的检测方式是,打开/proc/[pid]/status文件,检测tracerpid的值是不是0。

那么对应的策略有两种,要么调试的时候动态改寄存器,或者改跳;或者一劳永逸,直接patch掉这个so。在分析了这个so反调试所在的函数后,我选择后种方案



死循环调用来检测调试,还是patch来的方便些。

  • 在调试的时候我遇到这样一个问题,F7/F8都没法执行下去。

  • 问了cx表哥后,表哥说这是模拟器才有的问题...在出问题的代码上下断,然后F9过去就好了。

    这样的确可以解决问题,但是在调试的时候遇到好几次这样的问题,每次遇到了都要全部重新来过,太麻烦了,还是真机调试好QAQ

0x04:

patch这个so的时候,蒸米使用的那个IDA的插件我没找到,所以我选择反编译这个apk,然后修改了so文件后,重打包签名弄回去 =。=



修改0x16B8处的指令就好了,这里采用蒸米的方案,使用movs r0,r0作为NOP指令。

修改后使用apktools打包回去,再使用签名工具签名就好了。再次安装已经patch好的apk,重复之前调试的步骤,这次对Java_com_yaotong_crackme_MainActivity_securityCheck方法下断点,

回到模拟器里随便输入点什么,按下输入密码按钮,IDA里就断下来了,就可以愉快的单步调试了。



双开IDA可以辅助分析,这个地方就是加密的字符串所在的地址



点进去之后查看



再查看这个地址



aiyou,bucuoo

这应该就是flag了

0x04:

 第一次调试native层的东西,还是学到了不少,也遇到了这样那样的小问题,不过还是完成了。

0x05:

参考

安卓动态调试七种武器之孔雀翎 – Ida Pro

[Android]第一个cm调试分析的更多相关文章

  1. android学习十一 高级调试分析功能

    1.debug 功能列表 2.ddms功能( 内存检查,线程检查,视图层次分析) 3.跟踪代码 TraceView 4.命令行工具 adb 5.策略检查StrictMode

  2. Android:日常学习笔记(2)——分析第一个Android应用程序

    Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...

  3. [转]Android逆向之动态调试总结

    一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...

  4. Android系统自带APP分析——短信app

    Android操作系统本身就是一个巨大的开源软件仓库,熟悉它既可以了解到Android系统的设计框架,也可以获得高效的应用程序编写方式.本文所分析的源码来自于Google官方的AOSP源码4.0.1_ ...

  5. [安卓][转]Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  6. Android eclipse中程序调试

    一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...

  7. Android Studio xcode单步调试 WebRTC Android & iOS

    mac环境 如何在 Android Studio 里单步调试 WebRTC Android 的 native 代码. WebRTC 代码下载 depot tools 是 chromium 代码库管理工 ...

  8. Anroid逆向学习从编写so到静动态调试分析arm的一次总结

    Anroid逆向学习从编写so到静动态调试分析arm的一次总结 一.前言 最近跟着教我兄弟学逆向这篇教程学习Android逆向,在第七课后作业反复折腾了好几天,正好在折腾的时候对前面的学习总结一波,动 ...

  9. Gradle之Android Gradle Plugin 主要 Task 分析(三)

    [Android 修炼手册]Gradle 篇 -- Android Gradle Plugin 主要 Task 分析 预备知识 理解 gradle 的基本开发 了解 gradle task 和 plu ...

随机推荐

  1. #import "msado15.dll" no_namespace rename("EOF","adoEOF")

    引入动态链接库msado15.dll的信息, no_namespace--无命名空间 rename(“EOF”,“adoEOF”)--把文件结束符“EOF”,更换成“adoEOF”

  2. django 聚合统计查询

    from django.shortcuts import renderfrom django.http import HttpResponsefrom django.db.models import ...

  3. 拨开Python迷雾

    Python方向及能力要求   web就业方向:Python基础.Python高级.前端开发. web开发爬虫方向:Python基础.Python高级.前端开发.web开发. 爬虫开发数据挖掘/分析方 ...

  4. PHP 协程:Go + Chan + Defer

    Swoole4为PHP语言提供了强大的CSP协程编程模式.底层提供了3个关键词,可以方便地实现各类功能. Swoole4提供的PHP协程语法借鉴自Golang,在此向GO开发组致敬 PHP+Swool ...

  5. Jmeter之Linux安装(Xshell),分布式运行Linux作为slave机

    甲方爸爸要求,用Linux压测......   所以在公司服务器Linux上搭建Jmeter 但实际一个Jmeter程序也有程序瓶颈~ 所以在Jmeter瓶颈下,搭建分布式压测系统.(也许可以尝试在一 ...

  6. 深入理解计算机系统 第十一章 网络编程 part1 第二遍

    客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的.采用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成.服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服 ...

  7. 【weixin】微信h5支付

    一.使用场景 H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付. 主要用于触屏版的手机浏览器请求微信支付的场景.可以方便 ...

  8. (四)创建基于maven的javaFX+springboot项目,用户界面与后台逻辑分离方式

    下面来介绍创建maven的javaFX+springboot项目,基于用户界面与后天逻辑分离的方式,用户界面使用fxml文件来常见,类似于jsp,可以引入css文件修饰界面 maven依赖 <d ...

  9. Python习题之快乐的数字

    快乐的数字 描述 编写一个算法来确定一个数字是否“快乐”. 快乐的数字按照如下方式确定:从一个正整数开始,用其每位数的平方之和取代该数,并重复这个过程,直到最后数字要么收敛等于1且一直等于1,要么将无 ...

  10. Docker安装&java-Zookeeper进行操作

    Docker安装Zookeeper下载Zookeeper镜像 docker pull zookeeper 启动容器并添加映射 docker run --privileged=: -d zookeepe ...