首页
社区
课程
招聘
[原创]4月底360无线攻防试题第一题解析
2014-5-12 00:17 13326

[原创]4月底360无线攻防试题第一题解析

2014-5-12 00:17
13326
小弟最近开始玩android,上月初把JNI弄懂,月底360就发布赛题。 运气还不错,正好练练手。废话不多说,下面开始分析。(来看雪第一篇帖子,大牛直接略过即可,不喜无喷,谢谢)
题意: 将apk逆向,将apk中的java加密算法使用JNI实现(简单吧。。。)
OnCreat加密方法调用点:
invoke-direct {p0, v3, v2}, Lcom/qihoo/test/first/MainActivity;->decrypt([BLjava/lang/String;)[B  //调用decrypt方法

decrypt方法:
.method private decrypt([BLjava/lang/String;)[B
    .locals 6
    .parameter "src"
    .parameter "password"
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/lang/Exception;
        }
    .end annotation

    .prologue
    .line 102
    new-instance v3, Ljava/security/SecureRandom;

    invoke-direct {v3}, Ljava/security/SecureRandom;-><init>()V  //创建SecureRandom

    .line 104
    .local v3, random:Ljava/security/SecureRandom;
    new-instance v1, Ljavax/crypto/spec/DESKeySpec;

    invoke-virtual {p2}, Ljava/lang/String;->getBytes()[B //得到paramString Bytes数组

    move-result-object v5

    invoke-direct {v1, v5}, Ljavax/crypto/spec/DESKeySpec;-><init>([B)V //创建DESKeySpec

    .line 106
    .local v1, desKey:Ljavax/crypto/spec/DESKeySpec;
    const-string v5, "DES"

    invoke-static {v5}, Ljavax/crypto/SecretKeyFactory;->getInstance(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory; //得到SecretKeyFactory的DES实例

    move-result-object v2

    .line 108
    .local v2, keyFactory:Ljavax/crypto/SecretKeyFactory;
    invoke-virtual {v2, v1}, Ljavax/crypto/SecretKeyFactory;->generateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey; //生成SecretKey

    move-result-object v4

    .line 110
    .local v4, securekey:Ljavax/crypto/SecretKey;
    const-string v5, "DES"

    invoke-static {v5}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher; //得到Cipher的DES实例

    move-result-object v0

    .line 112
    .local v0, cipher:Ljavax/crypto/Cipher;
    const/4 v5, 0x2

    invoke-virtual {v0, v5, v4, v3}, Ljavax/crypto/Cipher;->init(ILjava/security/Key;Ljava/security/SecureRandom;)V //初始化Cipher

    .line 114
    invoke-virtual {v0, p1}, Ljavax/crypto/Cipher;->doFinal([B)[B //得到加密后的字节数组

    move-result-object v5

    return-object v5
.end method

知道了加密函数各个部分的步骤,下面开始按顺序写JNI(C语言编写):

#include "com_qihoo_test_first_MainActivity.h"
#include <stdio.h>

jobject m_NewObject(JNIEnv *env, char classname[]);

JNIEXPORT jbyteArray JNICALL JNICALL Java_com_qihoo_test_first_MainActivity_decrypt(JNIEnv *env, jobject obj, jbyteArray paramArrayOfByte, jstring key)
{
  jclass clazz = NULL;
  jmethodID methodID = NULL;
  jobject object = NULL;
  jbyteArray byte_arr = NULL;
  
  jobject localSecureRandom = NULL;
  jobject localDESKeySpec = NULL;
  jobject SecretKeyFactory = NULL;
  jobject localSecretKey = NULL;
  jstring algorithm = NULL;
  jobject localCipher = NULL;
  jint num = 2;
  
  localSecureRandom = m_NewObject(env, "java/security/SecureRandom");

  clazz = (*env) -> FindClass(env, "java/lang/String");
  methodID = (*env) -> GetMethodID(env, clazz, "getBytes", "()[B");
  byte_arr = (jbyteArray)(*env) -> CallObjectMethod(env, key, methodID);

  clazz = (*env) -> FindClass(env, "javax/crypto/spec/DESKeySpec"); 
  methodID = (*env) -> GetMethodID(env, clazz, "<init>", "([B)V");
  localDESKeySpec = (*env) -> NewObject(env, clazz, methodID, byte_arr);
  
  algorithm = (*env) -> NewStringUTF(env, "DES");

  clazz = (*env) -> FindClass(env, "javax/crypto/SecretKeyFactory");
  methodID = (*env) -> GetStaticMethodID(env, clazz, "getInstance", "(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;");
  SecretKeyFactory = (*env) -> CallStaticObjectMethod(env, clazz, methodID, algorithm);

  methodID = (*env) -> GetMethodID(env, clazz, "generateSecret", "(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;");
  localSecretKey = (*env) -> CallObjectMethod(env, SecretKeyFactory, methodID, localDESKeySpec);

  
  clazz = (*env) -> FindClass(env, "javax/crypto/Cipher");
  methodID = (*env) -> GetStaticMethodID(env, clazz, "getInstance", "(Ljava/lang/String;)Ljavax/crypto/Cipher;");
  localCipher = (*env) -> CallStaticObjectMethod(env, clazz, methodID, algorithm);

  methodID = (*env) -> GetMethodID(env, clazz, "init", "(ILjava/security/Key;Ljava/security/SecureRandom;)V");
  (*env) -> CallVoidMethod(env, localCipher, methodID, num, localSecretKey, localSecureRandom);

  methodID = (*env) -> GetMethodID(env, clazz, "doFinal", "([B)[B");
  return (jbyteArray)(*env) -> CallObjectMethod(env, localCipher, methodID, paramArrayOfByte);

}

jobject m_NewObject(JNIEnv *env, char classname[])
{
  jclass clazz = NULL;
  jmethodID methodID = NULL;
  jobject obj = NULL;
  clazz = (*env) -> FindClass(env, classname);
  if(clazz == NULL)
    return NULL;
  methodID = (*env) -> GetMethodID(env, clazz, "<init>", "()V");
  if(methodID == NULL)
    return NULL;
  obj = (*env) -> NewObject(env, clazz, methodID);
  if(obj == NULL)
    return NULL;
  return obj;
}
最后修改MainActivity,删除其中的decrtp方法,加入statci和decrpt native 代码即可。这部分代码比较简答,就不附上来了吧。

附上:原APK文件,修改后的就不附上了吧。
----------------------------------------------
PS; 求转正!

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (12)
雪    币: 2321
活跃值: (4028)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
熊猫正正 9 2014-5-13 22:31
2
0
不错,不错!!
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
JoySauce 1 2014-5-14 10:07
3
0
打包还有png错误,icon格式的。
雪    币: 463
活跃值: (283)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
鱼妹兔 2 2014-5-14 10:07
4
0
有没有题目的链接?分析分析去
雪    币: 9
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hwuyule 2014-5-14 10:37
5
0
哥来帮你顶顶~
雪    币: 368
活跃值: (1181)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 6 2014-5-14 12:57
6
0
题目:
题目说明:
第1题:
1.请重打包本qihootest1.apk,将java层实现的解密算法移至jni层重新实现,并在同一控件中展示解密后的内容;
2.本题2分,以非重打包的方式达到同等效果的不计分。
题目附件:qihootest1.apk(软件中已经用java层代码实现了解密软件包的文件并将加密的内容显示在启动界面上)

第2题:
1.请以重打包的形式将qihootest2.apk的程序包名改为 "com.qihoo.crack.StubApplication",使得在同一手机上面可以重复安装并正确运行;
2.请写个Application类,并在Manifest里面注册你的Application。同时要求使用该Application加载原包的Application;
3.本题3分,以非重打包的方式达到同等效果的不计分。
题目附件:qihootest2.apk

第3题:
1.请逆向qihootest3.apk,通过分析确定其序列号算法,并写出一个注册机;
2.输入注册码,并点击verify,成功则提示:you passed英文提示,否则将无任何提醒;
3.提示:注册号8位(字母或数字),本题满分为5分,通过爆破的方式达到效果的,将根据解题思路给予1-3分不等。
题目附件: qihootest3.apk

所有题目的网盘地址:
http://aqkg6ljr44.l14.yunpan.cn/lk/QNNLZInYrxyjZ
雪    币: 368
活跃值: (1181)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 6 2014-5-14 12:58
7
0
这个我没遇到。你可以去网盘地址下载原题。
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
OnlyEnd 2014-5-14 16:17
8
0
楼主第三题做了吗?
雪    币: 368
活跃值: (1181)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 6 2014-5-14 17:02
9
0
惭愧。 动态跟踪.so文件不怎么会,硬看汇编,没搞出来。
雪    币: 59
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天缺 2014-5-16 11:19
10
0
我想知道你怎么找到的加密点的,是你开始下手部分不是你的结果,没意义.
雪    币: 368
活跃值: (1181)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
ThomasKing 6 2014-5-16 14:12
11
0
不好意思,没懂你想问什么。
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
非洲大表哥 2014-9-1 15:59
12
0
我想问问楼主这样的C源码是怎么写出来的,经验吗?如何把既有的Java代码移植成C,是否有什么诀窍。。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
forrestfff 2014-9-4 10:05
13
0
楼主给的是c源码啊,题给的是apk文件没源码,让你重打包apk。
游客
登录 | 注册 方可回帖
返回