android怎么动态调试dex

作者&投稿:嵇咬 (若有异议请与网页底部的电邮联系)
android怎么动态调试dex~

  1.1 安装JDK
  JAVA环境的搭建请自行查找资料,这里不做详述。
  1.2 安装Android SDK
  下载地址:http://developer.android.com/sdk/index.html。
  下载完安装包后解压到任意一目录,然后点击运行SDK Manager.exe,然后选择你需要的版本进行安装,如图:

  1.3 安装Eclipse集成开发环境
  下载地址:http://www.eclipse.org/downloads。选择Eclipse for Mobile Developers,解压到任意目录即可。
  1.4 创建Android Virtual Device
  动态调试可以用真实的手机来做调试环境,也可以用虚拟机来做调试环境,本文采用虚拟机环境。因此创建虚拟机步骤如下:
  1打开Eclipse –>windows->Android Virtual Device

  2点击Create,然后选择各个参数如图:

  这里Target 就是前面步骤中安装的SDK 选择任意你觉得喜欢的版本就可以。点击OK 就创建完毕。
  1.5 安装 APK改之理
  这个是一个很好用的辅助调试的软件,请自行搜索下载。
  1.6 安装 IDA6.6
  IDA6.6开始支持安卓APP指令的调试,现该版本已经提供免费下载安装,请自行搜搜。
  0x02 Dalvik指令动态调试
  2.1 准备工作
  安卓APP应用程序后缀为apk,实际上是一个压缩包,我们把它改后缀为rar打开如图:

  其中classes.dex是应用的主要执行程序,包含着所有Dalvik指令。我们用APK改之理打开apk,软件会自动对其进行反编译。反编译后会有很多smail文件,这些文件保存的就是APP的Dalvik指令。
  在APK改之理里双击打开AndroidManifest.xml,为了让APP可调试,需要在application 标签里添加一句android:debuggable="true" 如图:

  然后点击保存按钮,然后编译生成新的apk文件。接着打开Eclipse –>windows->Android Virtual Device,选择刚才创建的虚拟机,然后点击start,虚拟机便开始运行。偶尔如果Eclipse启动失败,报错,可以同目录下修改配置文件:

  把配置参数原本为512的改为256 原本为1024的改为512,然后再尝试启动。
  在SDK安装目录有个命令行下的调试工具adb shell,本机所在目录为E:\adt-bundle-windows-x86-20140702\sdk\platform-tools,把adb.exe注册到系统环境变量中,打开dos命令行窗口执行adb shell 就可以进入APP命令行调试环境,或者切换到adb所在目录来执行adb shell。

  这里先不进入adb shell,在DOS命令行下执行命令:adb install d:\1.apk 来安装我们刚才重新编译好的APK文件。安装完毕会有成功提示。
  2.2 利用IDA动态调试
  将APP包里的classes.dex解压到任意一目录,然后拖进IDA。等待IDA加载分析完毕,点击Debugger->Debugger Options如图

  按图所示勾选在进程入口挂起,然后点击Set specific options 填入APP包名称和入口activity 如图:

  其中包的名称和入口activity 都可以通过APK改之理里的AndroidManifest.xml 文件获取:

  1
  2
  3
  
  
  
  
  

  然后在IDA点击Debugger->Process Options

  其他默认不变,端口这里改为8700。这里默认端口是23946,我在这里困扰了很久,就是因为这个端口没有改为8700所致。然后我们看看这个8700端口是怎么来的。在Android SDK里提供了一款工具DDMS,用来监视APP的运行状态和结果。在SDK的TOOLS目录有个DDMS.BAT的脚步,运行后就会启动DDMS。由于我的本机安装了SDK的ADT插件,DDMS集成到了Eclips中,打开Eclips->Open perspective->ddms就启动了DDMS。
  如图所示:

  在DDMS选中某个进程后面就会注释出它的调试端口,本机这里是8700。
  到此所有的工作就准备就绪,然后就可以下断点来调试该APP了。我们在APK改之理中在com目录下查看smali文件 发现MainActivity.smali里有一个感兴趣的函数getPwdFromPic(),那么我们就对它下断以跟踪APP的运行。
  在IDA里搜索字符串getPwdFromPic,发现onClick有调用该函数
  我们在onClick 函数开始位置按F2下断如图:

  然后点击上图中绿色三角形按钮启动调试如图:

  调试过程中有一个问题出现了很多次,浪费了我大量的时间,就在写文章的时候,操作时还是遇到了这样的问题。就是点击启动后IDA提示can’t bind socket,琢磨了很久终于找到原因了,当打开过一次DDMS后 每次启动Eclips都会启动DDMS 而8700端口正是被这个DDMS给占用了,然后每次都会启动失败,解决办法就是 虚拟机运行起来后关闭掉Eclips,这时一切就正常了!
  事例中是一个APP crackme 提示输入密码才能进入正确界面。这个时候我们输入123,点击登陆,IDA中断在了我们设置断点的地方,这时选中ida->debugger->use source level debugger,然后点击ida->debugger->debugger windows->locals打开本地变量窗口,如图:

  然后按F7或F8单步跟踪程序流程,同时可以观察到变量值的变化,也可以在IDA右键选择图形视图,可以看到整个APP执行的流程图:

  如上图所示 变量窗口中我们输入了123 被转化成的密码是么广亡,pw变量也显示出了正确的密码,其实这个时候已经很容易判断出正确密码了。
  0x03 Andoid原生动态链接库动态调试
  通常为了加密保护等措施,有时dex执行过程中会调用动态链接库文件,该文件以so为后缀,存在于APP文件包里。

  这里我们以动态附加的方式来调试原生库。
  3.1 准备工作
  1、将IDA->dbgsrv目录下的android_server拷贝到虚拟机里,并赋予可执行权限
  DOS命令分别为:
  adb shell pull d:\ android_server /data/data/sv
adb shell chmod 755 /data/data/sv


  2、启动调试服务器android_server
  命令:adb shell /data/data/sv
  服务器默认监听23946端口。
  3、重新打开DOS窗口进行端口转发,命令:
  adb forward tcp:23946 tcp:23946 如图:

  3.2 利用IDA进行动态调试
  1、虚拟机里启动要调试的APP 2、启动IDA,打开debugger->attach->remote Armlinux/andoid debugger

  端口改为23946 其他保持不变,点击OK

  如上图,选中要调试的APP 的数据包名,然后点击OK。
  正常情况下,IDA会把APP进程挂起。
  3、由于当前程序不是在动态链接库领空,这时我们要重新打开一个IDA,用它打开需要调试的so文件,找到需要下断的位置的文件偏移,并做记录,然后关闭后面打开的这个IDA。
  4、在原IDA界面按下ctrl+s键,找到并找到需要调试的so,同时记录该文件的加载基址。然后点击OK 或者cancel按钮关闭对话框。
  5、按下快捷键G 输入基址+文件偏移所得地址,点击OK 就跳转到SO文件需要下断的地方,这时按下F2键设置断点。当APP执行到此处时便可以断下来。
  3.3 在反调试函数运行前进行动态调试
  程序加载so的时候,会执行JNI_OnLoad函数,做一系列的准备工作。通常反调试函数也会放到JNI_OnLoad函数里。进行4.2中第2步时也许会遇到如下情况:

  这时APP检测到了调试器,会自动退出,那么这时调试策略需要有所改变。
  接着4.1第3步后,在DOS命令行执行命令:
  adb shell am start -D -n com.yaotong.crackme/com.yaotong.crackme.MainActivity


  来以调试模式启动APP 如图:
  com.yaotong.crackme是APP包名称,com.yaotong.crackme.MainActivity是执行入口 这些可以用APK改之理查看。

  这时由于APP还未运行,那么反调试函数也起不了作用,按照4.2中第2步把APP挂起。这时IDA会中断在某个位置

  然后点击debugger->debugger opions设置如下:

  点击OK 后按F9运行APP,然后再DOS命令下执行命令:
  jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700


  这时APP会断下来,然后按照4.2中的3、4、5补找到JNI_OnLoad函数的地址并下断,然后按F9 会中断下来。然后便可以继续动态跟踪调试分析。

1、动态方式破解apk前奏篇(Eclipse动态调试smail源码)
2、动态方式破解apk升级篇(IDA动态调试so源码)
3、动态方式破解apk终极篇(应对加固的apk破解方法)

根据android的官方文档,如果要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:
1.apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
2./default.prop中ro.debuggable的值为1
由于一般软件发布时都会把android:debuggable设置为false,所以要达成条件1需要反编译原apk,修改AndroidManifest.xml并进行重新打包,这样不仅麻烦,而且很多软件进行了加固,要破解很难。所以想办法满足第2个条件是个一劳永逸的办法。
由于default.prop是保存在boot.img的ramdisk中,这部分每次重新启动都会重新从rom中加载,所以要到目的必须修改boot.img中的ramdisk并重新刷到设备中。修改步骤如下:
1.从Google官方网站下载到boot.img

2.使用工具(abootimg,gunzip, cpio)把boot.img完全解开,获取到default.prop

3.修改default.prop

4.把修改后的文件重新打包成boot_new.img

5.使用fastboot工具把boot_new.img刷入设备(fastboot flash boot boot_new.img)

具体可参考: http://www.cnblogs.com/goodhacker/p/4106139.html
由于我们这篇文章的重点是如何动态调试dex代码,所以我们就假设该dex是可调试的。
1.用ida打开apk文件,选择dex文件进行加载
2.设置debugger选项,Debugger->Debugger options->Set specific options,按如图1所示进行设置,然后一路确定返回
3.找到要下断点的位置,光标移到要下断点的那一行,按f2下断点
4.手机开启调试选项,连接到电脑,运行apk
5.选中IDA pro窗口,按f9运行,如果出现如图2的画面,就说明设置成功,可以进行动态调试了。


关于android怎么动态调用资源文件使根据不同的情况选择不同的资源文件...
2、选择 Android Project from Existing Code;3、点击 Next 1、输入 Root Director;2、取消 tests;3、选中 Copy projects into workspace;4、点击 Finish;1、右键工程;2、选择 Android Tools;3、Add Native Support...;点击 Finish 修改android sdk 版本为 4.0.3;关于如何修改 android sdk ...

android progressbar 水平样式怎么开始动
Android ProgressBar 样式大全,包含几乎大部分常用的样式 工具\/原料 Eclipse Android ADT 方法\/步骤 1。普通圆形ProgressBar 该类型进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中。一般只要在XML布局中定义就可以了。 <\/ProgressBar> 此时,没有设置它的风格,...

android设置linearlayout布局的背景颜色,怎么动态改变背景颜色?_百度...
1、开始打开Android IDE,这里以常用的Android Studio软件的3.2版本为例,然后可以新建一个工程项目,也可以使用当前已经存在的工程,点击后等待整个项目加载完毕再进行后续的操作。2、稍等片刻,等待整个项目都加载进内存以及Gradle同步成功,如果不成功请先检查相关配置或者添加国内镜像以及源之后再试一次,...

Android 动画 Lottie 如何使用
Lottie,由Airbnb开源的动画库,为iOS、Android和React Native应用提供了强大的动画解决方案。它能将Adobe After Effects(AE)制作的动画转化为可无缝应用于原生应用的json格式,实现华丽且高效的动画效果。制作过程1. 设计师借助AE,安装名为Bodymovin的插件,创建动画。Windows用户需先下载ExMan Command Line...

Android中如何使用动画实现文字从右边平移过来之后,再往右回退一点,然 ...
可以在布局里面写动画,先是从右往左平移,然后另一个是从左往右平移,可以设置平移的时间。在代码中找到你的textview控件,然后设置textview的动画是你刚刚写的布局里面的动画,再写一句开始动画的代码就可以了。主要就是布局里面写动画的效果,代码里面找到这个动画并且应用到具体的控件。需要代码的话再...

Android开发 在代码中怎么动态改变Button坐标?
上面的示例只是许多动画中的一种简单地位移动画,如果有兴趣可以查阅一下android动画方面的知识 第二种,直接改变控件的位置 这种方法里面也有2种不用的情况 \/\/这是第一种 直接付给此button新的xy坐标button.setX();button.setY();\/\/这是第二种 让button有一个位移到指定地点button.setTranslationX()...

了解一个Android App 是怎么运行工作的
用正确的方式使用,测试可以在对抗零散的安卓的斗争中成为一个有力的工具。一个有效的测试策略的关键之处在于定义手头app的定制测试用例,并定义一个简化测试的工作流程或过程。测试一个移动app是一个重大的挑战,但它可以用一个结构化的方法和正确的工具集合以及专业知识被有效解决掉。 转载仅供参考,...

如何在Android中自定义动画
在Android中自定义动画按照下面的步骤。1、首先定义一个动画,如下图:在上面代码中定义了一个旋转动画,包括了开始旋转角度(0°)和最后旋转结束角度(360°),和相对于自己的位置(控件的中心点)。2、定义动画的简单属性,如下图:上面代码定义了动画的持续时间和结束后书否保持原状。3、选择执行的控件...

Android Activity页面动画跳转(ActivityOptions)
ActivityOptions动画共享组件的方式实现跳转Activity动画 这里的共享组件动画效果是指将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,即在这种过度效果下实现Activity的跳转操作。那么如何实现两个组件View之间实现过渡效果呢?1、在Activity a中的button按钮(或其他)设置android:...

想请教下各位,android动态加载apk的实现方法
回答:其实有一个很实际的问题就是当你重新做一个功能,比你重用一个功能所花的时间更少的情况下那么重用还有价值么,以上出现的情况可说是百分百这个问题我早就想明白了,不过不知道怎么说明白。反正重用就是实验室里的东西不过不重要啦,反正你的问题就是在android里面反编译出xml就好了,如果你非要一条...

万荣县18663113189: android怎么动态调试dex -
官乳加味: 根据android的官方文档,如果要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个: 1.apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true” 2./default.prop中ro.debuggable的值为1 由于一...

万荣县18663113189: 如何利用DexClassLoader动态加载dex文件 -
官乳加味: Java中也有类加载器ClassLoader,其作用是动态装载Class文件,当我们从网络下载Class文件,或者在编译时不参与而在运行时动态调用时就需要用类加载器.由于Android对class文件进行了重新打包和优化,最终APK文件中包含的是dex文件...

万荣县18663113189: IDA怎么调试Android的send函数,求教 -
官乳加味: 安卓手机用ida在apk执行前动态调试其so中的函数 方法11、解包对方APK,插入一个:对应SMALI: android.os.SystemClock.sleep(20000);const-wide/16 v0, 0x2710 #20秒invoke-static {v0, v(X-1)}, Landroid/os/SystemClock;->sleep(J)V这里(X-1)...

万荣县18663113189: 安卓app360加固怎么反编译 -
官乳加味: 1 对比 上传demo进行加固,解包后对比下原包和加固包,发现加固包在assets文件夹下多了libjiagu.so,libjiagu_x86,lib文件夹下多了libjiagu_art.so,同时修改了dex文件和AndroidManifest文件 打开manifest文件,看到xxx加固对Application标签做...

万荣县18663113189: 如何逆向apk加壳之动态加载dex文件 -
官乳加味: 实现的最主要的方法就是利用了dex文件动态加载,将主逻辑的dex文件经过加密隐藏在壳程序的dex中,并在运行时通过so进行解密,并从内存读取dex数据,直接在native层进行一个动态加载.这样的实现有几个关键点:dex文件不存储在设备的物理存储区域而是将文件的数据加密存储在壳程序的dex数据区域(关于dex的结构就在此不再解释);从内存中获取dex数据,动态加载到进程空间中;壳程序的application重定向加载到原程序的application对象.

万荣县18663113189: ida pro 查看android的dex文件怎么看 -
官乳加味: 根据android的官方文档,如果要调试一个App里面的dex代码,必须满足以下两个条件中的任何一个: 1.App的AndroidManifest.xm中Application标签必选包含属性android:debuggable="true"; 2./default.prop中ro.debuggable的值为1...

万荣县18663113189: android studio怎么debug调试 -
官乳加味: Android Studio有两种调试模式可供参考,一个是直接进入调试模式,另一个是进程调试(以下均是android studio的截图) 一、调试模式 二、进程调试 经验:一般来说,当程序一启动等等不好一个界面一个步骤的跟踪的时候,可以采用第一个方式,当只需要调试某一个界面/某一个执行步骤的时候,可以采用第二种方式,当然也可以加上Log日志来配合调试.

万荣县18663113189: android多进程怎么debug -
官乳加味: Debug模式启动1启动Android Studio打开一个demo程序,2点击工具栏的调试按钮或者点击菜单“Run”-“Debug...”,3在”Choose Device“对话框中,选择设备,4设置好断点,然后让应用程序断下来.(注:设置断点的时机可以随便选,只要符合自己的需求就可以了),ENDAttach方式调试点击菜单”Run“-”Attach debuger to Android process“在”Choose Process“对话框中,选择需要attach的进程,3设置好断点,然后让应用程序断下来.

万荣县18663113189: Android ART 无法做到动态加载吗 -
官乳加味: 预编译对于VM的class loader而言可以看作是透明的——仍然可以动态下载dex文件,在装入时发生编译连接,再从生成的OAT里装入类,区别只是这个过程会比较慢.如何获取能够加载的.dex文件 首先我们可以通过JDK的编译命令javac把Java...

万荣县18663113189: 怎么deodex系统软件 -
官乳加味: 一、什么是odex文件?简单来说odex文件是由apk中的classes.dex提取出来,以提前运行,加快软件的运行速度以及系统的开机速度.一般来说,odex化的软件都是位于system/app以及system/framework目录下的系统软件或jar文件.通常,官方...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网