反编译C & JAVA代码

JAVA

JADX

C

nm -D(对动态库)或strings解出来的函数声明,用c++filt能还原参数类型。
静态用IDA,动态用frida,二者结合。

IDA 7.5

由于没有回退功能,多拍快照。

data_on 64bit devicebits
byte33
bytechar8
wordshort16
dwordint, float32
qwordlong, long long, double, size_t, void*64
xmmword / oword=8words4 ints, 2 doubles128
ymmword256

IDA中的_OWORD
Fundamental types
32位机器和64位机器中int、char等数据类型所占字节长度对比
Porting C++ codes to the 64-bit platform

IDAPython (介绍)

函数

  1. 用第一选项new或第一选项打开已有库或程序
  2. 左侧函数窗口.text的区段是函数定义,找到目标函数(可用^f搜索)双击,显示汇编代码
  3. 在汇编代码窗口F5显示C代码
  4. 双击伪代码中的函数进行跳转
  5. 在伪代码中按x,选XR或BL行,跳转到当前函数的调用处
  6. 在变量处右键选convert to structure*,或按y,修改变量类型(工具解析的可能有误)的显示
  7. 在变量处按n修改变量名的显示
  8. 在数字常量上按右键转换进制显示
插件:

将文件放到Plugin目录,在IDA->Edit->Plugins找到对应插件。重启失效。
IDA_FunctionStringAssociate_PlugIn 能在函数前面加一行显示原文件名等

结构

  1. 欲分析原代码中的结构,只能自己定义:Edit->Add struct type;或在View->Open subviews->Structures窗口(可见已有四个Elf32/64结构,这些是程序默认需要的)按[Insert]
  2. 建好空结构后,按d添加一个成员
  3. 右键,对这个为了填充所有内容的成员进行重命名
  4. 右键,Expand struct将此成员大小设置为整个结构大小-1
  5. 按g并输入大小跳转到结尾或开头
  6. 在无名成员处按d生成默认名称
  7. 在数字成员类型上按d切换其类型——byte, word=2bytes, d(-ouble)word, q(-uater)word
  8. 改好类型后,再对成员重命名为需要的内容
  9. 在末尾按d添加成员
  10. 回到伪代码页面,修改变量类型为建好的结构后,按F5刷新,就能更新为定义的成员名称了
  11. 有不同名称指向同一变量时,按=将其指代

在结构定义页,

  • 在原有默认结构之间或之前定义结构,容易伤及无辜,造成无法识别JNI定义的结构(如JNIEnv, JavaVM)等
  • 删除(u)最后一个定义的成员时,包括它之前连续的未定义成员的空间都会删除

在本地类型(local types)页,

  • 按Insert添加类型时,可写结构的源代码
  • 按^E可修改结构的源代码

REF

frida

动态查看有根权限手机上进程的内存

  1. 安装python3.8,3.9,conda均可
  2. pip3 install Frida
  3. pip3 install frida-tools
  4. frida-ps –U显示手机上所有进程
  5. 安装node.js后,用npm i @types/frida-gum即可在VS CODE中编译脚本
  6. 下载手机对应的变种frida-server-16.1.7-android-arm64,并在手机上运行:
adb push frida-server-16.1.7-android-arm64  /data/local/tmp/
adb root 
adb shell /data/local/tmp/frida-server-16.1.7-android-arm64
  1. frida -U '进程名' -l 脚本名

下面是脚本示例

function callinitFun(base_address) {
    var real_addr = base_address.add(0xXX)
    var init_function = new NativeFunction(real_addr,"int",["pointer"] )
    var input = "/system/etc/test_config.json";
    var arg1= Memory.allocUtf8String(input);
    init_function(arg1)
    console.log("call init_function success");
}

function hook_native() {
    var baseaddress = Module.findBaseAddress("libTest.so");
    if (baseaddress) {
        //从输入参数找到算法加密的过程
        console.log("baseaddress: ", baseaddress);
        let my_struct_length = 0xXX;
        var initConfigAddr = baseaddress.add(0xXX);
        Interceptor.attach(initConfigAddr, {
            onEnter: function (args) {
                this.arg0 = args[0];
                console.log("initConfigAddr onEnter:", ptr(this.arg0).readCString());
                console.log("initConfigAddr hexdump :", hexdump(args[0],  {  length: my_struct_length} ));
            }, onLeave: function (retval) {
                console.log("initConfigAddr onLeave:", ptr(retval));
                console.log("initConfigAddr hexdump :", hexdump(this.arg0, {  length: my_struct_length} ));
            }
        });
        callinitFunc(baseaddress);
    }
}
function main() {
    hook_native();
}
setImmediate(main);

鸣谢

Chaohao为IDA & frida提供帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我是一名语言模型AI助手,无法操作您所说的“class批量反编译java”操作,但是可以为您提供相关信息。 Java中的class文件是Java代码编译生成的字节码文件,反编译class文件可以将其转换回Java代码。有许多工具可以用于反编译class文件,例如Java Decompiler、JD-GUI、JAD等。这些工具可以将单个class文件反编译Java代码,但无法批量处理。 如果您需要批量反编译class文件,可以使用脚本编程语言(例如Python)编写脚本来自动化处理。通过脚本,您可以遍历目录中的所有class文件,并将它们转换为Java代码。以下是一个Python脚本示例: ```python import os import subprocess def decompile_class_file(class_file_path): """ 反编译单个class文件 """ output_path = class_file_path.replace('.class', '.java') cmd = f"javap -c -p -s -verbose -l {class_file_path}" with open(output_path, 'w') as f: subprocess.call(cmd, stdout=f) def decompile_all_class_files(directory): """ 反编译目录下所有class文件 """ for root, dirs, files in os.walk(directory): for file in files: if file.endswith('.class'): file_path = os.path.join(root, file) decompile_class_file(file_path) if __name__ == '__main__': decompile_all_class_files('/path/to/directory') ``` 此脚本使用javap命令反编译class文件,并将其输出为Java文件。您可以将此脚本保存为.py文件,然后在命令行中运行它,以批量反编译目录中的所有class文件。请确保在运行脚本之前,您已经安装了Java开发工具包(JDK)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值