1.简介

这个题目是一位吾爱破解的坛友在面试UC的Android逆向工程事时,遇到的题目。此题不难,与阿里移动去年移动安全比赛的题目差不多,题目的验证方式也是查表对比,并且这个表的数据是放在文件中的。

2.题目分析

直接使用JEB对UC-crackme.apk程序进行反编译,得到下面的结果:

获取查询的密码表,即文件abcdefghddddd的文件偏移0x15D81开始到0x16081结束的0x300字节的数据。

获取中间参与最终字符串比较的18字节的数据即文件abcdefghddddd的文件偏移0x16481开始的后面18个字节的数据。

通过用户输入的注册码,查询密码表获取参与比较的密码字符串。

经过前面的分析,写了个注册机,代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; /**
*
*/ /**
* @author Fly2014
*
*/
public class Key
{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
// 创建文件类
File file = new File("abcdefghddddd"); // 构造文件输入流
FileInputStream fileInputStream = new FileInputStream(file); // 获取文件的大小
int nFileSize = fileInputStream.available(); // 申请内存空间
byte[] byteArryFile = new byte[nFileSize]; byte[] byteArryTable = new byte[768]; byte[] byteArryResult = new byte[18]; // 读取文件的数据到内存中
fileInputStream.read(byteArryFile, 0, nFileSize); // 获取密码查询表0x300字节
System.arraycopy(byteArryFile, 0x15D81, byteArryTable, 0, 768); // 获取最终参与比较的18字节的密码
System.arraycopy(byteArryFile, 0x16481, byteArryResult, 0, 18); // 密码查询表转utf-8格式
String strTable = new String(byteArryTable, "utf-8"); // 18字节密码装utf-8格式
String strResult = new String(byteArryResult, "utf-8"); // 存放用户输入的注册码
StringBuilder strBuilderKey = new StringBuilder(); // 包里查询破解
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 255; j++)
{
if (strTable.charAt(j) == strResult.charAt(i))
{
// 获取用户输入的字符
strBuilderKey.append((char) j); break;
}
}
} // 输出key
System.out.println("输入的注册码:" + strBuilderKey.toString() + "\n"); // 参与比较的最终密码
System.out.println("比较的中间密码:" + strResult.toString() + "\n"); System.out.println("显示查询密码表:"); for (int a = 0; a < 255; a++)
{
System.out.print(strTable.charAt(a)); if ((a + 1) % 51 == 0 && a != 0)
{
System.out.print("\n");
}
} }
}

经过分析发现,最终的输入字符串是581026。

分析文档的下载地址:http://download.csdn.net/detail/qq1084283172/9029777

最新文章

  1. 企业站SEO记录
  2. 安装生物信息学软件-bowtie2
  3. 万恶的ViewBag
  4. Symfony学习--原创。。。。
  5. 160902、Ionic、Angularjs、Cordova搭建Android开发环境
  6. php的引用&amp;(就是在变量或者函数、对象等前面加上&amp;符号)
  7. 113. Path Sum II
  8. python面向对象编程实例解析
  9. Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
  10. css样式表中四种属性选择器
  11. 1410 - Consistent Verdicts(规律)
  12. [国嵌攻略][149][Yaffs2文件系统应用]
  13. Mahout推荐算法之ItemBased
  14. Python3学习之路~9.1 paramiko模块:实现ssh执行命令以及传输文件
  15. java的hello world
  16. # 20175227 2018-2019-2 《Java程序设计》第二周学习总结
  17. js如何比较两个日期之间相差数(天、时、分、秒)
  18. Dom方法,解析XML文件
  19. SQL思维导图总结
  20. python自定义函数和推导

热门文章

  1. PAT-1144(The Missing Number)set的使用,简单题
  2. POJ-2240(floyd算法简单应用)
  3. css实现鼠标滑过出现从中间向两边扩散的下划线
  4. CVE-2016-5734-phpmyadmin-4.0.x-4.6.2-代码执行
  5. CVE-2019-10758-Mongo-express-远程代码执行
  6. 键盘--扫描码--ASCII码--显示器上的字符
  7. Android应用程序的进程创建过程
  8. 使用oracle序列+oracle定时任务获取每月从1开始的流水码
  9. Java之常用API
  10. Python基础之异常定义