吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 14301|回复: 43
收起左侧

[Android 原创] [超级详细]实战分析一个Crackme的过程

  [复制链接]
佚名RJ 发表于 2020-11-27 11:23
本帖最后由 佚名RJ 于 2020-11-27 18:29 编辑

[超级详细]实战分析一个Crackme的过程

一、写在前面

自学这个也有几个星期了,今天就总结一下近期学习的成果,实战分析一个Crackme,并写下了这篇超级详细的过程,从软件环境的配置到软件详细的使用再到最后的逆向分析出结果,为了文章的贴图方便和文章美观展示,用了两台电脑+MUMU模拟器+Google6.0.1版真机,相互切换着截图附在帖子里,也主要是因为模拟器动态调试so加载好像有问题。我是新入门的小白一个,如果文章中出现错误,希望大佬们能及时斧正,以免对其他萌新产生误导。(此文章只发布在吾爱和看雪

二、所用工具

IDA Pro V7.0版jadx 1.2版Android Kill 1.3.1版Google真机 6.0.1版MUMU模拟器 2.4.2版

三、jadx分析AliCrackme

先使用MUMU模拟器打开软件随便输入密码,提示 验证码校验失败

image-20201126091035888.png

将软件拖入jadx去分析一下软件代码的执行流程,直接使用软件的搜索功能,发现只有一条数据并进去看一下。

image-20201126091448792.png

分析一下软件中代码执行密码校验的流程,试图分析出软件的真实的密码

image-20201126092453320.png

经过上图的一些分析步骤之后,我发现软件的真实的密码在crackne.so里面,接下来使用jadx的全部保存(ctrl+s) 并选择保存的位置将so文件提取出来,如下图:

image-20201126093413745.png

四、IDA静态/动态/反反/再动态调试

1.静态分析

接着打开 IDA 点击 NEW 打开libcrackme.so文件,中途出现弹窗一致 ok 即可!

image-20201126093844816.png

直接看到了这里,这个与上面反编译分析的方法名一致,只是前面加入了一些软件包的特征,如下图:

image-20201126094606062.png

汇编不是太方便看,直接使用左边的功能将其转换为 伪C代码 或 直接使用快捷键 F5

image-20201126095122303.png

转换为 伪C代码之后,分析一下代码的执行,点击 v3 通过JNIEnv* 还原类似((_DWORD )v3 + 676))格式的指令,重命名以及注释的方式记录分析,如下图:

image-20201126111445299.png

下面详细的分析一下代码的逻辑,判断出用户输入的密码和软件真实的密码,如下图所示:

image-20201126113149012.png

下面使用Rename lvar或快捷键 N 的方式直接将分析出来的 直接重命名一下,方便以后容易查看,最终如下图:

image-20201126113854403.png

2.动态调试

接下来就是通过动态调试 分析这个so文件的密码了,在动态调试之前我需要配置一些环境,步骤如下:

image-20201126115035387.png

连接MUMU模拟器:adb connect 127.0.0.1:7555          //7555为mumu模拟器端口,其它模拟器百度一下

将文件push 进手机的指定目录下:adb push android_x86_server /data/local/tmp/

进入手机端命令:adb shell

切换获取手机的root权限:su

查找push的文件是否在手机中:cd /data/local/tmp/

查看路径下的文件以及权限:ls -l

拥有root权限更改文件的权限为777:chmod 777 android_x86_server

在手机中启动运行该文件: ./android_x86_server

windows运行 端口转发到PC:adb forward tcp:23946 tcp:23946

image-20201126115833121.png

再开启一个 命令行 做一下端口的转发,如下图所示:

image-20201126122956817.png

全部执行完毕之后,可以看到正在监听这个端口,这时候我们打开 IDA 并且点击GO  然后按照下图选择所使用的

image-20201126122600316.png

并输入 127.0.0.1 后面的端口是默认的,上面的命令也在监听这个端口。

image-20201126122731833.png

找到要动态调试的软件的包名,直接选中,点击 ok 打开即可!

image-20201126123325783.png

打开之后,直接使用下图的方式,或者 快捷键 Ctrl+s 找到到要调试的libcrackme.so文件 带x权限的文件。

image-20201126123906932.png

在所有的so文件中直接使用快捷键Ctrl+f 搜索,并找到 Start地址先执行且有 X(可执行权限) 的 选中点击OK进入,

模拟器的是下图显示的so:

image-20201126124251530.png

这里使用模拟器的话,so文件加载会有一些问题,在这里我改用了Google真机6.0.1版本进行动态调试

真机的是下图显示的so:

1.真机so.png

打开so文件之后我们要定位到要调试函数的一个内存的绝对地址=so文件的基地址+函数的偏移量
2.绝对地址.png

经计算可知,函数的绝对地址就是F49591A8在IDA中 使用快捷键G跳转到地址的位置,也就是要调试的函数位置

3.跳转地址.png

找到函数名之后,鼠标右键 选择 Add breakpoint 或者 直接使用快捷键F2打断点,然后让程序恢复执行,使用快捷键F8往下走。

4.断点调试运行.png

点击 F8 给so文件的函数打断点调试,直接就退出或出现错误弹窗等等!如下图所示:

5.禁止调试报错.png

证明软件有反调试的机制,先看一下软件是通过何种方式反调试的,又是如何检测被调试的呢?

检测是否被调试:利用Linux系统 ptrace 来实现,当应用被调试时应用内存里的TracerPid字段就不为0,只要是不为0的时候,就会直接的退出程序,达到反调试的目的。

接下来进入设备查看一下ptrace字段:

进入设备: adb shell

获取Root权限:su

获得APP的进程ID:ps | grep 软件的包名

查看进程的信息及TracerPid值: cat  /proc/进程ID/status

6.查看进程是否被调试.png

知道了软件有反调试之后,接下来就需要对其反反调试了。

3.反反调试

下面为方便发帖截图说明,我又换回了模拟器来做调试(模拟器可以调就用模拟器,不能调的当然就要换真机啦)

如何反反调试:程序的so文件在加载阶段会先执行JNI_OnLoad,之后就不再执行,在程序的so文件加载阶段才能给JNI_OnLoad打断点调试即可!

//调试APP挂在加载界面

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

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

用调试模式启动APP,APP此时会挂在启动界面,现在并没有开始加载so文件。

image-20201126150534192.png

重新关闭打开 IDA 并调试上面挂载的程序,进入之后点击Debugger->Debugger options... 选项如下图:

image-20201126151200172.png

勾选这两项Suspend on thread start/exit      Suspend on library load/unload,之后ok,之后点击下图左上角的运行符号,然后让它运行起来。

image-20201126151452197.png

然后让模拟器的APP也运行起来,用过下面的这些命令运行APP,即可

进入设备: adb shell

获取Root权限:su

获得APP的进程ID:ps | grep com.yaotong.crackme

监听进程的ID:adb forward tcp:8700 jdwp:4495(4495为上面获得的APP进程ID)

运行进程:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

获取APP的进程的ID以及再开启一个命令行,直接做端口的监听转发,并直接的运行进程,如下图:

image-20201126155145213.png

注意:卡在运行进程这一步的不出现上图的正在初始化jdb...,应该是你漏掉了一个步骤,我就是因为截图过之后忘记了在IDA 动态调试的时候,忘记点击了一下IDA左上角的运行符号,而导致的一致不出来正在初始化jdb...的情况,出现初始化后,APP处于这个没有控件的界面,此时的APP并没有完全的运行起来,只是挂在这里

image-20201126155849828.png

然后我们回到 IDA 的动态调试 找到要调试的crackme.so 文件,按Ctrl+s 之后按Ctrl+f搜索crackme,如果没有就点击左上角的运行 运行一步继续操作,直到可以在所有的so文件中搜索到crackme.so文件,并且找到可执行的X权限的文件。(这里模拟器又出现了没有X可执行的情况,直接换Google6.0.1真机)模拟器调试如下图所示:

image-20201126161826373.png

真机动态调试前一定要修改APP AndroidMenifest.xml文件, 在<application 里给APP加上可调试权限,android:debuggable="true",重新打包APP,签名,安装,如下图所示:

image-20201126172051429.png

接下来点击 IDA 左上角的运行,按照上面说的,知道找到 crackme.so 中有X(可执行的),进入,如下图:

8.找到crackme.so X可执行的.png

然后我们要进入 JNI_ONLoad ,接下来算绝对地址=执行so文件的基地址+函数的偏移量 最终如下图所示:

9.计算绝对地址.png

最终的计算结果如下图所示:

10.绝对地址计算结果.png

跳转到 JNI_ONLoad 里面去了,先结合静态分析看一下这个文件流程图的大致逻辑,然后在动态调试里打断点调试,并点击IDA左上角的运行,恢复程序的运行如下图所示:

11.结合分析打断点动态调试.png

BLX R7的位置跳了出去,很可疑的位置需要重点注意,尝试修补so文件的这个位置,看一下,如下图所示:

12.调试找到BLX R7为检测反调试的位置.png

然后IDA 静态调试分析 找到上面的BLX R7位置,点击一下,可以看Hex View-1视图中的3F FF 2F E1

image-20201126182419070.png

3F FF 2F E1 修改为 00 00 00 00 即可,下面直接使用两种方式修改这个:

第一种:

image-20201126182942174.png

image-20201126183131116.png

第二种:

image-20201126183922990.png

image-20201126184257388.png

修改完毕之后,找到这个文件所在的位置,与之前Android kill反编译之后的里面的so文件做替换,然后就回编译签名安装即可

image-20201126185000009.png

image-20201126185805889.png

修改了关于程序反调试的TracerPid 指令37 FF 2F E1 改为 00 00 00 00 然后对软件重新回编译打包安装后,就可以继续动态调试软件的真实密码了,不会再有反调试的防护机制了,接下来就是再次动态调试。

4.再动态调试

有了上一次的经验这次直接使用 Google6.0.1版本真机,很快的通过上面的方式,找到了要调试的函数所在的位置,如下图所示

13.计算地址打断点运行.png

打断点后让程序恢复执行,真机上输入密码(yimingrj)并存到寄存器,一直F8找到有跳转的地方,鼠标查看寄存器的值:

14.分析输入密码与真实密码.png

之后我们看一下R3的值,直接使用快捷键F5看一下伪C代码,又根据之前的静态调试分析可知v6就是真实密码,最后分析出了这个软件真实的进入密码为:aiyou,bucuoo(哎呦,不错哦)!

15.分析出真实密码.png

输入密码经过模拟器上程序验证后,进入软件成功!这个软件的密码分析到这里这部分就结束了。

image-20201126203030861.png

五、最后总结

因为模拟器动态调试so加载好像有问题,又因为文章的贴图需要,所以用了两台电脑+MUMU模拟器+Google6.0.1版真机,模拟器对动态调试so文件支持的好像不是很好。
(不断学习+总结积累=持续性进步)

总结一条经验:以后再动态调试就可以直接使用真机了。


这篇详细的实战分析文章:

文章对我而言:是一次详细的总结,也可以当做以后自己再调试软件的一个经验贴和排错贴;

文章对你而言:是对逆向比较感兴趣的同学的一个入门介绍,希望可以帮助到你。



练习软件地址:https://yirj.lanzoui.com/iehe4ity92h

免费评分

参与人数 20吾爱币 +39 热心值 +18 收起 理由
poisonbcat + 1 + 1 谢谢@Thanks!
我是大力呀 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
prontosil + 1 用心讨论,共获提升!
CIBao + 1 + 1 谢谢@Thanks!
涛之雨 + 16 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
BrainFlower + 1 + 1 用心讨论,共获提升!
yhyclown + 1 谢谢@Thanks!
悠然地2012 + 1 + 1 用心讨论,共获提升!
_小白 + 1 + 1 我很赞同!
芽衣 + 3 + 1 详细,好!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
嘛哩嘛哩轰 + 1 + 1 谢谢@Thanks!
含笑阁 + 1 + 1 谢谢@Thanks!
风绕柳絮轻敲雪 + 2 + 1 我很赞同!
TR小米哥 + 2 + 1 写得很细致,适合初学者的crackme哦我一般很少上模拟器,感觉用着跟市面上.
子晗。 + 2 + 1 用心讨论,共获提升!
愚弄者fff + 1 + 1 写得好!加分
luoxuan + 1 谢谢@Thanks!
sushangyu + 1 + 1 精品教程,牛
fanvalen + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zhuwaihui 发表于 2020-11-29 23:37
佚名RJ 发表于 2020-11-29 17:59
模拟器的so文件调试有点问题,在搞的时候我也遇到了,建议使用真机来调试。

谢谢大佬,最后我也用的真机来调试,用的android 8.1版本的。
另外还有个bug(可能是ida缓存问题) 不知道大佬你遇到没有,IDA重新动态调试so库的时候,设置连接真机成功后,只显示了一个进程(好像是system/bin目录下的什么 记不清楚了),把电脑重启后就可以正常显示了,
 楼主| 佚名RJ 发表于 2020-11-29 17:59
zhuwaihui 发表于 2020-11-29 16:27
大佬有没有遇到,在jump address 之后 ida 没有跳转到那个流程图里面,但跳转的地方是那个方法的地址处,  ...

模拟器的so文件调试有点问题,在搞的时候我也遇到了,建议使用真机来调试。
芽衣 发表于 2020-11-27 11:53
模拟器加载so感觉不太好用,各个品牌都不一样。还是真机实在,模拟器适合没有root的用户。

 楼主| 佚名RJ 发表于 2020-11-27 11:56
芽衣 发表于 2020-11-27 11:53
模拟器加载so感觉不太好用,各个品牌都不一样。还是真机实在,模拟器适合没有root的用户。

是的,因为mumu模拟器的问题,在写文章的时候都多搞了好几遍。以后还是直接使用真机的好。哈哈
blueluckycard 发表于 2020-11-27 12:07
很好的东西。感谢了
鸭子咯咯哒~ 发表于 2020-11-27 12:10
请问这个是Android上调试还是Windows上调试
Leo0723 发表于 2020-11-27 12:13
很好的东西,学习了
 楼主| 佚名RJ 发表于 2020-11-27 12:16
鸭子咯咯哒~ 发表于 2020-11-27 12:10
请问这个是Android上调试还是Windows上调试

Windows上调试 ,电脑通过 adb 连接真机或者模拟器调试
鱼遇雨欲语 发表于 2020-11-27 12:29
感谢分享 ,内容很详细 给力
yjc138 发表于 2020-11-27 13:06
复杂是复杂了点,默默支持,学习了
终南明月 发表于 2020-11-27 14:10
看得眼花缭乱,还是不懂,支持一下。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-26 13:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表