我知道该操作系统的某些部分来自C ++代码,因此二进制文件可能包含C ++ STL。
但是,我对STL的了解不多。找到STL函数的地址?
(搜索“ map”,“ vector”,...字符串的基本方法不成功,在这种情况下我不知道可以搜索任何特定功能)
STL函数有某种签名吗?
谢谢!
其他信息:我使用IDA。我可以在GDB上运行操作系统。我知道许多标准C函数的地址(ctype / stddio / ...)。
#1 楼
像STL或Boost这样的库很棘手。由于它们很大程度上是基于模板的,并且它们的大多数代码是在编译时生成的,因此很难为其创建FLIRT样式的签名。太多的内容取决于特定的编译器,构建选项,优化设置等,因此,除非在生成签名时将它们非常紧密地匹配,否则您不太可能获得很多好成绩。能够找到它们的一些迹象。例如,在某些情况下,典型的std::string
实现会引发异常length_error
或out_of_range
。您也许可以找到对错误文本或异常名称的引用。除此之外,我认为除了从实际代码中识别特定的实现外,您没有什么可以寻找的。在OS中,任何不确定的行为都是一件坏事,而使用STL,您基本上可以随时获得异常。他们可能会使用一些有限的C ++来实现更好的封装,但是任何高级类都可能是定制的,而不是来自STL或Boost。评论
也许我应该对此更加清楚。由于该操作系统位于嵌入式设备上,因此它还包括整个用户界面以及在用户界面中硬编码的某种“应用”。操作系统的底层位于C / assembly中。
– m4524t
2014年3月17日17:51
好吧,在这种情况下,UI部分用C ++完成是合理的。但这仍不能保证它正在使用STL。
–伊戈尔·斯科钦斯基♦
2014年3月17日在21:44
是的,从我对嵌入式开发的了解很少,他们很少使用模板,并且如果确实使用/拥有STL,则可能是简化/优化的模板(即不是您的标准g ++ STL)。
–fileoffset
2014年3月18日下午5:08
造成这一困难的另一件事是,内联生成了许多STL /模板代码,因此甚至没有任何函数调用来标记...
–fileoffset
2014年3月18日下午5:10
我试图搜索与您给出的两个异常相关的字符串。这些都不与STL有关。因此,您肯定是正确的。可能没有“标准” STL(或者它可能是没有任何特定功能的版本)。感谢大家!
– m4524t
2014年3月19日在12:29
评论
什么是操作系统?为什么您认为它使用C ++(而不是普通C)?即使这样,您为什么也认为它使用STL?@JasonGeffner:当我反汇编x86可执行文件时,IDA总是这样做。在这种情况下(是因为它是ARM吗?我不知道。),IDA找不到任何标准函数。
@IgorSkochinsky:操作系统是专有操作系统(基于Nucleus OS)。我想,但是我不能给你名字。它使用C ++,因为还有一些C ++结构作为调试字符串。我不知道它是否真的使用STL,但是如果没有,我想确定一下。