《教我兄弟學Android逆向番外04 OLLVM混淆環境搭建》
論壇原創作者賬號:會飛的丑小鴨
課程導航:
《教我兄弟學Android逆向01 編寫第一個Android程序》
《教我兄弟學Android逆向02 破解第一個Android程序 》
《教我兄弟學Android逆向03 破解第一個Android游戲 》
《教我兄弟學Android逆向04 動態調試smali代碼 》
《教我兄弟學Android逆向05 在smali代碼中插入Log 》
《教我兄弟學Android逆向06 用AndroidStudio編寫第一個so》
《教我兄弟學Android逆向09 IDA動態破解登陸驗證》
《教我兄弟學Android逆向11 動態調試init_array》
番外篇導航:
《教我兄弟學Android逆向番外01 apktool的使用》
《教我兄弟學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;">