发新帖

360CM第一题题解(修改版)

[复制链接]
35467 25
    /**     * 之前写的那篇NDK代码用的别人的,现在我的NDK版本是r10,多多少少跟之前不太一样,因此重写下
     * 逆向未来 http://www.pd521.com
     */


    这题目有些日子了,之前做Android时没太接触NDKCMAPP还原出源码(java)后一直放在那里没动,看着pt哥、鬼哥等人都在出干货,我的虽然没什么技术含量,但还是想分享一下经验(板砖轻拍),下面看下题目:




题目说明:
    第1题:
       1.请重打包本qihootest1.apk,将java层实现的解密算法移至jni层重新实现,并在同一控件中展示解密后的内容;
       2.本题2分,以非重打包的方式达到同等效果的不计分。
    题目附件:qihootest1.apk(软件中已经用java层代码实现了解密软件包的文件并将加密的内容显示在启动界面上)


    题目不难,没壳也没做混淆,因此很适合新手做练习,但需要一定的编程基础。

    源文件只有一个MainActivity.java,通过下面的smali代码结构猜测onCreate()中可能是调用decrypt()desCrypto()来对文件进行加解密:



    来看下还原出的java代码(当时比较闲,所以直接还原了代码):
[Java] 纯文本查看 复制代码
try {
           assetManager = getAssets(); //对assets中文件的操作
InputStream inputStream = assetManager.open("encryptedData");  //打开流
           len = inputStream.available();
           inputByte = new byte[len];
           if(len == inputStream.read(inputByte)){
               try {
                   decryResult = decrypt(inputByte, "Qihoo123");   //调用decrypt解密
              } catch (IOException e) {
                  e.printStackTrace();
              }
            }else {
               decryResult = getString(2131034122).getBytes(); //因为资源文件是直接从原APK中取得,所以这里直接用R.java中的id,作用是输出错误提示
           }
            String a = new String(decryResult);
            decodeText.setText(a);
       } catch (Exception e) {
           e.printStackTrace();
       }
    具体代码请看附件。
   有了java代码就可以移植到native层:
[C++] 纯文本查看 复制代码
#include <jni.h>
#include "com_qihoo_firsttest_Res.h"
 
/**
 * @author 花墨
 * 2015年1月6日
 * [url=http://www.cnhuamo.net]http://www.cnhuamo.net[/url]
 */
 
JNIEXPORT jbyteArray JNICALL Java_com_qihoo_firsttest_Res_decrypt
  (JNIEnv *env, jobject obj, jbyteArray src, jstring password){
 
    jclass clazz_random = env->FindClass("java/security/SecureRandom");
    jmethodID jm_random = env->GetMethodID(clazz_random,"<init>","()V");
    jobject jo_random = env->NewObject(clazz_random,jm_random);
 
    jclass clazz_String = env->FindClass("java/lang/String");
    jmethodID jm_string = env->GetMethodID(clazz_String,"getBytes","()[B");
    jbyteArray bytearray = (jbyteArray)env->CallObjectMethod(password,jm_string);
 
 
    jclass jc_DESKeySpec = env->FindClass("javax/crypto/spec/DESKeySpec");
    jmethodID jm_DESKeySpec = env->GetMethodID(jc_DESKeySpec,"<init>","([B)V");
    jobject jo_DESKeySpec = env->NewObject(jc_DESKeySpec,jm_DESKeySpec,bytearray);
 
    jclass jc_SecretKeyFactory = env->FindClass("javax/crypto/SecretKeyFactory");
    jmethodID jm_SecretKeyFactory = env->GetStaticMethodID(jc_SecretKeyFactory,"getInstance","(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;");
    jobject jo_getInstance = env->CallStaticObjectMethod(jc_SecretKeyFactory,jm_SecretKeyFactory,env->NewStringUTF("DES"));
 
    jmethodID jm_SecretKey = env->GetMethodID(jc_SecretKeyFactory,"generateSecret","(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;");
    jobject jo_SecretKey = env->CallObjectMethod(jo_getInstance,jm_SecretKey,jo_DESKeySpec);
 
    jclass jc_Cipher = env->FindClass("javax/crypto/Cipher");
    jmethodID jm_Cipher_getInstance = env->GetStaticMethodID(jc_Cipher,"getInstance","(Ljava/lang/String;)Ljavax/crypto/Cipher;");
    jobject jo_Cipher = env->CallStaticObjectMethod(jc_Cipher,jm_Cipher_getInstance,env->NewStringUTF("DES"));
 
    jmethodID jm_init = env->GetMethodID(jc_Cipher,"init","(ILjava/security/Key;Ljava/security/SecureRandom;)V");
    env->CallVoidMethod(jo_Cipher,jm_init,2,jo_SecretKey,jo_random);
 
    jmethodID jm_doFinal = env->GetMethodID(jc_Cipher,"doFinal","([B)[B");
    jbyteArray a = (jbyteArray)env->CallObjectMethod(jo_Cipher,jm_doFinal,src);
    return a;
}




最后附上javaC++源码(可直接编译运行)和原APK链接:

游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

精彩评论25

peterdocter    发表于 2015-1-7 11:31:59 | 显示全部楼层
花花也出干货:victory:

举报 使用道具

回复 支持 反对
小白    发表于 2015-1-7 11:37:08 | 显示全部楼层
学习一下,支持一下:lol

举报 使用道具

回复 支持 反对
Gloxy    发表于 2015-1-7 11:38:27 | 显示全部楼层
看看,之前遇到的一个应用也有这个壳

举报 使用道具

回复 支持 反对
fammer    发表于 2015-1-7 11:39:23 | 显示全部楼层
顶起来!!!{:3_54:}

举报 使用道具

回复
水波摇曳    发表于 2015-1-7 11:39:47 | 显示全部楼层
赞一个,以后好好试试
貌似抽抽还是谁 也有仔细写过一篇文档
学学Java就自己动手模仿下

举报 使用道具

回复 支持 反对
hackblan    发表于 2015-1-7 11:39:57 | 显示全部楼层
支持下啊。

举报 使用道具

回复
l569171196    发表于 2015-1-7 11:40:13 来自手机  | 显示全部楼层
支持!!!!!!

举报 使用道具

回复
ni350546294    发表于 2015-1-7 11:41:04 | 显示全部楼层
来学习一下                     

举报 使用道具

回复 支持 反对
zpd2009    发表于 2015-1-7 11:41:27 | 显示全部楼层
:loveliness:看看

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表