2019-08-09 14:53:04 PLA12147111 阅读数 331

1.在IDA/dbgsrv目录下找到android_server文件,将该文件放入手机/模拟器/data/local/tmp目录下

发送文件操作命令:

adb push android_server /data/local/tmp

 

2. 控制台输入 adb shell su 命令获取管理员权限

 

 

3.cd /data/local/tmp 进入android_server目录 ,输入chmod 777 android_server命令获取执行权限 

 

 

4. ./android_server启动android_server 

 

 

5. 重新打开一个CMD窗口,输入adb forward tcp:23946 tcp:23946   命令 端口转发

 

 

6. 再次打开一个新CMD窗口,打开app,输入命令:adb shell dumpsys activity top 复制App应用包名Activity,复制完后关闭模拟器中的app

 

 

7.adb shell am start -D -n  包名/activity路径   重新启动应用 

adb shell am start -D -n com.qianyu.helloworld/.LoginActivity 

 

启动后界面是这样子的

 

 

8.打开DDMS,查看运行的app的端口信息

(1) 

 

(2) 记住8606这个端口号

 

9.打开IDA, 选择菜单:debugger->attach->Remote ARM Linux/android debugger

(1) 

  

(2) 

 

(3) 

(4) 

(5) 

(6) 稍等片刻会弹出此窗口

 (7)设置试选项

 (8)注意此步骤必须等待调试界面加载完成后才可勾选,否则无效

(9)ok后,点击F9

 10.用jdb将app恢复执行,8606是刚才DDMS上面的那个端口号

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

 

11.回到IDA,打开Module list窗口

 

 

12. 执行 调试

(1) 如图表为绿色,继续点击F9

 

(2) 出现此窗口点击取消,继续F9,直到你想要的so文件加载出来

(3) 

 (4)多次点击F9,在so文件被触发加载进来后会在modules查看到,双击进去,找到JNI_Onload

 (5)双击进去可跳转到JNI_Onload函数代码位置

 

 (6)

 

13.接下来就可以进行调试了(F7步入 F8步过)

 

2015-10-19 16:14:17 QQ1084283172 阅读数 5794

Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下。

 

IDA 6.6新添加了对dex文件的调试支持,但是功能还是很弱的说,因为IDA动态调试Android程序的DEX文件时,查看变量很不方便,可以说然并卵。

 

@根据android的官方文档,如果要调试一个App里面的dex代码,必须满足以下两个条件中的任何一个:
1.App的AndroidManifest.xm中Application标签必选包含属性android:debuggable="true"
2./default.propro.debuggable的值为1;


由于正常的软件发布时都不会把android:debuggable设置为true,所以要达成条件1,需要对app进行重新打包,这不仅每次分析一个App都重复操作,而且很多软件会对自身进行校验,重打包后执行会被检测到,所以想办法满足第2个条件是个一劳永逸的办法,我实际使用的方法就是满足第二个条件。

由于default.prop是保存在boot.img的ramdisk中,这部分每次重新启动都会重新从rom中加载,所以要到目的必须修改boot.img中的ramdisk重新刷到设备中

测试使用的设备为Nexus 7,修改步骤如下:
a)  从Google官方网站下载到boot.img,
b)  使用工具(abootimg,gunzip, cpio)把boot.img完全解开,获取到default.prop
c)  修改default.prop
d)  把修改后的文件重新打包成boot_new.img

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




图1 修改后的default.prop内容

说明:上面这段话引用自http://bbs.pediy.com/showthread.php?p=1291716大神的。

 

其实,对于第2个条件有一个简单的方法,在网上找个靠谱的刷机助手软件,然后下载刷机助手中提供的供开发者使用的ROM版本,刷到Android的测试手机上就可以了。博主就是这么做的,之前费了好大的劲从网上找教程,但是由于Linux系统不熟悉,尝试几次都失败了,后来就是用这个办法解决问题的。因此,博主的Nexus 4手机的/default.propro.debuggable的值为1,符合Android程序的DEX文件的被动态调试的条件。


工具:

谷歌Nexus 4

IDA Pro 6.6

Eclipse

 

0x1,将Nexus 4手机开启开发者USB调试模式连接到电脑上。连接成功以后,打开Eclipse程序,查看Nexus 4手机的设备序号,如图:




从图中,可以得知Nexus 4手机的设备序号为03aae257437d8244,将这个设备序号记下来,后面调试Android程序的DEX文件时要用到,然后关闭Eclipse程序

 

0x2,Cmd命令行情况下,安装要调试的apk程序到手机上。




0x3,IDA 6.6的设置。

1.用IDA 6.6打开apk文件,选择dex文件进行加载;

2.设置debugger选项,Debugger->Debugger options->Set specific options按如下图所示进行设置,然后确定返回;

Debugger->Process Options其他默认不变,端口这里改为8700

3.找到在感兴趣的函数要下断点的位置,光标移到要下断点的那一行,按F2下断点;












4.选中IDA Pro 6.6窗口,按F9运行,如果出现下图的画面并且手机屏幕出现"Waiting For Debugger"界面就说明设置成功,可以进行动态调试了。




注意:如果运行过程中一直显示下图所示窗口,就需要关注一下手机上的屏幕界面,看是否是需要与用户进行交互了。




5.当IDA中断在了我们设置断点的地方,这时选中ida->debugger->use source level debugging(源码水平调试),然后点击ida->debugger->debugger windows->locals打开局部变量窗口,就可以产看变量的值了。尽管如此,IDA动态调试Android程序的Dex文件时,变量的查看不是很方便。




说了那多,IDA调试Android程序的DEX文件就是这么简单。

 

参考博文的网址:

http://bbs.pediy.com/showthread.php?p=1291716

http://www.cnblogs.com/goodhacker/p/4257433.html

http://drops.wooyun.org/?p=5942&preview=true



文档的下载的地址:http://download.csdn.net/detail/qq1084283172/9201921




2016-01-27 10:36:17 bupt073114 阅读数 824
做一个动态调试Android应用的笔记,以备后患。

工具IDA6.6破解版,小米3手机开发板(可以root)。

 

步骤:

1.      在IDA里面找到dbgsrv文件夹中找到android_server,push到手机中

adb push android_server /data/data/as

2.      修改权限

Adb shell

Chmod 777 /data/data/as

 

3.      运行调试的程序TestMoni,点击开始模拟

4.      然后在手机中

Adb shell

Cd /data/data/

./as

出现如下视图


5.      然后另外开一个cmd


6.      然后IDA->debugger->attach



选择


然后点击ctrl+s调出so库,选择mylib.so


程序跳到了mylib.so的入口


然后双开IDA,打开mylib.so。找到他的export导出表


点进去看这个函数的地址是0004FCA0

刚才动态调试的mylib.so的入口地址是76883000

两个地址加起来就是函数地址,调出计算器计算0004FCA0+76883000=768D2CA0

然后点jump_toaddress


输入地址768D2CA0

就跳到了调试的函数的地址了

然后在这里加断点

然后点左上角那个运行按钮

再点程序开始模拟,断点就停到了这里。




2018-07-14 19:37:07 qfanmingyiq 阅读数 832

本文采用过时apktool动态调试功能.请采用apktool2.10以下版本(高版本废弃,后面第二篇文章在讲新方法).


目录


工具:

  1. apktool2.10
  2. Android studio 3.0.1(下文简写AS)
  3. Android studio自带的模拟器 (android 7.1版本)
  4. signapk.jar或者jarsigner.exe(mac或linux忽略后缀)
  5. 当然还有电脑一台
  6. Eclipse 用来写一个旧程序 因为apktool太久了

备注
apk签名方式有两种,一种是用 signapk.jar或者jarsigner.jar
signapk.jar 是android 自带的,此jar位于Android源码的\prebuilts\sdk\tools\lib下,
jarsigner.exe 是jdk自带的工具默认位于Jdk安装目录下的bin下.作者目录如下(C:\Program Files\Java\jdk1.8.0_161\bin)

apk签名知识储备:

其实我们用AS或者eclipse签名都是用以下方式,只是做了一层封装.

signapk.jar签名方式:

java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk

cert.x509.pem:证书包含公钥信息
private.pk8 私钥

我们平常可以用android studio生成或者用keytool工具生成一个叫xxx.keystore的文件.这个文件可以转化为pem文件和pk8文件(参考地址:android默认签名文件转化为pem和pk8).

这里我们用android系统默认给我们的pempk8即可(testkey.pk8testkey.x509.pem),系统默认的这两文件位于Android源码的\build\target\product\security

jarsigner.exe签名方式:

这个方法可以直接用keytool或者AS或者Eclipse工具生成的keystrore文件

jarsigner -verbose -keystore 签名文件路径 -signedjar apk 签名之后存放路径 未签名的apk文件路径 签名包的别称

或者直接在dos界面输入jarsigner查看帮助文档

关于v1 v2签名方式,请参阅以下文章

https://blog.csdn.net/qq_32115439/article/details/55520012

用Eclipse编写一个程序:

MainActivity.java

//MainActivity.java
package com.example.demo;

public class MainActivity extends ActionBarActivity {
     private TextView tx;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

        }

        public void onClick(View view) {
            tx = (TextView) findViewById(R.id.et);

            Toast.makeText(this, tx.getText().toString(), Toast.LENGTH_SHORT).show();
        }
}

界面

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.demo.MainActivity" >

  <EditText 
      android:id="@+id/et"
    android:layout_width="300dp"
    android:layout_height="wrap_content"

      />

  <Button 
      android:layout_below="@+id/et"
      android:layout_width="200dp"
      android:text="土司"
      android:onClick="onClick"
      android:layout_height="wrap_content"
      />

</RelativeLayout>

对应视图:
这里写图片描述

apktools反编译:

资源文件更新(可跳过此步,有问题回过头来看看)

这里我们需要更新处理一下apktools的资源版本过低问题.
什么是资源版本?
答:在你编译某个Android 项目你会用Android某个版本的资源图片等.这些资源我们在
做逆向的时候是需要的.那么这个资源你可以从一部Android手机系统下的/system/framework/framework-res.apk导出.
为什么要更新?
假设你的apk用到android7.1的一些系统资源,而我们本地没有.

这里你可以用AS的文件管理器来帮助我们导出一个模拟器这个文件.

这里写图片描述

如何更新到apktool?

java -jar apktool if framework-res.apk

此时会将这个文件的资源更新到 你C:\Users\你的系统用户名\apktool\framework\1.apk

注意更新资源文件 需要你反编译的apk对应,我这里apk只用用到Api25的资源,所以用Api25的模拟器的资源文件

这里写图片描述

反编译

我们先来看看apktools有哪些命令参数
这里写图片描述

其中少了 -d 选项.这里我补充下:-d 选项反编译的时候开启调试(debug) .加上后生成的smali文件有一点点区别,是允许我们将反编译的文件进行debug.

这里我们将前面写的Demo程序编译生成apk.名字为app-debug.apk

输入以下命令

java -jar apktools.jar d -d -o 反编译输出目录  需要反编译的apk路径 

如下:
这里写图片描述

tip:
不需要debug可以去掉-d 如:java -jar apktools.jar d -o 反编译输出目录 需要反编译的apk路径

修改文件使得其支持调试

我们打开输出目录如下图:

这里写图片描述

修改清单文件(AndroidManifest.xml)

我们用记事本(或者其他文本编辑器如Vim)打开.在application标签添加属性android:debuggable="true"
如下图:
这里写图片描述

扩展知识:
有人问我打开默认就有android:debuggable="true" 那么不用改,是因为你在用AS的时候Build Variants 下选择moudle对应变量为 debug. 然后直接点击AS菜单栏的build->build Apk(s) 此时清单文件会自动加上此标签属性.如果选择build->generate signed apk自动为release版本,也就是会自动android:debuggable="false"
这里写图片描述

修改启动类(Launch Activity)

本文的启动类为MainActivity.java
打开输出目录下smali下对应的包下的类

//MainActivity.java
package com.xiaomishangc.fmy.myapplication; class MainActivity { void a() { int a;
a=0;// .class public Lcom/xiaomishangc/fmy/myapplication/MainActivity;
a=0;// .super Landroid/support/v7/app/AppCompatActivity;
a=0;// .source "MainActivity.java"
a=0;// 
a=0;// 
a=0;// # instance fields
a=0;// .field private tx:Landroid/widget/TextView;
a=0;// 
a=0;// 
a=0;// # direct methods
a=0;// .method public constructor <init>()V
a=0;//     .locals 0
a=0;// 
a=0;//     .prologue
a=0;//     .line 9
a=0;//     invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V
a=0;// 
a=0;//     #p0=(Reference,Lcom/xiaomishangc/fmy/myapplication/MainActivity;);
a=0;//     return-void
a=0;// .end method
a=0;// 
a=0;// 
a=0;// # virtual methods
a=0;// .method public onClick(Landroid/view/View;)V
a=0;//     .locals 2
a=0;//     .param p1, "view"    # Landroid/view/View;
a=0;// 
a=0;//     .prologue
a=0;//     .line 23
a=0;//     const v0, 0x7f070029
a=0;// 
a=0;//     #v0=(Integer);
a=0;//     invoke-virtual {p0, v0}, Lcom/xiaomishangc/fmy/myapplication/MainActivity;->findViewById(I)Landroid/view/View;
a=0;// 
a=0;//     move-result-object v0
a=0;// 
a=0;//     #v0=(Reference,Landroid/view/View;);
a=0;//     check-cast v0, Landroid/widget/TextView;
a=0;// 
a=0;//     iput-object v0, p0, Lcom/xiaomishangc/fmy/myapplication/MainActivity;->tx:Landroid/widget/TextView;
a=0;// 
a=0;//     .line 25
a=0;//     iget-object v0, p0, Lcom/xiaomishangc/fmy/myapplication/MainActivity;->tx:Landroid/widget/TextView;
a=0;// 
a=0;//     invoke-virtual {v0}, Landroid/widget/TextView;->getText()Ljava/lang/CharSequence;
a=0;// 
a=0;//     move-result-object v0
a=0;// 
a=0;//     invoke-interface {v0}, Ljava/lang/CharSequence;->toString()Ljava/lang/String;
a=0;// 
a=0;//     move-result-object v0
a=0;// 
a=0;//     const/4 v1, 0x0
a=0;// 
a=0;//     #v1=(Null);
a=0;//     invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
a=0;// 
a=0;//     move-result-object v0
a=0;// 
a=0;//     invoke-virtual {v0}, Landroid/widget/Toast;->show()V
a=0;// 
a=0;//     .line 26
a=0;//     return-void
a=0;// .end method
a=0;// 
a=0;// .method protected onCreate(Landroid/os/Bundle;)V
a=0;//     .locals 1
a=0;//     .param p1, "savedInstanceState"    # Landroid/os/Bundle;
a=0;// 
a=0;//     .prologue
a=0;//     .line 15
a=0;//     invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
a=0;// 
a=0;//     .line 16
a=0;//     const v0, 0x7f09001a
a=0;// 
a=0;//     #v0=(Integer);
a=0;//     invoke-virtual {p0, v0}, Lcom/xiaomishangc/fmy/myapplication/MainActivity;->setContentView(I)V
a=0;// 
a=0;//     .line 17
a=0;//     invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
a=0;// 
a=0;//     .line 20
a=0;//     return-void
a=0;// .end method
}}

上面就是smali语法,先不用管为什么格式有什么每行a=0.
直接在onCreate方法插入以下smali代码

a=0//    invoke-static {}, Landroid/os/Debug;->waitForDebugger()V

这里写图片描述

invoke-static {}, Landroid/os/Debug;->waitForDebugger()V对应java代码如下

//此方法会阻塞线程,一直到debuger(调试器)连接
        android.os.Debug.waitForDebugger();

知识扩展:
此步骤的用意是在用apktool回编译成apk的时候 ,apk一启动就自动等debuger连接,而不是马上运行.
当然我们也有其他方法让一个apk运行的时候等候一个调试器连接,否则进行阻塞操作.
使用如下命令

adb shell am start -n "apk应用名/启动类全类名" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D

如本用例可以用如下命令

adb shell am start -n "com.xiaomishangc.fmy.myapplication/com.xiaomishangc.fmy.myapplication.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D

后者其是AS调试使用的方法.

apktool进行回编译成apk

命令如下

java -jar apktools.jar -b -d -o 输出目录 反编译的时候的目录

本例子

java -jar "E:\反编译\新建文件夹\jarutil\apktool_2.0.3.jar" b -d  "C:\Users\fmy\Desktop\逆向apk\Demoout" -o"C:\Users\fmy\Desktop\逆向apk\Demo.apk"

给生成的apk签名

signapk.jar签名方式:

java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk

这一步大家自己尝试吧 我就不截图了

安装对应模拟器即可

注意本Demo 运行版本在2.2-4.4之间,请用低版本模拟器,或者用夜神模拟器也行.android 5 以下模拟器可正常调试.
安装打开应用,你会发现应用卡在白屏.表示正在等候连接调试器.
我们打开ddms
这里写图片描述

然后把鼠标放在调试的应用上,会自动为应用打开8700调试端口
这里写图片描述

打开AS打开 反编译的输出目录
这里写图片描述

开始设置AS远程调试的配置
这里写图片描述

这里写图片描述
这里写图片描述

然后点击debug按钮即可
这里写图片描述

后面不用再说了吧

介绍几个命令

//查看正在可以调试app端口
adb jdwp
其中$PID为要调程序的进程号。
adb -d forward tcp:8700 jdwp:$PID

使用本地端口号连接到终端的给定进程:
adb forward tcp:xxx jdwp:<pid>

具体可以参考 https://www.cnblogs.com/chyl411/archive/2014/06/14/3788504.html

总结:
旧版动态调试 ,请用eclipse编写程序.否则apktool有问题

2017-06-22 18:12:09 wonderdaydream 阅读数 172

前言:2014-10-14记录在hi baidu上,现在移过来

(1)./android_server(su权限执行android_server,有些反调试会检测android_server)

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

(3)adb shell am start -D -n {packagename/mainActiviyName}(包名/最先启动的Activity)

    adb shell am start -D -n com.example.dexloader/.MainActiviy

(4)IDA 附加调试 F9运行 此时状态Running

(5)打开DDMS(以便执行jdb命令)

(6)jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8888(适用于Windows)

注意事项:

1:执行android_server需su权限

2:打开DDMS

3:注意IDA Debug options { Suspend on thread exit/start Suspend on library load/upload}

没有更多推荐了,返回首页