《教我兄弟學Android逆向番外04 OLLVM混淆環境搭建》


 

《教我兄弟學Android逆向番外04 OLLVM混淆環境搭建》

吾愛pojie 吾愛破解論壇

論壇原創作者賬號:會飛的丑小鴨

課程導航:

《教我兄弟學Android逆向01 編寫第一個Android程序》

《教我兄弟學Android逆向02 破解第一個Android程序 》

《教我兄弟學Android逆向03 破解第一個Android游戲 》

《教我兄弟學Android逆向04 動態調試smali代碼 》

《教我兄弟學Android逆向05 在smali代碼中插入Log 》

《教我兄弟學Android逆向06 用AndroidStudio編寫第一個so》

《教我兄弟學Android逆向07 IDA破解第一個so》

《教我兄弟學Android逆向08 IDA爆破簽名驗證》

《教我兄弟學Android逆向09 IDA動態破解登陸驗證》

《教我兄弟學Android逆向10 靜態分析反調試apk》

《教我兄弟學Android逆向11 動態調試init_array》

 

番外篇導航:

《教我兄弟學Android逆向番外01 apktool的使用》

《教我兄弟學Android逆向番外02 jeb工具的使用》

《教我兄弟學Android逆向番外03 Android逆向必會命令》

 

一 簡介
LLVM:一個編譯器,用來編譯so和可執行文件等
OLLVM:在LLVM的基礎上去混淆so

二 OLLVM混淆環境搭建
1.環境配置
虛擬機:VMware
系統:Ubuntu-12.04.5-64位(這里也測試了另一個linux系統ubuntu-17.10.1-64位 編譯不出來,編譯ollvm缺少clang)
OLLVM版本:obfuscator-llvm-3.4
ndk版本:android-ndk32-r10b-linux-x86_64.tar

三 編譯ollvm
1 安裝編譯工具
執行兩條linux命令
apt-get install cmake
apt-get install g++

2.復制ollvm壓縮包到linux系統
將附件里面的obfuscator-llvm-3.4復制到虛擬機linux系統下的Home/Pictures/android/llvm (對於ubuntu系統12.04版本這里建議在Picture目錄下編譯操作 ,如果放到其他位置編譯即使給了su權限最后的時候還是提示權限不足,這里未解決.其他linux系統請自行測試)
<ignore_js_op>

3.在obfuscator-llvm-3.4目錄下創建build目錄並用命令行在build目錄下執行 cmake -DCMAKE_BUILD_TYPE:String=Release ../ 命令
<ignore_js_op>

4.執行完成后再執行命令 make -j7 這個編譯會很等待長時間 等編譯完成后會在build目錄下生成bin和lib目錄 
<ignore_js_op>

5.如果build目錄下有lib和bin目錄並且bin目錄里面有clang文件 代表編譯成功 否則為編譯失敗 編譯失敗后面的操作就不能進行了  請檢查編譯失敗的原因 如解決不了建議更換OLLVM版本測試或者更換linux系統重新進行以上步驟
<ignore_js_op>

四 ndk配置環境變量
1.將附件中 android-ndk-r10b復制到虛擬機ndk目錄下 並解壓
<ignore_js_op>

2執行命令sudo gedit /etc/profile 然后在彈出的profile文件最后添加下面命令注意NDK_HOME為自己ndk目錄   保存后退出 
export NDK_HOME=/home/heyiran/Pictures/android/ndk/
export PATH=$NDK_HOME:$PATH
<ignore_js_op>

3.執行命令 source /etc/profile 使上面更改生效

4.執行命令ndk-build如果出現以下提示 代表品ndk環境變量配置成功
<ignore_js_op>

5.如果環境變量未生效可以嘗試將內容添加在“~/.bashrc”文件內

$sudo gedit ~/.bashrc

五 整合ollvm到ndk中
1.進入到ndk目錄下的toolchains目錄並拷貝llvm-3.3文件夾到當前目錄並重命名為obfuscator-llvm-3.4
<ignore_js_op>

2.將obfuscator-llvm-3.4/prebuilt/linux-x86_64 目錄下的bin和lib目錄替換成obfuscator-llvm-3.4/build目錄下的bin和lib
<ignore_js_op>

3.將ndk/toolchains目錄下的arm-linux-androideabi-clang3.4,mipsel-linux-android-clang3.4,x86-clang3.4這三個目錄拷貝到當前目錄並重命名為
arm-linux-androideabi-obfuscator3.4
mipsel-linux-android-obfuscator3.4
x86-obfuscator3.4
並將拷貝后文件夾里面的setup.mk 文件中的 LLVM_NAME 的值都更改為
LLVM_NAME := obfuscator-llvm-$(LLVM_VERSION)
注意:拷貝后的三個文件夾都要更改
<ignore_js_op>

<ignore_js_op>

六.通過ndk編譯出混淆后的so
1.在Pictures/android/test/hello/jni目錄下新建Android.mk,Application.mk和hello.c目錄
<ignore_js_op><ignore_js_op style="color:rgb(68, 68, 68);">

<ignore_js_op>

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello

LOCAL_SRC_FILES := hello.c

LOCAL_CFLAGS +=  -mllvm -sub -mllvm -bcf -mllvm -fla

LOCAL_ARM_MODE := arm

LOCAL_PROGUARD_ENABLED:= disabled

include $(BUILD_SHARED_LIBRARY)

 

 

Application.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

APP_ABI := armeabi

NDK_TOOLCHAIN_VERSION := obfuscator3.4

include $(BUILD_SHARED_LIBRARY)

 

hello.c:

#include <stdio.h>

#include <fcntl.h>

#include <elf.h>

#include <stdlib.h>

#include <string.h>

#include <jni.h>

 

char * a(char* Text);

 

static jstring JNICALL serial(JNIEnv *env, jobject class,jstring user)

{

   char *c_user = (*env)->GetStringUTFChars(env,user,0);

   char * pass = a("Tm|hjllv|o");

 

    if(strcmp(c_user,pass)==0)

    {

     return (*env)->NewStringUTF(env,"successful!");

    }

    else

    {

     return (*env)->NewStringUTF(env,"wrong password!");

    }

 

}

 

char * a(char* Text)

{

    char secretText[128]={'\0'};

    int count=0;

    int i;

    count = strlen(Text);

    for(i=0;i<count;i++){

        secretText[i]=Text[i]-i-1;

    }

    secretText[i] = '\0';

    return secretText;

}

 

static const JNINativeMethod gMethods[] = {

// {"check", "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (jstring*)check},

        {"check", "(Ljava/lang/String;)Ljava/lang/String;", (jstring*)serial}

// {"checkport", "()V", (jstring*)checkport}

};

 

static jclass myClass;

 

static const char* const kClassName="demo2/jni/com/myapplication/myJNI";

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){

        JNIEnv* env = NULL;

        jint result = -1;

        if((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4) != JNI_OK)

                return -1;

        myClass = (*env)->FindClass(env, kClassName);

        

        if(myClass == NULL)

        {

                printf("cannot get class:%s\n", kClassName);

                return -1;

        }

        if((*env)->RegisterNatives(env,myClass,gMethods,sizeof(gMethods)/sizeof(gMethods[0]))<0)

        {

                printf("register native method failed!\n");

                return -1;

        }

        printf("--------JNI_OnLoad-----");

        return JNI_VERSION_1_4;

}

<ignore_js_op><ignore_js_op>

<ignore_js_op>2.在jni目錄下執行命令ndk-build 發現hello目錄下已經生成了libs和obj目錄 將libs目錄下的libhello.so復制到windows系統並用IDA打開 發現代碼已經被混淆 
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>
<ignore_js_op>

<ignore_js_op><ignore_js_op>

<ignore_js_op><ignore_js_op>附件鏈接:https://pan.baidu.com/s/1zO4hks94b-HJZVNCyTxYSg 

<ignore_js_op><ignore_js_op>密碼:aio6

<ignore_js_op><ignore_js_op>

<ignore_js_op><ignore_js_op>七 參考資料<ignore_js_op><ignore_js_op>
《OLLVM4.0+NDK編譯環境搭建》:https://blog.csdn.net/SilenceCoder/article/details/79401147

<ignore_js_op><ignore_js_op>

<ignore_js_op><ignore_js_op>《ollvm的混淆反混淆和定制修改》:

<ignore_js_op><ignore_js_op>https://www.52pojie.cn/thread-609511-1-1.html<ignore_js_op><ignore_js_op>

<ignore_js_op><ignore_js_op>

--官方論壇

www.52pojie.cn

 

--推薦給朋友

公眾微信號:吾愛破解論壇

或搜微信號:pojie_52

    閱讀原文
     

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM