Android 逆向初探

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 逆向初探相关的知识,希望对你有一定的参考价值。

一、对android app进行分析时, 需要对其进行动态调试。

1、IDA 附加进行调试

将ida目录中的android_server push到安卓手机上

adb push android_server /data/local/tmp

1)、执行android_server:

adb shell /data/local/tmp/android_server

2)、端口转发:

adb forward tcp:23946 tcp:23946

3)、调试模式启动程序,手机界面会出现Waiting For Debugger页面

ddms

adb shell am start -D -n 包名/类名

4)、打开32位的IDA,IDA附加并设置调试选项

GO -> Debugger -> Remote ARMLinux/Android debugger

 技术分享

Debugger — Debugger Options

 技术分享

 5)命令行中执行: 

ddms(为了使用jdb命令)

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 

其中port=8700是从ddms中看到的。

 6)、下断点

附加完成之后,会停在so模块中。此时按下Ctrl + S,弹出模块列表框,搜索so文件名。

记录下基地址。要下断点的函数加上ida静态分析时的偏移地址,得到内存中的地址,G跳转到该函数处,F2下断点。

7)、 F9运行

8)、 断下

使用F8进行单步调试,F7进行单步跳入调试。

2、dd命令直接dump内存中so的数据

1)、运行app

2)、将内存里的数据拷贝出来。

adb shell

su

ps | grep com.tyomcat.crackme  获取so的进程ID

cat /proc/(PID)/maps | grep libcrackme.so 获取so在内存中的基地址

dd if=/proc/(PID)/mem of=/sdcard/1.mem bs=1 skip=(so的基地址)  count=(so文件大小)

adb pull /sdcard/1.mem  

3、用kill命令杀死进程

1)、执行android_server:adb shell /data/local/tmp/android_server

2)、端口转发adb forward tcp:23946 tcp:23946

3)、运行程序

4)、ps 获取pid

5)、命令:kill -19 <pid>   可以让进程暂停

6)、IDA附加,动态调试。

二、反调试技术

1、循环检测TracePid的值,如果为0,那么代表app进程在被trace,那么就直接停止退出程序。

  IDA是使用android_server在root环境下注入到被调试的进程中,那么这里用到一个技术就是Linux中的ptrace,那么Android中如果一个进程被另外一个进程ptrace了之后,在他的status文件中有一个字段:TracerPid 可以标识是被哪个进程trace了,我们可以使用命令查看我们的被调试的进行信息。

cat /proc/(PID)/status

2、执行jdb命令时报错

技术分享

无法连接到目标的VM,那么这种问题大部分都出现在被调试程序不可调试,在AndroidManifest.xml添加android:debuggable属性:

技术分享

回编译:java -jar apktool.jar b -d out -o debug.apk

签名apk:java -jar .\\sign\\signapk.jar .\\sign\\testkey.x509.pem .\\sign\\testkey.pk8 debug.apk debug.sig.apk

 

以上是关于Android 逆向初探的主要内容,如果未能解决你的问题,请参考以下文章

第一个Android crackme(2016-05)

Android逆向系列文章— Android基础逆向

Android逆向-Android基础逆向(2-2)

Android 逆向Android 逆向用途 | Android 逆向原理

Android软件安全与逆向分析的Android术语

Android WMS动画系统初探(一)