ZBLOG

import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import ghidra.app.script.GhidraScript; import ghidra.program.model.address.Address; import ghidra.program.model.l...

根据您提供的代码,重复结果可能是由于在代码块内部多次迭代同一条指令所导致的。具体来说,在while循环中,使用了一个CodeUnitIterator来迭代函数中的所有指令,但并没有判断当前指令是否已经处理过。

解决这个问题的方法是在处理每条指令之前添加一个条件判断,检查它是否已经处理过。可以使用一个Set数据结构来记录已经处理过的地址,确保不会重复处理同一条指令。以下是相应的修改建议:

// 在类定义处添加import语句
import java.util.HashSet;
import java.util.Set;

// ...

public class Hello00 extends GhidraScript {
    // ...

    @Override
    public void run() throws Exception {
        // ...
        Set<Address> processedAddresses = new HashSet<>(); // 用于记录已处理过的地址

        for (Function function : functionManager.getFunctions(true)) {
            CodeUnitIterator codeUnitIterator = listing.getCodeUnits(function.getEntryPoint(), true);
            Address prevBlockAddr = null;
            Address currentBlockAddr = null;

            while (codeUnitIterator.hasNext()) {
                CodeUnit codeUnit = codeUnitIterator.next();
                if (codeUnit instanceof Instruction) {
                    currentBlockAddr = codeUnit.getMinAddress();

                    if (!processedAddresses.contains(currentBlockAddr)) { // 检查当前地址是否已经处理过
                        processedAddresses.add(currentBlockAddr); // 将当前地址添加到已处理集合中

                        if (prevBlockAddr != null) {
                            JsonObject controlFlowTriple = new JsonObject();
                            controlFlowTriple.addProperty("函数", function.getName());
                            controlFlowTriple.addProperty("控制逻辑类型", getControlType(prevBlockAddr, currentBlockAddr, listing));
                            controlFlowTriple.addProperty("目标函数", getFunctionNameOfNextBlock(currentBlockAddr, listing, functionCache));
                            triples.add(controlFlowTriple);
                        }

                        prevBlockAddr = currentBlockAddr;
                    }
                }
            }
        }

        // ...
    }

    // ...
}

通过添加上述修改,将在处理每条指令之前检查其是否已经被处理过,并且使用一个Set数据结构记录已处理的地址。这样可以确保结果中不会出现重复的控制流信息。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=13592

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?