作者:Fly2015

AliCrackme_2.apk运行起来的注册界面,如图。

首先使用Android反编译利器Jeb对AliCrackme_2.apk的Java层代码进行分析。

很幸运,就找到了该apk程序的用户注册码的函数securityCheck并且这个函数是在Native层实现的。下面就到该程序的so库中去查找该函数的Native实现。

Native层securityCheck函数的注册并不是使用在JNI_OnLoad函数中进行注册的方式注册的,因此非常走运的找到securityCheck函数的实现,分析如下图:

通过对Native代码的静态的分析发现, _lpSaveBuffer = off_628C中保存的就是正确的注册码字符串,因此,要获取该apk的注册码,必须对其进行动态的调试,获取到_lpSaveBuffer 中保存的字符串的内容就能实现该apk的破解。

对该Android应用程序进行动态的调试。说一句,Android应用程序一般会在JNI_OnLoad函数中进行程序的反调试操作,以防止别人对其App进行动态调试。经过几轮动态调试的实验,发现该Android应用程序会调用函数pthread_create创建线程进行反调试。因此,直接在函数Java_com_yaotong_crackme_MainActivity_securityCheck处下断点实现破解的方法不能直接达到。

因此,为了阻止该App程序的反调试,将程序的代码进行了修改。如图,定位地址A8CE 9C58处的ARM汇编指令BLX R7在内存中的位置,然后将汇编指令BLX R7改为汇编指令MOV R0, RO即NOP掉BLX R7指令。

至于ARM汇编指令与机器码的转换,使用下面这个工具,但是请注意,在使用这个工具的时候,必须将这个工具放在桌面上才能正常的使用。

顺利跨过反调试的障碍,下面就在函数Java_com_yaotong_crackme_MainActivity_securityCheck上下断点,直奔主题。

在程序输入密码的界面上,随便输入一个字符串密码,函数Java_com_yaotong_crackme_MainActivity_securityCheck就会被调用。

程序就会断在函数Java_com_yaotong_crackme_MainActivity_securityCheck上,然后在该函数里找到_lpSaveBuffer = off_628C对应的汇编代码LDR R2, [R1, R7]。在汇编代码LDR R2, [R1, R7]的下一条指令上下断点即可得到R2保存的密码字符串指针的地址为A8CEC450,然后在程序数据内存中同步R2的值定位到地址A8CEC450处的字符串aiyou,bucuoo,很显然aiyou,bucuoo就是要获取的密码。


AliCrackme_2题的分析文档和apk下载地址:http://download.csdn.net/detail/qq1084283172/8897059

AliCrackme_2题的分析的更多相关文章

  1. Python小白的数学建模课-A1.国赛赛题类型分析

    分析赛题类型,才能有的放矢. 评论区留下邮箱地址,送你国奖论文分析 『Python小白的数学建模课 @ Youcans』 带你从数模小白成为国赛达人. 1. 数模竞赛国赛 A题类型分析 年份 题目 要 ...

  2. Project Euler 第一题效率分析

    Project Euler: 欧拉计划是一系列挑战数学或者计算机编程问题,解决这些问题需要的不仅仅是数学功底. 启动这一项目的目的在于,为乐于探索的人提供一个钻研其他领域并且学习新知识的平台,将这一平 ...

  3. Leetcode第1题至第10题 思路分析及C++实现

    笔者按照目录刷题,对于每一道题,力争使用效率最高(时间复杂度最低)的算法,并全部通过C++代码实现AC.(文中计算的复杂度都是最坏情况复杂度) 因为考虑到大部分读者已经在Leetcode浏览过题目了, ...

  4. leetcode Online Judge 150题 解答分析之一 Reverse Words in a String

    问题 Given an input string, reverse the string word by word. For example, Given s = "the sky is b ...

  5. 【编程题与分析题】Javascript 之继承的多种实现方式和优缺点总结

    [!NOTE] 能熟练掌握每种继承方式的手写实现,并知道该继承实现方式的优缺点. 原型链继承 function Parent() { this.name = 'zhangsan'; this.chil ...

  6. C++ 每日一题 参数分析 (vector)

    首先给出原题地址: https://www.nowcoder.com/practice/668603dc307e4ef4bb07bcd0615ea677?tpId 以下是代码解析: #include& ...

  7. 模拟电磁曲射炮_H题 方案分析【2019年电赛】【刘新宇qq522414928】

    请查看我的有道云笔记: 文档:电磁曲射炮分析.note链接:http://note.youdao.com/noteshare?id=26f6b6febc04a8983d5efce925e92e21

  8. OCP考试最新052题库分析整理-28

    28.Which two are true about external tables? A. They support the ORACLE_DATAPUMP access driver. B. T ...

  9. 2014年百度之星程序设计大赛 - 资格赛 第二题 Disk Schedule

    双调欧几里得旅行商问题是一个经典动态规划问题.<算法导论(第二版)>思考题15-1和北京大学OJ2677都出现了这个题目. 旅行商问题描写叙述:平面上n个点,确定一条连接各点的最短闭合旅程 ...

随机推荐

  1. 解读KMP算法

    前后断断续续搞了5个月,每次都以为自己懂了, 但是要写的时候都不知从何下手,然后又是各种找博客,看帖子,所以这次试着用自己的语言写一个博客. 首先,KMP算法就是从一个模板字符串(S) 中匹配目标字符 ...

  2. 蓝桥杯-分考场(dfs)

    分考场 PREV-53 这题的解决方法使用dfs,因为数据很小,才100. 每次当前的人人是否可以和前面的组队,设置两个数组group和fri /*DFS求解:思路每次判断输入的人是否可以和前面的组队 ...

  3. JAVA -JSON-XML-MAP转换

      //定义一个MAP对象,将对象传给后端接口接收 Map a = ["api": '11', ZGUID: "1231",BESKZ: "1231& ...

  4. 关于主机不能访问虚拟机的web服务解决

    centos7默认并没有开启80端口,我们只有开启就行 [root@localhost sysconfig]# firewall-cmd --permanent --add-port=3032/tcp ...

  5. Jmeter性能常见问题集锦

    1. java.net.BindException: Address already in use: connect 开始以为是单机运行脚本运行不过来,所以另加了一台负载机同时运行脚本 分布式环境部署 ...

  6. Java BasicNameValuePair怎么传数组类型的参数?

    BasicNameValuePair 传数组的话可以这样传 map.put("ids[]", 1); map.put("ids[]", 2);

  7. python基础学习之类

    面向对象和面向过程 面向过程:以吃饭为例,即为 煮饭.洗菜.洗碗.切菜.炒菜.出锅.吃饭面向对象:目标对象做完,直接吃疑问点:1.面向对象就是把过程用函数封装起来,随时调用?:2.面向过程就是每次都把 ...

  8. python 集合详解

    字符串 一个个字符组成的有序的序列,时字符的集合 使用单引,双引,三引 引住的字符序列 字符时不可变的对象 bytes定义 bytes不可变字节序列 使用b前缀定义 只允许基本ASCII使用字符形式 ...

  9. Go语言GC实现原理及源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/475 本文使用的 Go 的源码1.15.7 介绍 三色标记法 三色标 ...

  10. 经典变长指令SIB

    前言 ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的. 这时就在ModR/M后面增加一个SIB字节, ...