首页
社区
课程
招聘
[原创]超级详细的实战分析一个Crackme的过程
发表于: 2020-11-27 13:11 9751

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

2020-11-27 13:11
9751

自学这个也有几个星期了,今天就总结一下近期学习的成果,实战分析一个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版

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

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

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

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

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

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

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

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

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

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

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

连接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


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

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

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

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

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

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

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

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

真机的是下图显示的so:

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

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

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

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

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

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

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

进入设备: adb shell

获取Root权限:su

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

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


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

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

如何反反调试:程序的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文件。

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

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

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

进入设备: adb shell

获取Root权限:su

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


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-12-1 14:12 被杰孑编辑 ,原因: 添加练习软件地址
收藏
免费 6
支持
分享
最新回复 (17)
雪    币: 2677
活跃值: (5410)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
2
大佬,能放个附件上面吗,方便小弟学习
2020-11-30 15:53
0
雪    币: 12790
活跃值: (1862)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
YenKoc 大佬,能放个附件上面吗,方便小弟学习
已经在帖子的结尾添加了练手的软件。
2020-11-30 16:41
0
雪    币: 50161
活跃值: (20625)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4

为了防止附件丢失,上传一份论坛本地保存.

上传的附件:
2020-11-30 16:51
0
雪    币: 6573
活跃值: (3943)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
5
写的很详细 
2020-11-30 17:41
0
雪    币: 105
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习了,顺便用objection试了下,秒破:
android hooking set return_value com.yaotong.crackme.MainActivity.securityCheck true
2020-11-30 22:28
0
雪    币: 2677
活跃值: (5410)
能力值: ( LV10,RANK:177 )
在线值:
发帖
回帖
粉丝
7
感谢大佬
2020-11-30 23:50
0
雪    币: 12790
活跃值: (1862)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
ashuixu 学习了,顺便用objection试了下,秒破: android hooking set return_value com.yaotong.crackme.MainActivity.securityC ...
我的另一篇帖子也直接使用两个框架Hook的方式,是可以秒破的。
2020-12-1 06:32
0
雪    币: 0
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你这里计算BLX R7的步骤过于麻烦,直接用IDA选中这行代码,查看十六进制不就找到了嘛
2020-12-2 16:08
0
雪    币: 0
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
还有个好奇的是你这里直接给JNI_Onload下断不就行了么,为啥还整这么多步骤
2020-12-2 16:09
0
雪    币: 12790
活跃值: (1862)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
xflangzi 你这里计算BLX R7的步骤过于麻烦,直接用IDA选中这行代码,查看十六进制不就找到了嘛
方法不止一种,好多都可以的,最终出来结果就行了呀
2020-12-2 17:42
0
雪    币: 12790
活跃值: (1862)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
xflangzi 还有个好奇的是你这里直接给JNI_Onload下断不就行了么,为啥还整这么多步骤
从0到1的分析,为了知道从每一步开始分析是为何,或者说是为了文章的详细,以后自己再分析其它的排错方便。
2020-12-2 17:45
0
雪    币: 3270
活跃值: (5499)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
哥们,有联系方式吗?想跟你详细聊聊
2020-12-23 14:37
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
前面写的挺详细,后面一句话就带过了,我觉得后面的很重要,因为前面都懂了
“打断点后让程序恢复执行,真机上输入密码(yimingrj)并存到寄存器,一直F8找到有跳转的地方”
这个地方楼主能讲讲么?没看懂,怎么让程序恢复运行?F9么?
还有输入密码(yimingrj)并存到寄存器, 这句话的意思是在APP上输入密码后确定么? 怎么存到寄存器
2021-1-12 15:15
0
雪    币: 12790
活跃值: (1862)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16

中途如果有一些迷惑的,可以多看两遍,文章中都是有详细步骤的!

最后于 2021-1-18 08:44 被杰孑编辑 ,原因:
2021-1-18 06:29
0
雪    币: 12790
活跃值: (1862)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
bl.m 前面写的挺详细,后面一句话就带过了,我觉得后面的很重要,因为前面都懂了 “打断点后让程序恢复执行,真机上输入密码(yimingrj)并存到寄存器,一直F8找到有跳转的地方” 这个地方楼主能讲讲么? ...
恢复运行,具体可看文章中“反反调试”刚开始的时候,和那里的步骤基本是一样的;
因为是动态调试,在APP上输入密码,点击确定,就会加载到Ida调试程序中,就可以在后续的动态调试中看到。
2021-1-18 06:29
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
可能 我对ndk不熟悉   我多你的反反调试的真不太理解  怎么绕过tracepid的检测   jni加载so后给它下断点  不还是会检测
2021-1-18 09:34
0
游客
登录 | 注册 方可回帖
返回
//