有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用PortEx从导入表中获取DLL、函数名和地址?

我将PortEx Java library for PE32 parsing与Capstone反汇编程序一起使用,我希望能够让反汇编程序将适当的call 0x404040行替换为类似call SomeDLL:TheFunc的行。为此,我需要从导入表中导入。我能够获得DLL名称和函数,但PortEx报告的地址与之相差甚远,例如:0x32E8与pefile Python模块报告的0x402004。我已经尝试将一些偏移量作为PortEx中的ImportSectionImportDLLNameImport类的一部分来查看,但没有接近。有什么想法吗

import com.github.katjahahn.parser.*;
public class ImportsExtractor {
    public static Map<Integer,String> extract(PEData exe) throws IOException {
        Map<Integer,String> importList = new HashMap<>();

        SectionLoader loader = new SectionLoader(exe);
        ImportSection idata = loader.loadImportSection();
        List<ImportDLL> imports = idata.getImports();
        for(ImportDLL dll : imports) {
            for(NameImport nameImport : dll.getNameImports()) {
                long addr = nameImport.getRVA(); // Some offset needed?
                System.out.format("0x%X\t%s:%s%n", addr, dll.getName(), nameImport.getName());
                importList.put((int)addr, dll.getName() + ":" + nameImport.getName());
            }
        }
        return importList;
    }
}

我希望能够从一行程序集中获取地址,看看它是否在importList中,如果是,用importList中的值替换地址


共 (1) 个答案

  1. # 1 楼答案

    作者:

    public static Map<Integer,String> extract(PEData exe) throws IOException {
        Map<Integer,String> importList = new HashMap<>();
    
        SectionLoader loader = new SectionLoader(exe);
        ImportSection idata = loader.loadImportSection();
        List<ImportDLL> imports = idata.getImports();
        for(ImportDLL dll : imports) {
            for(NameImport nameImport : dll.getNameImports()) {
                long iat = nameImport
                        .getDirEntryValue(DirectoryEntryKey.I_ADDR_TABLE_RVA);
                long ilt = nameImport
                        .getDirEntryValue(DirectoryEntryKey.I_LOOKUP_TABLE_RVA);
                long imageBase = exe.getOptionalHeader().get(
                        WindowsEntryKey.IMAGE_BASE);
                long addr = nameImport.getRVA() + imageBase;
                if(ilt != 0) addr = addr - ilt + iat;
                System.out.format("0x%X\t%s:%s%n", addr, dll.getName(), nameImport.getName());
                importList.put((int)addr, dll.getName() + ":" + nameImport.getName());
            }
        }
    
        return importList;
    }