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

时间:2016-02-25 00:39:36

标签: java portable-executable disassembly

我将PortEx Java library for PE32 parsing与Capstone反汇编程序一起使用,我希望能够让反汇编代替deployedApp = getMBean('/Partitions/'+${partition}+'/ResourceGroups/'+${resource_group}+'/AppDeployments/'+appName>) 行{{1} }}。为此,我需要从导入表导入。我能够获取DLL名称和函数,但PortEx报告的地址很远,例如:penet Python模块报告的0x32E8与0x402004。我尝试将一些偏移视为PortEx中call 0x404040call SomeDLL:TheFuncImportSection类的一部分,但它并未接近。任何想法?

ImportDLL

我希望能够从汇编代码中获取地址,看看它是否在NameImport中,如果是,请将地址替换为{{1}中的值}}

1 个答案:

答案 0 :(得分: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;
}