“CrakeMe01“过反调试获取密钥

1.将apk拖进模拟器
在这里插入图片描述

获取密钥
2.我们打开jadx-gui打开“CrakeMe01”apk
先来到它的配置文件AndroidMainfest.xml 看看它的launcher界面
在这里插入图片描述
在这里插入图片描述

如果编辑框为空 toast一个“please enter your password!”
它把正确和错误的逻辑都写在了 greywolf方法里了

点进去一看

该方法被native修饰了 我们来到SO层看看

3.我们用ida打开libwolf.so 静态分析
在这里插入图片描述
只有动态注册
4.我们jni_onLoad点进去
在这里插入图片描述
这段代码很平淡无奇 没有特别扎眼的逻辑只找到了j_AD 和 GetEnv 两个函数
5.我们来好好看看j_AD这个方法在这里插入图片描述
这里面好像没有什么关键的逻辑代码 但看到几个fork trace kill这个的方法 估摸着是一个反调试
6.然后回到jni_onload 方法
在这里插入图片描述
对于动态调试而言 RegisterNatives方法无疑是最为关键的 但是却没找到 我现在来大胆猜测一下 上图方框处的函数为RegisterNatives方法 我们现在来动态调试一下
7.我们来动态调试一下
调试步骤在这块就不细讲了

1~创建模拟器(有真机可以忽略这个) 要记得打开ddms(要不然后面会报错)
2~在IDA里面找到android_server(dbgsrv目录)
3~把android_server文件放到手机/data/local/tmp
    adb push 文件名 /data/local/tmp/as
4~打开一个cmd窗口:运行android_server
    1)adb shell 连接手机
    2)给一个最高权限:su
    3)来到/data/local/tmp:cd /data/local/tmp
    4)给androi_server一个最高的权限:chomd 777 android_server
    5)查看android_server是否拥有权限:ls -l
    6)运行andorid_server: ./android_server(端口号默认是:23946)
    补充:运行andorid_server并且修改端口号:./android_server -p端口号
5~端口转发:
    adb forward tcp:端口号 tcp:端口号(之前转发的端口号是什么,这里就是什么)
        adb forward tcp:23946 tcp:23946
6~打开DDMS:观察程序的端口号
7~挂起程序:
    adb shell am start -D -n 包名/类名
    例子:adb shell am start -D -n com.example.javandk1/.MainActivity
         adb shell am start -D -n com.yaotong.crackme/.MainActivity
    补充:此时观察DDMS,被调试的程序前面有一个红色的虫子;
8~IDA里面勾选三项
    1)打开ida,选择debugger -第二项-Remote ARMlinux(第四项)
    2)添加hostname和portt:
        hostname:主机号(默认127.0.0.1)
        port:端口号(之前android_server运行时的端口号或者端口转发的端口号)
    3)出来进程列表:选择要调试的程序(可以ctrl+f,搜索包名)
    4)进来后,勾选三项:
    Suspend on process entry point程序入口点 断下
    Suspend on thread start/exit线程的退出或启动 断下
    Suspend on library load/unload库的加载和卸载 断下
补充:可以直接在这里F9(左上角有一个三角形)运行程序,然后放手;
         也可以,直接执行第九步,然后IDA运行程序
9~挂载、释放(放手)
    jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=端口号
    补充:此时观察DDMS,被调试的程序前面有一个绿色的虫子;

8.开始动态调试
在这里插入图片描述
这一块就是前面我们分析的j_AD方法 有反调试 我们把它直接nop掉
9.F8一路往下 我们来到那个可能是RegisterNatives函数的位置 打上断点
在这里插入图片描述
10.看来是我们猜对了
在这里插入图片描述
11.我们点击过去 再按快捷键“D” 把它识别成 DCW类型的地址 这是一个方法结构体数组
第一个地址为java层native方法名
第二个地址为java层native方法签名信息(返回值)
第三个地址为C/C++函数方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200905162605113.png#pic_center
12.我们第三个方法点进去
在这里插入图片描述

13.这样看汇编很乱 根据
在这里插入图片描述
T=1 得到 该指令为thumb指令集 我们按快捷键“C”
在这里插入图片描述
汇编指令已经正常了
14.我们来到bc函数 来好好调试这个函数
在这里插入图片描述

15.我们这块有看到一串数字
在这里插入图片描述

16.跟进去 看到了一个RC4方法
在这里插入图片描述
在这里插入图片描述

17.我们来好好动态调试一下wolf_de()这个函数 看看它的逻辑是怎么跑的
在这里插入图片描述

18.手机触发 来到bc函数下
在这里插入图片描述

19.来到bc方法
我们来到wolf_de()这个函数附近
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

20.最后会来到 DecryptPKc这块 都没找到有效信息 我们返回到wolf_de()这块 我们看看它的后续代码
一步一步F7 在不断同步寄存器 找到密钥
在这里插入图片描述
在这里插入图片描述

大家可以关注公众号 “安卓逆向菜鸟修炼记” 定期更新最新逆向干货 文章涉及到的所有工具软件 都可以在公众号获取
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值