我可以阻止 Ghidra 创建扩展引用吗?

逆向工程 拆卸 反汇编者 吉德拉
2021-06-24 09:23:42

我正在尝试使用 Ghidra 拆卸一些 6502。以下(先决条件:POSIX 风格的 shell,Python 2.x)将生成一个名为的文件test.dat,用于演示该问题:

python -c "open('test.dat','wb').write(''.join([chr(x) for x in [0xa2,0xa3,0xa9,0x00,0x9d,0x40,0x00,0xca,0x10,0xfa,0x60]]))"

然后,来自 Ghidra:

  1. 创建新项目(任何你喜欢的地方)
  2. test.dat上面创建的导入,语言为6502/defaultBase Address0x400
  3. 双击test.datActive Project去的CodeBrowser窗口
  4. 提供分析时说“不”
  5. 到 $400 位置按 D 拆卸

拆机时间很短。

                             //
                             // RAM 
                             // fileOffset=0, length=11
                             // RAM: 0400-040a
                             //
            0400 a2 a3           LDX        #0xa3
            0402 a9 00           LDA        #0x0
                             LAB_0404                                        XREF[1]:     0408(j)  
            0404 9d 40 00        STA        $0x40,X=>DAT_00e3                                = ??
            0407 ca              DEX
            0408 10 fa           BPL        LAB_0404
            040a 60              RTS

这里的奇怪之处在于,它不是为$0040表的基地址生成一个标签,而是为$00e3访问的第一个字节生成一个标签,就好像 X 是一个 TOC 指针,或类似的,而 $0040 是偏移量。这不适用于 6502 代码。

在这个小例子中,我可以右键单击并手动修复引用,但我不介意承认我不想对整个程序执行此操作。6502 代码充满了这些东西。

我能阻止这种情况发生吗?

(我在尝试遵循提供的 Java 源代码时迷路了!-但我确实发现这种引用被称为扩展引用,并且似乎对所有目标都是通用的。我在文档中找不到任何内容但是,关于这些,或如何禁用它们。)

2个回答

要摆脱这些引用,您需要禁用位于分析选项(分析 -> 自动分析 ...)中的“基本常数参考分析器”

在此之后,选择您的代码并清除它(默认为 C 热键),然后再次反汇编。

还没有使用 ghidra,但在radare2 上检查你的字节似乎拆卸是正确的

C:\>radare2 -
[0x00000000]> e io.cache = true
[0x00000000]> w \xa2\xa3\xa9\x00\x9d\x40\x00\xca\x10\xfa\x60
[0x00000000]> px 10
- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
0x00000000  a2a3 a900 9d40 00ca 10fa                 .....@....
[0x00000000]> e asm.arch = 6502
[0x00000000]> pd 6
            0x00000000      a2a3           ldx #0xa3
            0x00000002      a900           lda #0x00
        .-> 0x00000004      9d4000         sta 0x0040,x  //(0xa3 + 0x40 == 0xe3)
        :   0x00000007      ca             dex
        `=< 0x00000008      10fa           bpl 0x000004
            0x0000000a      60             rts
[0x00000000]> af
[0x00000000]> pdc
function fcn.00000000 () {
    //  3 basic blocks
    loc_0x0:

       x = #0xa3
       a = #0x00
   do
   {
        loc_0x4:

           [0x0040+x ] = a
           dex
           bpl 0x000004             //unlikely
       } while (?);
  return;

    loc_0xa:

       rts
(break)