安卓动态调节八种武器之孔雀翎

我们精晓so文件在被加载的时候会首先执行.init_array中的函数,然后再履行JNI_OnLoad()函数。JNI_Onload()函数因为有号子表所以非凡不难找到,不过.init_array里的函数要求本人去找一下。首先打开view
->Open
subviews->Segments。然后点击.init.array就可以看到.init_array中的函数了。

安卓动态调节多种武器之孔雀翎
– Ida Pro

葡京娱乐注册 1

小编:蒸米@Ali聚安全

葡京娱乐注册 2

 

葡京娱乐注册 3

0x00 序

乘势活动安全尤为火,各个调节工具也都见惯不惊,但因为环境和急需的差别,并没有工具是全能的。此外工具是死的,人是活的,假设能搞懂工具的原理再组成上小编的阅历,你也能够制造出属于本身的调节武器。因而,我将会在这一密密麻麻小说中分享部分自身平日用或原创的调剂工具以及手段,希望能对国内移动安全的钻研起到一些催化剂的功力。

 

目录如下:

安卓动态调节八种武器之长生剑 –
Smali
Instrumentation

安卓动态调节四种武器之孔雀翎 –
Ida Pro

安卓动态调节和测试二种武器之离别钩 –
Hooking

安卓动态调节和测试二种武器之碧玉刀-
Customized DVM

安卓动态调节八种武器之多情环-
Customized Kernel

安卓动态调节多样武器之霸王枪 –
Anti Anti-debugging

安卓动态调节和测试各种武器之拳头

  • Tricks & Summary

 

但一般当大家采纳ida举办attach的时候,.init_array和JNI_Onload()早已经履行实现了,根本来不急调节和测试。那时候大家可以运用jdb那一个工具来解决,那一个工具是设置完jdk现在自带的,能够在jdk的bin目录下找到。在此处我们使用Ali移动安全挑战赛二〇一四的第①题作为例子讲解一下哪些调节JNI_OnLoad()。

0x01 孔雀翎

普天之下的暗器共有三百六十余种,但当中最成功、最可怕的就是孔雀翎。它应用简单,却威力无边。传闻,孔雀翎发动之时,暗器四射,有如孔雀开屏,辉煌灿烂,而就在仇人目眩神迷之际,便已湿魂洛魄。那武器的叙说与Ida是多么的貌似啊!所以说安卓动态调节多种武器中的孔雀翎非Ida莫属。因为Ida太资深了,相应的学科也是全体飞,但许多并不是安卓相关的剧情,所以作者决定将有个别经典的安卓调节和测试技巧总括总结一下。因为篇幅原因,作者并不能保障本文可以覆盖到ida调节和测试的漫天,看官如有兴趣能够再持续深入研究学习。

 

开辟程序后,界面是如此的:

0x02 还原JNI函数方法名

在android调节和测试中,你会平常看到这体系型的函数:

葡京娱乐注册 4

 

第壹是三个指针加上两个数字,比如v3+676。然后将以此地方作为二个方法指针举办艺术调用,并且第二个参数就是指针自个儿,比如(v3+676)(v3…)。那实质上正是大家在JNI里时不时选取的JNIEnv方法。因为Ida并不会活动的对那个方法举办鉴定分别,所以当大家对so文件举行调节和测试的时候时不时会面到却搞不清楚那一个函数毕竟在干什么,因为那几个函数实在是太肤浅了。解决方法非凡不难,只须求对JNIEnv指针做3个类型转换即可。比如说上边提到v3指针,大家选中后按一下”y”键,然后将项目注明为”JNIEnv*”。

葡京娱乐注册 5

 

随后IDA就会自动寻找对应的章程并且突显出来了:

葡京娱乐注册 6

 

是还是不是一下子清楚了成都百货上千?其它有人(
貌似是看雪论坛上的)还总结了富有JNIEnv方法对应的数字,地址以及艺术评释:

葡京娱乐注册 7

有趣味的同学能够去作者的github下载。

 

葡京娱乐注册 8

0x03 调试.init_array和JNI_OnLoad

大家驾驭so文件在被加载的时候会首先执行.init_array中的函数,然后再实施JNI_OnLoad()函数。JNI_Onload()函数因为有记号表所以分外简单找到,但是.init_array里的函数要求协调去找一下。首先打开view
->Open
subviews->Segments。然后点击.init.array就能够看到.init_array中的函数了。

葡京娱乐注册 9

葡京娱乐注册 10

葡京娱乐注册 11

 

但貌似当大家使用ida进行attach的时候,.init_array和JNI_Onload()早已经实施实现了,根本来不急调节和测试。那时候我们能够使用jdb那些工具来消除,这几个工具是设置完jdk以往自带的,能够在jdk的bin目录下找到。在那边我们采纳阿里移动安全挑衅赛2016的第3题作为例子讲解一下什么样调节JNI_OnLoad()。

 

开拓程序后,界面是那样的:

葡京娱乐注册 12

 

我们的目的就是收获到密码。使用ida反编写翻译一下so文件汇合到大家输入后的密码会和off_628c这些指针指向的字符串举办相比。

葡京娱乐注册 13

 

于是大家查阅off_628c那个地址对应的指针,发现对应的字符串是”wojiushidaan”。

葡京娱乐注册 14

葡京娱乐注册 15

 

于是乎大家把那些密码输入一下,发现密码错误。看样子so文件在加载的时候对密码字符串进行了动态修改。既然动态修改了那大家用ida动态调节一下好了,大家打开程序,然后再用ida
attach一下,发现先后直接闪退了,ida那边也从未别的有用音讯。原来那正是自虐程序的趣味啊。既然如此大家动态调节一下JNI_OnLoad()来看一下程序终究做了如何呢。步骤如下:

 

1 ddms

毫无疑问要打开ddms,否则调节和测试端口是关门的,就不能够在程序刚初步的刹车了。小编前边不精通要开拓ddms才能用jdb,还以为android系统恐怕sdk出标题了,重装好三遍。汗。

 

2 adb push androidserver
/data/local/tmp/

 

adb shell
su
chmod 777 /data/local/tmp/androidserver
/data/local/tmp/androidserver

那边大家把ida的androidserver
push到手机上,并以root身份实施。

 

3 adb forward tcp:23946
tcp:23946

将ida的调剂端口举行转账,那样pc端的ida才能连续手机。

 

4 adb shell am start -D
-n com.yaotong.crackme/.MainActivity

此间我们以debug方式运行程序。程序会现出waiting
for debugger的调节界面。

葡京娱乐注册 16

 

5 ida attach target
app

此刻咱们运维ida并attach这几个app的经过。

 

6 suspend on libary
loading

大家在debugger setup里勾选
suspend on library load。然后点击继续。

葡京娱乐注册 17

 

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

用jdb将app复苏执行。

 

8 add breakpoint at
JNI_OnLoad

随即程序会在加载libcrackme.so那个so文件的时候停住。那时候ida会油不过生找不到文件的提示,不用管她,点收回即可。随后就能在modules中看出libcrackme.so那么些so文件了,我们点进入,然后在JNI_OnLoad处下个断点,然后点击执行,程序就进来了JNI_OnLoad()那一个函数。

PS:有时候你明白在三个函数中却无所适从F5,那时候你要求先按一下”p”键,程序会将这段代码作为函数分析,然后再按一下”F5”,你就能够看到反汇编的函数了。

因为经过有点麻烦,小编摄像了三个调剂JNI_OnLoad()的录像在本人的github,有趣味的同班能够去下载阅览。因为关乎到别的的技术,我们将会在跟着的”ida双开定位”章节中一连上课怎么样调节和测试.init_array中的函数。

 

小编们的靶子正是得到到密码。使用ida反编写翻译一下so文件会面到大家输入后的密码会和off_628c这么些指针指向的字符串举办比较。

0x04 Ida双开定位

Ida双开定位的情致是先用ida静态分析so文件,然后再开八个ida动态调节和测试so文件。因为在动态调节中ida并不会对全体动态加载的so文件实行详尽的解析,所以广大函数并不恐怕辨认出来。比如静态分析中有不少的sub_XXXX函数:

葡京娱乐注册 18

 

但动态调节中的ida是从未有过那么些消息的。

葡京娱乐注册 19

 

故而我们需求双开ida,然后通过ida静态分析的剧情来稳定ida动态调节和测试的函数。当然很多时候我们也急需动态调节和测试的音讯来援助理解静态分析的函数。

在上一节中,大家提到.init.array中有个sub_2378(),但当ida动态加载so后我们并无法在module中找到这么些函数。那该咋做呢?这时候大家就要通过静态分析的地址和so文件在内部存款和储蓄器中的基址来定位指标函数。首先大家看到sub_2378()那几个函数在静态分析中的地址为.text:00002378。而在动态加载中这些so在内部存款和储蓄器中的基址为:4004F000。

葡京娱乐注册 20

 

因此sub_2378()那几个函数在内存中真正的地点应该为4004F000

  • 00002378
    =40051378。上面大家在动态调节和测试窗口输入”g”,跳转到40051378这么些地址。然后发现全是乱码的韵律:

葡京娱乐注册 21

 

并非顾虑,那是因为ida认为那里是数据段。那时候我们假诺按”P”只怕选中部分数据按”c”,ida就会把那段数据当成汇编代码进行分析了:

葡京娱乐注册 22

 

作者们随后还足以按”F5”,将汇编代码反编写翻译为c语言。

葡京娱乐注册 23

 

是还是不是和静态分析中的sub_2378()长的大半?

葡京娱乐注册 24

我们随后可以在那么些职责参预断点,再组成上一节提到的调剂技巧就能够对init.array中的函数举行动态调节和测试了。

咱俩接下去继续分析自笔者虐待程序那道题,当我们在对init.array和JNI_OnLoad()实行调节的时候,发现先后在履行完dowrd_400552B4()后就挂掉了。

葡京娱乐注册 25

 

于是大家在此处按”F7”进入函数看一下:

葡京娱乐注册 26

 

原来是libc.so的phread_create()函数,估量是app本人开了二个新的线程进行反调节和测试检查和测试了。

有意思的是在静态分析中大家并不明了dword_葡京娱乐注册,62B4以此函数是做什么样的,因为这些函数的地方在.bss段还没有被开首化:

葡京娱乐注册 27

葡京娱乐注册 28

 

只是当我们动态调节和测试的时候,这些地方的值已经修改为了phread_create()这些函数的地方了。:

葡京娱乐注册 29

葡京娱乐注册 30

 

于是说自作者毁灭程序密码这些app会用pthread_create()开一个新的线程对app进行反调节和测试检查和测试。线程会运维sub_16Levin()这么些函数。于是我们对那几个函数进行分析,发现其间的始末有大气的混淆,看起来特别老大难。那里本人介绍个小trick:常见的反调节和测试方法都会用fopen打开一些文本来检查和测试本人的进度是不是被attach,比如说status那么些文件中的tracerpid的值是或不是为0,假使为0表明没有其他进程在调节这么些历程,假设不为0表达井井有条在调节和测试。所以我们得以墨守成规,在libc.so中的fopen()处下叁个断点,然后我们在hex
view窗口中设置数据与Tiggo0的值同步:

葡京娱乐注册 31

 

那样的话,当函数在fopen处停住的时候我们就能看到程序打开了哪些文件。果不其然,程序打开了/proc/[pid]/status那个文件。我们”F8”继续执行fopen函数,看看再次回到后的地点在哪。然后发现大家程序卡在了有些函数中间,PC上边都是数据,PC下面才是汇编。那该如何做呢?

葡京娱乐注册 32

 

消除办法依然ida双开,大家领会今后PC的地方为40050420,libcrackme.so文件的基址为4004F000。因而那段代码在so中的地点应该是:40050420

  • 4004F000 =
    1420。因此大家回来ida静态分析界面,就能够固定到大家实际是在sub_130C()那些函数中。于是我们怀疑那么些函数正是用来做反调节和测试检查和测试的。

葡京娱乐注册 33

 

故而我们得以经过基址来稳定sub_130C()那个函数在内部存储器中的地址:40050420

  • 130C = 4005030C。然后大家在4005030C这么些地方处按”P”,
    ida就能够正确的鉴定分别整个函数了。

葡京娱乐注册 34

 

据此说动态调节和测试的时候能够帮我们询问到无数静态分析很难取获得的新闻。那也正是ida双开的意义所在:静态帮衬动态定位函数地址,动态帮衬静态获取运营时音信。

 

葡京娱乐注册 35

0x05 Ida动态修改内部存储器多少和寄存器数值

作者们后续分析自残程序密码这几个app,大家发现该程序会用fopen
()打开/proc/[pid]/status这么些文件,随后会用fgets()和strstr()来博取,于是大家在strstr()处下个断点,然后让hex
view的数据与R0同步。每回点击继续,大家都汇合到strstr传入的参数。当传入的参数变为TracerPid:XXXX的时候我们停一下。因为在健康状态下,TracerPid的值应该是0。不过当被调剂的时候就会成为调节和测试器的pid。

葡京娱乐注册 36

葡京娱乐注册 37

 

为了避防万一程序意识大家在调节,在此间大家要求把值改回0。我们在hex
view的2那边点击右键,然后选用edit。随后我们输入30和00,再点击”apply
changes”。就足以把TracerPid改为0了。然后就能够bypass那三次的反调节和测试的检查和测试。

葡京娱乐注册 38

 

但以此顺序检查和测试TracerPid的次数分外频仍,我们要不断的修改TracerPid的值才行,那种格局其实有些治标不治本,所以我们会在下一节介绍patch
so文件的点子来消除那么些标题。

别的在ida动态调节进度中,除了内部存款和储蓄器中的数据足以修改,寄存器的数据也是能够动态修改的。比如说程序执行到CMP
纳瓦拉6,
#0。本来RAV46的值是0,经过比较后,程序会跳转到4082A3FC这几个地点。

葡京娱乐注册 39

 

可是只要大家在PC执行到4082A1F8那条语句的时候,将悍马H26的值动态修改为0。程序就不会开始展览跳转了。

葡京娱乐注册 40

葡京娱乐注册 41

 

你还能够修改PC寄存器的值来支配程序跳转到任何想要跳转到的职位,几乎和ROP的法则一样。但记得要留心栈平衡等难点。

葡京娱乐注册 42

 

于是乎大家查阅off_628c这几个地址对应的指针,发现对应的字符串是”wojiushidaan”。

0x06 Patch so文件

在上文中,我们经过分析稳定到sub_130C()那一个函数有十分的大或然是用来做反调节和测试检查和测试的,并且我开了2个新的线程,并且用了2个while来不断实施sub_130C()那一个函数,所以说小编们每一回手动的改动TracerPid实在是不具体。

葡京娱乐注册 43

 

既是大家何不把sub_130C()这一个函数给nop掉呢?为了以免万一nop出错,我们先在”F5”界面选取具有代码,然后用”Copy
to assembly”成效,就足以把c语言代码注释到汇编代码里。

葡京娱乐注册 44

葡京娱乐注册 45

 

在此地我们看看假使想要注释掉sub_130C()函数,只需求注释掉000016B8那几个岗位上的代码即可,若是大家想要注释掉dword_62B0(3)这么些函数,大家则供给注释掉000016BC-000016C4那多个职位上的代码。接下来大家选中000016B8这一行,然后再点击HexView。HexView会帮大家机关定位到000016B8以此职务。

葡京娱乐注册 46

 

因为AOdysseyM是没有独自的NOP指令的。于是我们运用movs
r0,r0作为NOP。对应的机器码为”00 00 A0 E1”。所以我们把”13 FF FF
EB”这段内容改动为”00 00 A0 E1”。

葡京娱乐注册 47

 

小编们再回”F5”界面,就会发现sub_130C()函数已经远非了。

葡京娱乐注册 48

 

终极大家点击”艾德it->Plugins->modifyfile”,然后就足以保留新的so文件了。大家将以此so文件覆盖原apk中的so文件,然后再重新签名。

葡京娱乐注册 49

 

这一次我们先运维程序,再用ida加载,app并不曾闪退,表明大家patch成功了。于是我们先在”Java_com_yaotong_crackme_MainActivity_securityCheck”处下断点。然后在app随便输入叁个密码,点击app上的”输入密码”按钮。

葡京娱乐注册 50

 

先后就会停顿在”Java_com_yaotong_crackme_MainActivity_securityCheck”处。大家先按”P”再按”F5”,就足以见到反汇编的c语言了。而那里的unk_4005228C正是保存了密码字符串指针的指针。

葡京娱乐注册 51

 

因为是指针的指针,所以大家先双击进入这一个地址。

葡京娱乐注册 52

 

接下来在那么些地址上按三下”D”,将那里的多寡格式从字符转化为指针方式。

葡京娱乐注册 53

 

然后大家再双击进入那一个地方,就能够看到最后的flag了。答案是”aiyou,bucuoo”。

葡京娱乐注册 54

 

那道题里大家只是接纳了极粗略的patch
so技巧,在实战中大家不但能够NOP,大家还足以转移规则判断语句,比如将”BNE”变为”
BEQ”。大家依然足以修改跳转地址,比如直接让程序B到某些地方去履行,那样的话就不必要各种的NOP很多语句了。要小心的是,A君越M中的跳转指令是基于相对地址总计的,所以您要依据近来命令地址和对象位置来计量出相对跳转的值。

比如说00001BCC: BEQ
loc_1C28对应的汇编代码为”15 00 00 0A”。

葡京娱乐注册 55

葡京娱乐注册 56

 

0x0A代表BEQ,”15 00
00”代表跳转的相对地址,因为在arm中pc的值是方今命令的下两条(下一条的下一条)指令的地址,所以大家要求将0x15再添加2。随后就足以测算出终极跳转到的地点:
(0x15 + 0x2)*4 + 0x1BCC = 0x1C28。Ida反汇编后的结果也证实了结果是BEQ
loc_1C28。

接下去大家想修改汇编代码为00001BCC:
BNE loc_1C2C。只必要将”0A”变成”1A”,将”15”变成”16”即可。

葡京娱乐注册 57

葡京娱乐注册 58

 

0x0A代表BEQ,”15 00
00”代表跳转的相对地址,因为在arm中pc的值是近来命令的下两条(下一条的下一条)指令的地方,所以大家要求将0x15再加上2。随后就能够总括出终极跳转到的地点:
(0x15 + 0x2)*4 + 0x1BCC = 0x1C28。Ida反汇编后的结果也证实了结果是BEQ
loc_1C28。

接下去大家想修改汇编代码为00001BCC:
BNE loc_1C2C。只须求将”0A”变成”1A”,将”15”变成”16”即可。

 

葡京娱乐注册 59

0x07 Kill调节和测试技巧

该技术是Q伊芙r
在《MSC的伪解题报告》中关系的。利用kill大家得以让程序挂起,然后用ida挂载上来,获取有效的新闻,然后能够再用kill将次第复苏运行。大家依然拿自残程序密码这几个利用举例,具体执行方式如下:

 

1
首先用ps获取运营的app的pid。

葡京娱乐注册 60

 

2 然后用kill -19 [pid]
就足以将以此app挂起了。

葡京娱乐注册 61

 

3 随后大家用ida
attach上这几个app。因为任何进度都挂起了,所以这一次ida挂载后app并不曾闪退。然后就足以在内部存储器中找到答案了。

葡京娱乐注册 62

 

4
假若想要复苏app的运营,必要将ida退出,然后再采纳kill -18
[pid]即可。

葡京娱乐注册 63

 

葡京娱乐注册 64

0x08 在内部存款和储蓄器中dump Dex文件

在最近的运动安全条件中,程序加壳已经变为日常便饭了,若是不会脱壳几乎无法在破解界混的旋律。ZJDroid作为一种万能脱壳器是10分好用的,不过当笔者公开宣布那一个项目后就遭逢了各类加壳器的针对性,比如说抢占ZJDroid的播放接收器让ZJDroid无法吸收接纳命令等。大家也会在”安卓动态调节八种武器之多情环

  • Customized
    DVM”那篇小说中介绍另一种架构的全能脱壳器。但工具就是工具,当大家发布的时候恐怕也会遭到近乎ZJDroid这样的对准。所以说手动脱壳那项技术仍旧需要学习的。在这一节中咱们会介绍一下最基本的内部存款和储蓄器dump流程。在随后的稿子中我们会介绍越来越多的技能。

那里大家拿alictf20第114中学的apk300作为例子来介绍一下ida脱简单壳的基本流程。
首先大家用调节和测试JNI_OnLoad的技巧将次第在运营前挂起:

 

adb shell am start -D -n com.ali.tg.testapp/.MainActivity

 

![enter image description
here][59]

下一场在libdvm.so中的dvmDexFileOpenPartial函数上下3个断点:

葡京娱乐注册 65

 

接下来大家点击继续运营,程序就会在dvmDexFileOpenPartial()这些函数处暂停,君越0寄存器指向的地方正是dex文件在内部存款和储蓄器中的地址,Wrangler1寄存器就是dex文件的高低:

葡京娱乐注册 66

葡京娱乐注册 67

 

接下来我们就足以选取ida的script
command去dump内存中的dex文件了。

葡京娱乐注册 68

葡京娱乐注册 69

葡京娱乐注册 70

Dump完dex文件后,大家就足以用baksmali来反编写翻译这几个dex文件了。

葡京娱乐注册 71

 

因为经过有点麻烦,作者录像了三个dump
dex文件的录像在本身的github,有趣味的校友能够去下载观察。

本来那只是最简便易行脱壳方法,很多高级壳会动态修改dex的结构体,比如将codeoffset指向内部存储器中的别的地点,那样的话你dump出来的dex文件其实是不完全的,因为代码段保存在了内部存储器中的别的岗位。但你不要顾虑,大家会在随着的小说中牵线一种非凡不难的化解方案,敬请期待。

 

于是大家把那一个密码输入一下,发现密码错误。看样子so文件在加载的时候对密码字符串进行了动态修改。既然动态修改了那大家用ida动态调试一下好了,咱们打开程序,然后再用ida
attach一下,发现先后直接闪退了,ida那边也并未别的有用音信。原来那就是自作者侵凌程序的意思啊。既然如此大家动态调节和测试一下JNI_OnLoad()来看一下顺序毕竟做了哪些吧。步骤如下:

0x09 Function Rewrite函数重写

偶然大家想要将app中的有个别函数的逻辑提取出来,用gcc重新编写翻译1个可执行文件,比如大家想要写3个注册机,就需求把app生成key的逻辑提取出来。不过ida
”F5”过后的c语言直接编写翻译常常会有许多荒谬,比如未定义的宏,未定义的注脚等。那是因为那些宏都在ida的1个头文件里。里面定义了具备ida自定义的宏和证明,比如说平时看到的BYTEn()宏:

葡京娱乐注册 72

 

加上这几个”defs.h”头文件后就足以健康的编写翻译ida
”F5”后的c语言了。

除此以外大家还足以协调创设叁个NDK项目,然后本人编写二个so或然elf利用dlopen()和dlsym()调用指标so中的函数。比如大家想要调用libdvm.so中的dvmGetCurrentJNIMethod()函数,我们就足以在我们的NDK项目中这样写:

葡京娱乐注册 73

 

1 ddms

0x10 小结

抑或那句话,写了这么多照旧无法确定保证本文能够覆盖到ida调节和测试的方方面面,因为ida实在是太源源不断了。看官如有兴趣能够继续深远钻研学习。此外作品中有着关乎的代码和工具都足以在自个儿的github下载到,地址是:https://github.com/zhengmin1989/TheSevenWeapons

 

自然要开拓ddms,不然调节和测试端口是关门的,就不或然在程序刚起先的暂停了。我在此以前不知底要开拓ddms才能用jdb,还以为android系统或许sdk出难题了,重装好四次。汗。

0x11 参考小说

  1. MSC解题报告
    http://bbs.pediy.com/showthread.php?t=197235
  2. 伪·MSC解题报告http://bbs.pediy.com/showthread.php?p=1349632

 

小编:蒸米@Ali聚安全,越来越多Android技术文章,请访问Ali聚安然博客

2 adb push androidserver /data/local/tmp/

adb shell
su
chmod 777 /data/local/tmp/androidserver
/data/local/tmp/androidserver

此地大家把ida的androidserver push到手提式有线电话机上,并以root身份实施。

3 adb forward tcp:23946 tcp:23946

将ida的调节和测试端口进行转向,那样pc端的ida才能三番五次手提式有线电话机。

4 adb shell am start -D -n com.yaotong.crackme/.MainActivity

此处大家以debug方式运转程序。程序会产出waiting for debugger的调节界面。

葡京娱乐注册 74

5 ida attach target app

此刻我们运转ida并attach这么些app的长河。

6 suspend on libary loading

我们在debugger setup里勾选 suspend on library load。然后点击继续。

葡京娱乐注册 75

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

用jdb将app恢复生机执行。

8 add breakpoint at JNI_OnLoad

接着程序会在加载libcrackme.so那些so文件的时候停住。那时候ida会冒出找不到文件的提醒,不用管她,点收回即可。随后就能在modules中看出libcrackme.so这一个so文件了,我们点进入,然后在JNI_OnLoad处下个断点,然后点击执行,程序就进来了JNI_OnLoad()这一个函数。

PS:有时候你驾驭在一个函数中却胸中无数F5,那时候你须要先按一下”p”键,程序会将这段代码作为函数分析,然后再按一下”F5”,你就能够看到反汇编的函数了。

因为经过有点麻烦,笔者录像了贰个调节和测试JNI_OnLoad()的录像在自个儿的github,有趣味的同校能够去下载观察。因为关乎到其余的技术,大家将会在随着的”ida双开定位”章节中持续上课怎样调节和测试.init_array中的函数。