c++反编译工具_pc下载软件

c++反编译工具_pc下载软件  昨天在逆向某App的时候,发现有个加密工具类中的native方法是用C语言编写的,隐藏在so文件中。某大佬推荐逆向工具unidbg,能在pc端直接调用so文件中的函数,最终成功解决了问题。逆向工具之unidbg目录一、`unidbg`引入二、`unidbg`概述三、`unidbg`使用姿势1、下载`unidbg`项目2、导入到IDEA中①、解压压缩包②、打开`IDEA`,导入解压的项目3、测试`unidbg`4、运行自己的`so`文件①、编写`EncryptUtilsJni`类②、参数说明③、执行结果

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  昨天在逆向某App的时候,发现有个加密工具类中的native方法是用C语言编写的,隐藏在so文件中。某大佬推荐逆向工具unidbg,能在pc端直接调用so文件中的函数,最终成功解决了问题。

一、unidbg引入

  逆向某App,反编译dex得到Java代码,但是有两个加密工具类中的方法放到so文件中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  方法的实现用的C语言编写的,放在了so文件中。在Java中,动态加载so文件,使用native方法的形式隐藏了方法的方法体。难道伟大的逆向工程就此放弃?这显然不符合我们技术人的性格,肯定要想方设法弄出来。

二、unidbg概述

  unidbg 是一个基于 unicorn 的逆向工具,可以直接调用AndroidiOS中的 so 文件。项目的GitHub地址为https://github.com/zhkl0228/unidbg
  我使用unidbg,直接调用libbaseEncryptLib.solibencryptLib.so中的方法,这样就不用想破脑袋去逆向so文件了。

备 注 : \color{red}备注: :so文件是unix系统中的动态连接库,属于二进制文件,作用相当于windows系统中的.dll文件。在Android中也可调用动态库文件(*.so),一般会将加密算法、密码等重要的方法、信息使用C语言编写,然后编译成so文件,增强了软件的安全性

三、unidbg使用姿势

1、下载unidbg项目

  下载地址:https://github.com/zhkl0228/unidbg
在这里插入图片描述

2、导入到IDEA中

  unidbg项目用Java编写,并且上面下载的是一个标准的maven项目。我这里演示导入到IDEA中,如果你熟悉其它的IDE,也可以自己去弄。(顺带一提,如果你之前没接触过Java语言,要确保电脑安装好JDKmaven

①、解压压缩包

在这里插入图片描述

②、打开IDEA,导入解压的项目

在这里插入图片描述
  浏览到刚刚解压好的文件夹
在这里插入图片描述
在这里插入图片描述
  后面一路无脑next即可。。。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  第一次导入此项目会自动下载一些jar包,和网速、maven服务器有关,耐心等待吧。
在这里插入图片描述

3、测试unidbg

  项目中的src/test/java/com/xxxx/frameworks/core/encrypt路径中有一个TTEncrypt测试用例,直接执行其中的main方法。
在这里插入图片描述

  控制台打印相关调用信息,说明项目导入成功。
在这里插入图片描述

4、运行自己的so文件

  在前面,我们不是遇到了libbaseEncryptLib.solibencryptLib.so文件么,利用unidbg直接调用so文件中 的方法。下面演示调用libencryptLib.so文件中的getGameKey函数。

①、编写EncryptUtilsJni

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调用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 需要执行的so文件路径 * @param classPath 需要执行的函数所在的Java类路径 * @throws IOException */
    public EncryptUtilsJni(String soFilePath, String classPath) throws IOException { 
   
        // 创建app进程,包名可任意写
        emulator = new AndroidARMEmulator("cn.hestyle");
        Memory memory = emulator.getMemory();
        // 作者支持19和23两个sdk
        memory.setLibraryResolver(new AndroidResolver(23));
        // 创建DalvikVM,利用apk本身,可以为null
        vm = ((AndroidARMEmulator) emulator).createDalvikVM(null);
        // (关键处1)加载so,填写so的文件路径
        DalvikModule dm = vm.loadLibrary(new File(soFilePath), false);
        // 调用jni
        dm.callJNI_OnLoad(emulator);
        module = dm.getModule();
        // (关键处2)加载so文件中的哪个类,填写完整的类路径
        TTEncryptUtils = vm.resolveClass(classPath);
    }

    /** * 调用so文件中的指定函数 * @param methodSign 传入你要执行的函数信息,需要完整的smali语法格式的函数签名 * @param args 是即将调用的函数需要的参数 * @return 函数调用结果 */
    private String myJni(String methodSign, Object ...args) { 
   
        // 使用jni调用传入的函数签名对应的方法()
        Number ret = TTEncryptUtils.callStaticJniMethod(emulator, methodSign, args);
        // ret存放返回调用结果存放的地址,获得函数执行后返回值
        StringObject str = vm.getObject(ret.intValue() & 0xffffffffL);
        return str.getValue();
    }

    /** * 关闭模拟器 * @throws IOException */
    private void destroy() throws IOException { 
   
        emulator.close();
        System.out.println("emulator destroy...");
    }

    public static void main(String[] args) throws IOException { 
   
        // 1、需要调用的so文件所在路径
        String soFilePath = "src/test/resources/myso/libencryptLib.so";
        // 2、需要调用函数所在的Java类完整路径,比如a/b/c/d等等,注意需要用/代替.
        String classPath = "com/.../EncryptUtils";
        // 3、需要调用函数的函数签名,我这里调用EncryptUtils中的getGameKey方法,由于此方法没有参数列表,所以不需要传入
        String methodSign = "getGameKey()Ljava/lang/String;";
        EncryptUtilsJni encryptUtilsJni = new EncryptUtilsJni(soFilePath, classPath);
        // 输出getGameKey方法调用结果
        System.err.println(encryptUtilsJni.myJni(methodSign));
        encryptUtilsJni.destroy();
    }
}

②、参数说明

  EncryptUtilsJni类中最重要的设置为main方法中的soFilePathclassPathmethodSign三个参数,它们的作用在main方法中已经注释过了,这里再次解释一下。

soFilePath,填写你需要调用的so文件路径
classPath,填写你需要调用的函数所在Java类的完整类路径。
在这里插入图片描述
methodSign,填写你要调用的函数签名,语法为smali。(在jadx中,直接可以看smali代码)

在这里插入图片描述
备 注 : \color{red}备注: :如果你要调用的函数还需要传入参数,直接传入myJni方法中即可,myJni方法中省略args参数就是供你传入参数。

③、执行结果

在这里插入图片描述

四、分析so文件的IDA工具

  IDA工具是反汇编so文件的强大工具,由于libencryptLib.so文件比较简单,并且getGameKey函数返回的是一个常量,并没有复杂的处理过程,所以可以直接查看。

  首先用IDA打开libencryptLib.so文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  查看反汇编得到的代码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、总结

  unidbg确实很强大,直接在pc端模拟调用so文件,省去了反汇编逆向so文件的麻烦。上面的教程只演示了unidbg项目的导入、封装自己的调用so文件的API,其实这只是入门了,unidbg还支持断点调试so文件,也能导入到IDA中进行动态调试,自己去研究下吧,博主我也比较菜。
   若 是 喜 欢 , 可 以 素 质 三 连 一 下 \color{red}若是喜欢,可以素质三连一下 ???
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192006.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(2)


相关推荐

  • Keil(MDK-ARM)介绍、下载、安装与注册[通俗易懂]

    Keil(MDK-ARM)介绍、下载、安装与注册[通俗易懂]推荐分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang推荐在我的公众号「strongerHuang」或网站(www.strongerhuang.com)阅读以下教程:Keil系列教程01_Keil介绍、下载、安装与注册Keil系列教程02_新建基础软件…

  • 前端安全XSS和XSRF[通俗易懂]

    前端安全XSS和XSRF[通俗易懂]安全问题:常见的web前端攻击方式有哪些XSS跨站请求攻击XSRF跨站请求伪造XSS跨站请求攻击博客前端界面嵌入script脚本脚本内容:获取cookie发送到服务器(服务器配合跨域)发布博客,有人查看,可以轻松获取查看人的cookie信息XSS预防替换特殊字符。例如:<变成&It;>变成&gt,那么script就不会作为脚本执行可以使用https://www.npmjs.com/package/xss的xss工具XSRF跨站请求伪造(类似于钓鱼

  • python进制转换代码_十进制转八进制python

    python进制转换代码_十进制转八进制python本文实例讲述了Python实现的十进制小数与二进制小数相互转换功能。分享给大家供大家参考,具体如下:十进制小数⇒二进制小数乘2取整对十进制小数乘2得到的整数部分和小数部分,整数部分即是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止.第一次所得到为最高位,最后一次得到为最低位如:0.25的二进制0.25*2=…

  • 同居的童话(童话里王子和公主幸福的生活在一起)

    (一)从公交车上下来,一股热风扑面而来,身上立刻起了层鸡皮.空调车厢和外面燥热的阳光形成了巨大的反差,让我一阵哚唆.“靠,还真他妈热啊!”我站在车站上扯了扯T恤的领口,然后拎起那个装了自己全副家当的大箱子,艰难的走进了这个叫“浪琴屿”的“高尚小区”.对了,还是先介绍一下我自己吧.我姓邵,叫邵平,男,福建人,福州大学国际金融专业本科学历.老家在福州100多公里以南的一个小

  • 常用vbs代码[通俗易懂]

    常用vbs代码[通俗易懂] 将域用户或组添加到本地组SetobjGroup=GetObject(“WinNT://./Administrators”)SetobjUser=GetObject(“WinNT://testnet/Engineers”)objGroup.Add(objUser.ADsPath)修改本地管理员密码Setobjcnlar=GetObject(“WinNT://./a

  • smtp邮件服务器配置,配置SMTP服务器[通俗易懂]

    smtp邮件服务器配置,配置SMTP服务器[通俗易懂]原标题:配置SMTP服务器的全称是“SimpleMailTransferProtocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。配置SMTP服务器SMTP认证,简单地说就是要求必须在提供了账户名和密码…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号