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
/ default
,Base 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
奇怪的是,它不是为表的基地址
q4312079qe3
40
生成标签,而是为q4312079q(访问的第一个字节)生成一个标签,就像X是TOC指针一样,或者类似,$ 0040是偏移量。这不适用于6502代码。在这个小示例中,我可以右键单击并手动修复引用,但是我不介意承认我不想做这对于整个程序。 6502代码中充满了这些东西。我可以阻止这种情况发生吗?
(尝试遵循所提供的Java源代码,我迷失了!-但我确实知道了这类参考称为扩展参考,并且似乎是所有目标通用的。尽管如此,我还是在文档中找不到关于这些参考或如何禁用它们的任何信息。)
#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)
评论
嗨,欢迎来到RE.SE。这听起来很具体,我们所有人都没有像幽灵一样工作,他们只是在学习使用Ghidra。我强烈建议您将您的请求带到GitHub项目,然后在那打开一个问题。到目前为止,鉴于您的详细信息,这看起来更像是一个缺陷。供将来参考:有人为此提出了GitHub问题。参见github.com/NationalSecurityAgency/ghidra/issues/201