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

UC-Android逆向工程师 面试题1的分析的更多相关文章

  1. UC-Android逆向工程师面试第2题分析

    博客链接:http://blog.csdn.net/qq1084283172/article/details/52133172 一.简介 这个题目是别人面试UC优视集团Android逆向工程师一职位的 ...

  2. Android逆向工程师的黑科技

    你们发现了吗?Android逆向.安全方面的工程师真的越来越"稀有"了. 以腾讯.美团.百度为代表的大厂们,在某招聘网站上居然薪酬高达30-60k. 现在移动端市场越来越火热,AP ...

  3. Android中高级工程师面试题

    https://www.cnblogs.com/huangjialin/p/8657565.html(存在不少答案错误,可参照知识点复习,答案不可全信)  上 https://www.cnblogs. ...

  4. Mc小冰总结的Android开发工程师面试题以及答案,android程序员必备,详解

    1.请谈一下Android系统的架构. 答:Android系统采用了分层架构,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层. 2.谈谈android大众常用的五种布局. ...

  5. 整理最全的Android开发工程师面试题,面试题详解。java、Android程序员

    1.    请描述下Activity的生命周期. 必调用的三个方法:onCreate()--> onStart() --> onResume(),用AAA表示 (1)父Activity启动 ...

  6. Android开发工程师面试题总结。android开发面试经验

    1:Android中五种数据存储方式分别是什么?他们的特点?     (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQ ...

  7. Android开发工程师面试题之handler详解。android程序员,android开发面试资料,详解

    Message:消息:其中包含了消息ID,消息对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理 Handler:处理者:负责Message发送消息及处理.Handler ...

  8. 刷了无数大厂Android研发岗面试题,其实考的无非是这 3 点能力

    前言 发现一个有趣的现象,似乎程序员们对面试题总是抱有热情,多看几道面试题,自己的面试能力就可以提高一点. 作为一个研发工程师,看过很多公司的面试题,也参与过很多公司的面试,发现大厂的面试题更加具有代 ...

  9. [转]Android逆向之动态调试总结

    一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...

随机推荐

  1. 理解C#泛型运作原理

    前言  我们都知道泛型在C#的重要性,泛型是OOP语言中三大特征的多态的最重要的体现,几乎泛型撑起了整个.NET框架,在讲泛型之前,我们可以抛出一个问题,我们现在需要一个可扩容的数组类,且满足所有类型 ...

  2. 不一样的软件们——GitHub 热点速览 v.21.10

    作者:HelloGitHub-小鱼干 创意,是程序员的一个身份代名词,一样的软件有不一样的玩法.比如,你可以像用 git 一样操作一个 SQL 数据库,dolt 就是这样的数据库.又比如,你可以只写文 ...

  3. Spring 中的事务

    前言: 之前总结了事务以及数据库中事务相关的知识点,Spring 对于事务做了相应的封装,便于业务开发中使用事务. 项目中使用Spring中的事务首先时基于Mysql数据库中InnoDB 引擎的,如果 ...

  4. java基础:数据类型拓展

    public static void main(String[] args) { //单行注释 //输出hello,world! //System.out.println("hello,wo ...

  5. Maven配置ali镜像

    Maven目录,Conf文件夹下settings.xml 找到mirrors节点 添加配置 <mirror> <id>alimaven</id> <mirro ...

  6. BIMFACE二次开发【C#系列】

    本系列文章主要介绍使用 C# .ASP.NET(MVC)技术对 BIMFACE 平台进行二次开发,以满足本公司针对建筑行业施工图审查系统的业务需求,例如图纸模型(PDF 文件.二维 CAD 模型.三维 ...

  7. [源码分析] 消息队列 Kombu 之 Producer

    [源码分析] 消息队列 Kombu 之 Producer 目录 [源码分析] 消息队列 Kombu 之 Producer 0x00 摘要 0x01 示例代码 0x02 来由 0x03 建立 3.1 定 ...

  8. Java学习历程记录(一)

    一.类与对象 1.创建类 创建一个学生类.并且创造成员变量和方法 public class student{ String name: int age: public void study(参数列表) ...

  9. python-给一个参数n,例如3:先输出1,2,3,4,5,6,7,8,9,每三个数后换行,后输出1,4,7,2,5,8,3,6,9

    """ 2 定义一个函数,fn(n)其中n表示输入n行n列的矩阵,需要满足的要求是在n为 3时先输出 3 1 2 3 4 4 5 6 5 7 8 9 6 后输出 7 1 ...

  10. APIView里如何获取HTTP里的数据

    request.data.get()  获取post方法表单里的数据 request.post.get()  获取post方法表单里的数据 request.GET.get()  获取URL里的数据 r ...