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

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

2014-5-12 00:17
13878

小弟最近开始玩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; 求转正!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 4
支持
分享
最新回复 (12)
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
不错,不错!!
2014-5-13 22:31
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
打包还有png错误,icon格式的。
2014-5-14 10:07
0
雪    币: 463
活跃值: (283)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
有没有题目的链接?分析分析去
2014-5-14 10:07
0
雪    币: 9
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哥来帮你顶顶~
2014-5-14 10:37
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
6
题目:
题目说明:
第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
2014-5-14 12:57
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
7
这个我没遇到。你可以去网盘地址下载原题。
2014-5-14 12:58
0
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主第三题做了吗?
2014-5-14 16:17
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
9
惭愧。 动态跟踪.so文件不怎么会,硬看汇编,没搞出来。
2014-5-14 17:02
0
雪    币: 59
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我想知道你怎么找到的加密点的,是你开始下手部分不是你的结果,没意义.
2014-5-16 11:19
0
雪    币: 370
活跃值: (1180)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
11
不好意思,没懂你想问什么。
2014-5-16 14:12
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我想问问楼主这样的C源码是怎么写出来的,经验吗?如何把既有的Java代码移植成C,是否有什么诀窍。。
2014-9-1 15:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主给的是c源码啊,题给的是apk文件没源码,让你重打包apk。
2014-9-4 10:05
0
游客
登录 | 注册 方可回帖
返回
//