我正在尝试使用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中进行:


创建新项目(随您喜欢)
导入上面创建的test.dat,语言为6502 / defaultBase Address为0x400
双击test.dat中的Active Project进入在CodeBrowser窗口中
说提供分析时不显示
转到位置$ 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        q4312078qx40,X=>DAT_00e3                                = ??
            0407 ca              DEX
            0408 10 fa           BPL        LAB_0404
            040a 60              RTS


奇怪的是,它不是为表的基地址q4312079qe340生成标签,而是为q4312079q(访问的第一个字节)生成一个标签,就像X是TOC指针一样,或者类似,$ 0040是偏移量。这不适用于6502代码。在这个小示例中,我可以右键单击并手动修复引用,但是我不介意承认我不想做这对于整个程序。 6502代码中充满了这些东西。

我可以阻止这种情况发生吗?

(尝试遵循所提供的Java源代码,我迷失了!-但我确实知道了这类参考称为扩展参考,并且似乎是所有目标通用的。尽管如此,我还是在文档中找不到关于这些参考或如何禁用它们的任何信息。)

评论

嗨,欢迎来到RE.SE。这听起来很具体,我们所有人都没有像幽灵一样工作,他们只是在学习使用Ghidra。我强烈建议您将您的请求带到GitHub项目,然后在那打开一个问题。到目前为止,鉴于您的详细信息,这看起来更像是一个缺陷。

供将来参考:有人为此提出了GitHub问题。参见github.com/NationalSecurityAgency/ghidra/issues/201

#1 楼

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

之后,选择您的代码并清除它(默认情况下为C热键),然后再次拆卸。

评论


太好了,谢谢-这看起来很有希望,并会停止创建虚假的DAT_00e3标签,但是没有为地址0x40创建标签,因此从我的角度来看,这仍然不是一个解决方案。但这可能是达到最佳效果的(我怀疑6502在他们的优先级列表中居高不下...),因此,如果看起来像这样,我将很乐意接受此作为答案。它确实为我提供了一些在代码中寻找的东西。

–汤姆·塞登(Tom Seddon)
19 Mar 10 '19在18:31



据我所知,它是如何工作的,是ConstantPropagationAnalyzer模拟程序指令的p代码(内部ghidra表示形式),一旦它从地址中看到负载,就创建一个引用。现在,它看到的地址是计算结果0xE3,因此这就是它添加的引用。您可能需要为6502编写一个自定义分析器,该分析器将使用原始指令(而不是其p代码)并创建对0x40的引用。

–xyz
19 Mar 10 '19 at 22:31

#2 楼

尚未使用过ghidra,但在rarade2上检查了字节后,看来反汇编正确了

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)