我有一个二进制文件(实际上是一个用于ARM嵌入式设备的操作系统,其中还包含一些高级应用程序(在用户界面中进行硬编码))。

我知道该操作系统的某些部分来自C ++代码,因此二进制文件可能包含C ++ STL。

但是,我对STL的了解不多。找到STL函数的地址?
(搜索“ map”,“ vector”,...字符串的基本方法不成功,在这种情况下我不知道可以搜索任何特定功能)

STL函数有某种签名吗?

谢谢!

其他信息:我使用IDA。我可以在GDB上运行操作系统。我知道许多标准C函数的地址(ctype / stddio / ...)。

评论

什么是操作系统?为什么您认为它使用C ++(而不是普通C)?即使这样,您为什么也认为它使用STL?

@JasonGeffner:当我反汇编x86可执行文件时,IDA总是这样做。在这种情况下(是因为它是ARM吗?我不知道。),IDA找不到任何标准函数。

@IgorSkochinsky:操作系统是专有操作系统(基于Nucleus OS)。我想,但是我不能给你名字。它使用C ++,因为还有一些C ++结构作为调试字符串。我不知道它是否真的使用STL,但是如果没有,我想确定一下。

#1 楼

像STL或Boost这样的库很棘手。由于它们很大程度上是基于模板的,并且它们的大多数代码是在编译时生成的,因此很难为其创建FLIRT样式的签名。太多的内容取决于特定的编译器,构建选项,优化设置等,因此,除非在生成签名时将它们非常紧密地匹配,否则您不太可能获得很多好成绩。能够找到它们的一些迹象。例如,在某些情况下,典型的std::string实现会引发异常length_errorout_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