c++反编译工具_pc下载软件(C++入门教程)
??昨天在逆向某App的時(shí)候,發(fā)現(xiàn)有個(gè)加密工具類(lèi)中的native方法是用C語(yǔ)言編寫(xiě)的,隱藏在so文件中。某大佬推薦逆向工具unidbg,能在pc端直接調(diào)用so文件中的函數(shù),最終成功解決了問(wèn)題。
一、unidbg引入
??逆向某App,反編譯dex得到Java代碼,但是有兩個(gè)加密工具類(lèi)中的方法放到so文件中。
??方法的實(shí)現(xiàn)用的C語(yǔ)言編寫(xiě)的,放在了so文件中。在Java中,動(dòng)態(tài)加載so文件,使用native方法的形式隱藏了方法的方法體。難道偉大的逆向工程就此放棄?這顯然不符合我們技術(shù)人的性格,肯定要想方設(shè)法弄出來(lái)。
二、unidbg概述
??unidbg 是一個(gè)基于 unicorn 的逆向工具,可以直接調(diào)用Android和iOS中的 so 文件。項(xiàng)目的GitHub地址為https://github.com/zhkl0228/unidbg
??我使用unidbg,直接調(diào)用libbaseEncryptLib.so、libencryptLib.so中的方法,這樣就不用想破腦袋去逆向so文件了。
備 注 : \color{red}備注: 備注:so文件是unix系統(tǒng)中的動(dòng)態(tài)連接庫(kù),屬于二進(jìn)制文件,作用相當(dāng)于windows系統(tǒng)中的.dll文件。在Android中也可調(diào)用動(dòng)態(tài)庫(kù)文件(*.so),一般會(huì)將加密算法、密碼等重要的方法、信息使用C語(yǔ)言編寫(xiě),然后編譯成so文件,增強(qiáng)了軟件的安全性。
三、unidbg使用姿勢(shì)
1、下載unidbg項(xiàng)目
??下載地址:https://github.com/zhkl0228/unidbg
2、導(dǎo)入到IDEA中
??unidbg項(xiàng)目用Java編寫(xiě),并且上面下載的是一個(gè)標(biāo)準(zhǔn)的maven項(xiàng)目。我這里演示導(dǎo)入到IDEA中,如果你熟悉其它的IDE,也可以自己去弄。(順帶一提,如果你之前沒(méi)接觸過(guò)Java語(yǔ)言,要確保電腦安裝好JDK、maven)
①、解壓壓縮包
②、打開(kāi)IDEA,導(dǎo)入解壓的項(xiàng)目
??瀏覽到剛剛解壓好的文件夾
??后面一路無(wú)腦next即可。。。
??第一次導(dǎo)入此項(xiàng)目會(huì)自動(dòng)下載一些jar包,和網(wǎng)速、maven服務(wù)器有關(guān),耐心等待吧。
3、測(cè)試unidbg
??項(xiàng)目中的src/test/java/com/xxxx/frameworks/core/encrypt路徑中有一個(gè)TTEncrypt測(cè)試用例,直接執(zhí)行其中的main方法。
??控制臺(tái)打印相關(guān)調(diào)用信息,說(shuō)明項(xiàng)目導(dǎo)入成功。
4、運(yùn)行自己的so文件
??在前面,我們不是遇到了libbaseEncryptLib.so、libencryptLib.so文件么,利用unidbg直接調(diào)用so文件中 的方法。下面演示調(diào)用libencryptLib.so文件中的getGameKey函數(shù)。
①、編寫(xiě)EncryptUtilsJni類(lèi)
package cn.hestyle;
import com.github.unidbg.Module;
import com.github.unidbg.arm.ARMEmulator;
import com.github.unidbg.linux.android.AndroidARMEmulator;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import java.io.File;
import java.io.IOException;
/** * description: EncryptUtils調(diào)用so * * @author hestyle * @version 1.0 * @className unidbg->EncryptUtilsJni * @date 2020-05-20 22:01 **/
public class EncryptUtilsJni extends AbstractJni {
// ARM模擬器
private final ARMEmulator emulator;
// vm
private final VM vm;
// 載入的模塊
private final Module module;
private final DvmClass TTEncryptUtils;
/** * * @param soFilePath 需要執(zhí)行的so文件路徑 * @param classPath 需要執(zhí)行的函數(shù)所在的Java類(lèi)路徑 * @throws IOException */
public EncryptUtilsJni(String soFilePath, String classPath) throws IOException {
// 創(chuàng)建app進(jìn)程,包名可任意寫(xiě)
emulator = new AndroidARMEmulator("cn.hestyle");
Memory memory = emulator.getMemory();
// 作者支持19和23兩個(gè)sdk
memory.setLibraryResolver(new AndroidResolver(23));
// 創(chuàng)建DalvikVM,利用apk本身,可以為null
vm = ((AndroidARMEmulator) emulator).createDalvikVM(null);
// (關(guān)鍵處1)加載so,填寫(xiě)so的文件路徑
DalvikModule dm = vm.loadLibrary(new File(soFilePath), false);
// 調(diào)用jni
dm.callJNI_OnLoad(emulator);
module = dm.getModule();
// (關(guān)鍵處2)加載so文件中的哪個(gè)類(lèi),填寫(xiě)完整的類(lèi)路徑
TTEncryptUtils = vm.resolveClass(classPath);
}
/** * 調(diào)用so文件中的指定函數(shù) * @param methodSign 傳入你要執(zhí)行的函數(shù)信息,需要完整的smali語(yǔ)法格式的函數(shù)簽名 * @param args 是即將調(diào)用的函數(shù)需要的參數(shù) * @return 函數(shù)調(diào)用結(jié)果 */
private String myJni(String methodSign, Object ...args) {
// 使用jni調(diào)用傳入的函數(shù)簽名對(duì)應(yīng)的方法()
Number ret = TTEncryptUtils.callStaticJniMethod(emulator, methodSign, args);
// ret存放返回調(diào)用結(jié)果存放的地址,獲得函數(shù)執(zhí)行后返回值
StringObject str = vm.getObject(ret.intValue() & 0xffffffffL);
return str.getValue();
}
/** * 關(guān)閉模擬器 * @throws IOException */
private void destroy() throws IOException {
emulator.close();
System.out.println("emulator destroy...");
}
public static void main(String[] args) throws IOException {
// 1、需要調(diào)用的so文件所在路徑
String soFilePath = "src/test/resources/myso/libencryptLib.so";
// 2、需要調(diào)用函數(shù)所在的Java類(lèi)完整路徑,比如a/b/c/d等等,注意需要用/代替.
String classPath = "com/.../EncryptUtils";
// 3、需要調(diào)用函數(shù)的函數(shù)簽名,我這里調(diào)用EncryptUtils中的getGameKey方法,由于此方法沒(méi)有參數(shù)列表,所以不需要傳入
String methodSign = "getGameKey()Ljava/lang/String;";
EncryptUtilsJni encryptUtilsJni = new EncryptUtilsJni(soFilePath, classPath);
// 輸出getGameKey方法調(diào)用結(jié)果
System.err.println(encryptUtilsJni.myJni(methodSign));
encryptUtilsJni.destroy();
}
}
②、參數(shù)說(shuō)明
??EncryptUtilsJni類(lèi)中最重要的設(shè)置為main方法中的soFilePath、classPath、methodSign三個(gè)參數(shù),它們的作用在main方法中已經(jīng)注釋過(guò)了,這里再次解釋一下。
soFilePath,填寫(xiě)你需要調(diào)用的so文件路徑
classPath,填寫(xiě)你需要調(diào)用的函數(shù)所在Java類(lèi)的完整類(lèi)路徑。
methodSign,填寫(xiě)你要調(diào)用的函數(shù)簽名,語(yǔ)法為smali。(在jadx中,直接可以看smali代碼)
備 注 : \color{red}備注: 備注:如果你要調(diào)用的函數(shù)還需要傳入?yún)?shù),直接傳入myJni方法中即可,myJni方法中省略args參數(shù)就是供你傳入?yún)?shù)。
③、執(zhí)行結(jié)果
四、分析so文件的IDA工具
??IDA工具是反匯編so文件的強(qiáng)大工具,由于libencryptLib.so文件比較簡(jiǎn)單,并且getGameKey函數(shù)返回的是一個(gè)常量,并沒(méi)有復(fù)雜的處理過(guò)程,所以可以直接查看。
??首先用IDA打開(kāi)libencryptLib.so文件
??查看反匯編得到的代碼。
五、總結(jié)
??unidbg確實(shí)很強(qiáng)大,直接在pc端模擬調(diào)用so文件,省去了反匯編逆向so文件的麻煩。上面的教程只演示了unidbg項(xiàng)目的導(dǎo)入、封裝自己的調(diào)用so文件的API,其實(shí)這只是入門(mén)了,unidbg還支持?jǐn)帱c(diǎn)調(diào)試so文件,也能導(dǎo)入到IDA中進(jìn)行動(dòng)態(tài)調(diào)試,自己去研究下吧,博主我也比較菜。
?? 若 是 喜 歡 , 可 以 素 質(zhì) 三 連 一 下 \color{red}若是喜歡,可以素質(zhì)三連一下 若是喜歡,可以素質(zhì)三連一下???
總結(jié)
以上是生活随笔為你收集整理的c++反编译工具_pc下载软件(C++入门教程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Chrome每次打开时报的关于扩展程序的
- 下一篇: SAP云平台上的Fiori admini