我有一个看起来像这样的结构:

 RefString struct
     RefCount dd ?
     StrLen   dd ?
     CString  db...
 RefString ends


当代码通过指针时,它并不指向结构的开头(RefCount),而是它指向CString,它被分配为具有零终止字符的普通C-String,并且具有strlen和refcount。因此,当代码访问strlen或refcount时,它分别使用ptr-4。实际上,这是一个很好的构造,因为这种方式可以将字符串用作delphistring,也可以直接传递给某些系统函数无需来回转换。

现在,我想知道,是否可以在IDA中创建带有指向字符串的基指针的结构,并且它知道其他字段具有负偏移量。

评论

struct的主要目的是在逻辑容器中组织数据并将其传递。从末尾引用该结构有什么意义?

没有禁止负偏移的规则,使用正偏移只是一种常见的做法。 ;)正如我所展示的,我有使用这种寻址方式的代码,这使得在IDA中进行跟踪显得有些琐。

我懂了。我只是以不同的方式想到它。对我来说,从“头”引用结构总是更直接。

好吧,代码不是我写的。这是有道理的,如何完成的,但我也希望它简单明了。但是代码是这样做的,因此,当指针被传递时,它指向结构的“中间”,而当IDA进行自动更新时,它会弄糟东西。
Kinda听起来像Delphi字符串,其中有关实际长度(如计数的字符串)和分配的大小的提示都保留在实际数据的前面。除非在这种情况下,数据直接跟随长度/大小字段。

#1 楼

实际上,您所指的ptr-4和ptr-8是堆栈中已选出变量的位置。 IDA必须知道结构才能自动识别。如果在“结构”子视图中设置自定义结构。随后,您可以手动将选择的任何变量设置为该特定变量的类型。此后,IDA将用适当的结构成员偏移替换分解视图中的引用。

如果IDA“进入”结构的中间位置。您可以按照以下方法进行操作,以使其显示不同: >按T。提供计算的增量,选择所需的结构及其字段



有关详细信息,请参考Hex Blog的负结构偏移。

评论


该结构不是堆栈指针对象,而是结构的设置方式。您的解决方案至少可以部分起作用,因为这样我可以分配成员名称,这很有帮助。缺点是globabl结构指针会引起一些问题,因为它不指向那里,但是正如您所说的,这是一种解决方法。

– Devolus
13年11月6日在16:33