本文涉及到的apk。请在github下载https://github.com/jltxgcy/AliCrack/AliCrackme_2.apk

0x00

怎样在JNI_ONLOAD下断点。參考安卓逆向学习笔记(5) - 在JNI_Onload 函数处下断点避开针对IDA Pro的反调试。最好使用模拟器调试,确保 Attach to process后,相应进程在DDMS中出现小红蜘蛛。

以下将怎样在init_array下断点,首先要找到so的init_array端。把so拖入ida,然后按Crtl+s,会出现该so的全部段。例如以下:

进入.init_array。例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

当中sub_2378就是init_array的代码。

我们在这里下断点,详细调试的步骤和在JNI_ONLOAD下断点调试是一样的。參考安卓逆向学习笔记(5) - 在JNI_Onload 函数处下断点避开针对IDA Pro的反调试。网上有非常多其它方法在init_array下断点。比如Android安全–linker载入so流程。在.init下断点。我还是认为上面的方法比較方便。

调试时使用jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost,有时会报例如以下错误:

此时,我们先观察DDMS。

使用jdb -connect com.sun.jdi.SocketAttach:port=8622,hostname=localhost就可以。

0x01

也讲一下ida静态分析so。

首先列出C++源代码:

#include "com_example_jnidemo_JniGg.h"

int switch1(int a, int b, int i, int j, int k,int q){
char *w = "i am winner in this year";
switch (i){
case 1:
return a + b + j + k;
break;
case 2:
return a - b;
break;
case 3:
return a * b;
break;
case 4:
return a / b;
break;
default:
return a + b;
break;
}
} JNIEXPORT jstring JNICALL Java_com_example_jnidemo_JniGg_ggPrintHello
(JNIEnv * env, jobject this)
{ return (*env)->NewStringUTF(env, "Current Coin is -- "); } JNIEXPORT jint JNICALL Java_com_example_jnidemo_JniGg_getCoin
(JNIEnv * env, jobject this)
{ return switch1(1,2,1,4,5,6); }

编译成so。然后拖进ida进行分析。

.text:00000E38                 EXPORT Java_com_example_jnidemo_JniGg_getCoin
.text:00000E38 Java_com_example_jnidemo_JniGg_getCoin
.text:00000E38
.text:00000E38 var_10 = -0x10
.text:00000E38 var_C = -0xC
.text:00000E38
.text:00000E38 PUSH {LR}
.text:00000E3A SUB SP, SP, #0xC
.text:00000E3C MOVS R3, #5
.text:00000E3E STR R3, [SP,#0x10+var_10]
.text:00000E40 MOVS R3, #6
.text:00000E42 STR R3, [SP,#0x10+var_C]
.text:00000E44 MOVS R0, #1
.text:00000E46 MOVS R1, #2
.text:00000E48 MOVS R2, #1
.text:00000E4A MOVS R3, #4
.text:00000E4C BL switch1
.text:00000E50 ADD SP, SP, #0xC
.text:00000E52 POP {PC}
.text:00000E52 ; End of function Java_com_example_jnidemo_JniGg_getCoin

arm的參数传递规范,和函数中的局部变量定义规范,请參考ARM子函数定义中的參数放入寄存器的规则

这里使用R0,R1。R2,R3来传递前4个參数,使用堆栈来传递后两个參数。

.text:00000DEC
.text:00000DEC EXPORT switch1
.text:00000DEC switch1 ; CODE XREF: Java_com_example_jnidemo_JniGg_getCoin+14p
.text:00000DEC
.text:00000DEC arg_0 = 0
.text:00000DEC
.text:00000DEC PUSH {R4,LR}
.text:00000DEE ; 6: v5 = a3 - 1;
.text:00000DEE SUBS R2, #1
.text:00000DF0 ; 7: v6 = a1;
.text:00000DF0 MOVS R4, R0
.text:00000DF2 ; 8: result = a1 + a2;
.text:00000DF2 ADDS R0, R0, R1
.text:00000DF4 ; 9: if ( (unsigned int)v5 <= 3 )
.text:00000DF4 CMP R2, #3 ; switch 4 cases
.text:00000DF6 BHI def_DFA ; jumptable 00000DFA default case
.text:00000DF8 ; 11: result = v5;
.text:00000DF8 MOVS R0, R2
.text:00000DFA ; 12: switch ( v5 )
.text:00000DFA BL __gnu_thumb1_case_uqi ; switch jump
.text:00000DFA ; ---------------------------------------------------------------------------
.text:00000DFE jpt_DFA DCB 2 ; jump table for switch statement
.text:00000DFF DCB 0xA
.text:00000E00 DCB 7
.text:00000E01 DCB 0xC
.text:00000E02 ; ---------------------------------------------------------------------------
.text:00000E02 ; 15: result = v6 + a2 + a4 + a5;
.text:00000E02
.text:00000E02 loc_E02 ; CODE XREF: switch1+Ej
.text:00000E02 LDR R2, [SP,#8+arg_0] ; jumptable 00000DFA case 0
.text:00000E04 ADDS R4, R4, R1
.text:00000E06 ADDS R3, R4, R3
.text:00000E08 ; 16: break;
.text:00000E08 ADDS R0, R3, R2
.text:00000E0A
.text:00000E0A def_DFA ; CODE XREF: switch1+Aj
.text:00000E0A ; switch1+24j ...
.text:00000E0A POP {R4,PC} ; jumptable 00000DFA default case
.text:00000E0C ; ---------------------------------------------------------------------------
.text:00000E0C ; 18: result = a2 * v6;
.text:00000E0C
.text:00000E0C loc_E0C ; CODE XREF: switch1+Ej
.text:00000E0C MOVS R0, R1 ; jumptable 00000DFA case 2
.text:00000E0E MULS R0, R4
.text:00000E10 ; 19: break;
.text:00000E10 B def_DFA ; jumptable 00000DFA default case
.text:00000E12 ; ---------------------------------------------------------------------------
.text:00000E12 ; 21: result = v6 - a2;
.text:00000E12
.text:00000E12 loc_E12 ; CODE XREF: switch1+Ej
.text:00000E12 SUBS R0, R4, R1 ; jumptable 00000DFA case 1
.text:00000E14 ; 22: break;
.text:00000E14 B def_DFA ; jumptable 00000DFA default case
.text:00000E16 ; ---------------------------------------------------------------------------
.text:00000E16 ; 24: result = v6 / a2;
.text:00000E16
.text:00000E16 loc_E16 ; CODE XREF: switch1+Ej
.text:00000E16 MOVS R0, R4 ; jumptable 00000DFA case 3
.text:00000E18 BLX __divsi3
.text:00000E1C ; 25: break;
.text:00000E1C ; 26: default:
.text:00000E1C B def_DFA ; jumptable 00000DFA default case
.text:00000E1C ; End of function switch1

在这个函数中因为使用了R4作为局部变量,所以在開始时要把R4放入堆栈,为了返回后程序能够继续执行,所以把LR也压入了堆栈。

这样堆栈地址就减去了8个字节(R4,LR都被压入堆栈)。所以取第一个參数要使用指令LDR R2, [SP,#8+arg_0]。

ida动态调试so,在init_array和JNI_ONLOAD处下断点的更多相关文章

  1. 在Android so文件的.init、.init_array上和JNI_OnLoad处下断点

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54233552 移动端Android安全的发展,催生了各种Android加固的诞生, ...

  2. 【转】安卓逆向实践5——IDA动态调试so源码

    之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结. 一. ...

  3. ida动态调试笔记

    ida动态调试笔记 目标文件:阿里安全挑战赛的第二题 点击打开链接 使用环境:ida6.8点击打开链接,adt bundle点击打开链接 首先打开avd安卓模拟器,界面如下: 在dos下运行adb命令 ...

  4. 逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序

    0x00 前言 2017年5月12日全球爆发大规模蠕虫勒索软件WanaCrypt0r感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具 ...

  5. 转:使用IDA动态调试WanaCrypt0r中的tasksche.exe

    逆向分析——使用IDA动态调试WanaCrypt0r中的tasksche.exe 转:http://www.4hou.com/technology/4832.html 2017年5月19日发布 导语: ...

  6. IDA动态调试技术及Dump内存

    IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完 ...

  7. 学汇编的时候可以拿IDA之类的反汇编工具辅助学习,再用gdb或者IDA动态调试,跟踪每条指令的 执行结果。都不难

    作者:潘安仁链接:https://www.zhihu.com/question/40720890/answer/87926792来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  8. IDA动态调试Android的DEX文件

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

  9. IDA 动态调试

    感谢南邮,让我把ida动态调试,给搞定了,困扰了很久,之前下的ubuntu的源,好像有问题,ifconfig这个命令一直装不上,突然想起来了我的服务器很久没用了,重装了下系统,换成ubuntu,这里记 ...

随机推荐

  1. 【智能家居篇】wifi网络结构(上)

    转载请注明出处:http://blog.csdn.net/Righthek 谢谢! WIFI是什么.相信大家都知道,这里就不作说明了. 我们须要做的是深入了解其工作原理,包含软硬件.网络结构等.先说明 ...

  2. 【LeetCode-面试算法经典-Java实现】【056-Merge Intervals(区间合并)】

    [056-Merge Intervals(区间合并)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a collection of intervals, ...

  3. 继承的综合运用《Point类派生出Circle类而且进行各种操作》

    类的组合与继承 (1)先建立一个Point(点)类.包括数据成员x,y(坐标点). (2)以Point为基类.派生出一个Circle(圆)类,添加数据成员(半径),基类的成员表示圆心: (3)编写上述 ...

  4. Gradle:Gradle入门

    一.安装Gradle  1.首先确保你安装的JDK1.5或以上版本号.  C:\Users\chengxiang.peng.QUNARSERVERS>java -version java ver ...

  5. hdu 3697 Selecting courses (暴力+贪心)

    Selecting courses Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 62768/32768 K (Java/Others ...

  6. nginx报 File not found 错误

    原因可能非常多,但对于刚開始学习的人.大部分应该是/etc/nginx/conf.d/default.conf里面的php解析部分配置不正确. 解决的话就是把root定义.在server下加上,这样r ...

  7. FFMpeg在Windows下搭建开发环境【转】

    本文转载自:http://blog.csdn.net/wootengxjj/article/details/51758621 版权声明:本文为博主原创文章,未经博主允许不得转载. FFmpeg 是一个 ...

  8. BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

    BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...

  9. 对于NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解

    一直以来用户对于在选购存储产品上有许多不清楚,市场上有NAS, FC SAN,IP SAN和iSCSCI SAN产品,到底哪种类型的产品更适合支撑企业的应用系统呢? 我们经常可以听到用户讲: “NAS ...

  10. windows bat更改系统时间 & 同步internet时间

    最近刚好用到一款软件学习版,30天试用期满,但是还想继续用,不具体透露是什么软件了. 发现更改了系统时间后,这个软件就又能启动了,不过每次改来改去很麻烦,就写了段脚本 @echo off date 1 ...