在Ollydbg或IDA中识别CLib函数


2

我只是在学习Olly/IDA并在C中编写简单的程序并查看Ollydbg和IDA中的.EXE代码。下面我有一个简单的printf Hello World程序,我在Visual Studio 6中编译。我可以看到事件链,以kernel32.dll调用开始,获取Windows版本号,设置堆,获取命令行等。我认识到main()函数,并且看到字符串变量被放在堆栈上,并且可以推断00401010处的函数是printf(),如果我查看该地址的“Names Window”,则由IDA确认,但Olly不明确告诉我。

#include <stdio.h> 

void main(void) 
{ 
printf("blah blah\n"); 

return; 
} 

而在奥利这里是我的main()函数集:

CPU Disasm 
Address Hex dump  Command     Comments 
00401000 / $68 30604000 PUSH OFFSET 00406030 ; ASCII "blah blah" 
00401005 |. E8 06000000 CALL 00401010 
0040100A |. 59  POP ECX 
0040100B \. C3  RETN 

所以上述的汇编指令是所有对应的C代码我写的。 .EXE的其余部分充满了许多其他代码,我希望能够识别和区分应用程序和LIBC函数(如printf())。我知道编译器会生成操作系统相关的设置和拆卸的东西(比如windows版本#,堆等),但我认为在几个程序和学习PE程序标准后,我应该能够认识到(加上Olly需要无论如何,你都可以将其转换为应用程序代码)。

这里,例如,是什么,我认为是对libc中的printf()函数顶部功能,通过CALL 00401010叫:

CPU Disasm 
Address Hex dump  Command     Comments 
00401010 /$ 53  PUSH EBX 
00401011 |. 56  PUSH ESI 
00401012 |. BE 70604000 MOV ESI,OFFSET 00406070 
00401017 |. 57  PUSH EDI 
00401018 |. 56  PUSH ESI 
00401019 |. E8 4B010000 CALL 00401169 
0040101E |. 8BF8  MOV EDI,EAX 
00401020 |. 8D4424 18 LEA EAX,[ARG.2] 
00401024 |. 50  PUSH EAX 
00401025 |. FF7424 18 PUSH DWORD PTR SS:[ARG.1] 
00401029 |. 56  PUSH ESI 
0040102A |. E8 04020000 CALL 004
0040102F |. 56  PUSH ESI 
00401030 |. 57  PUSH EDI 
00401031 |. 8BD8  MOV EBX,EAX 
00401033 |. E8 BE010000 CALL 004011F6 
00401038 |. 83C4 18 ADD ESP,18 
0040103B |. 8BC3  MOV EAX,EBX 
0040103D |. 5F  POP EDI 
0040103E |. 5E  POP ESI 
0040103F |. 5B  POP EBX 
00401040 \. C3  RETN 

如果我在IDA打开我的EXE,并期待在“名称窗口”我看到开始00401010,因为这代码‘_printf’,如果我上双击它我看到以下内容:

IDA view of first level of _printf

这仅仅是顶层,如果我跟着下来了几个(按照CALL指令进行更深层次的功能)找到像KERNEL32.WriteFile()这样的OS函数,这些函数实际上使字符串出现在CMD窗口中。

我的问题是:如何识别库函数(如printf())并将它们与应用程序代码区分开来?如果他们可以出现标签,这将是很好的。我知道有Olly的脚本和插件,但到目前为止(在我的早期学习)我还没有找到如何做到这一点。

到目前为止,我只知道将相同的EXE引入IDA并查看“名称窗口”中的地址以查看它是否是CLIB函数的第一级函数。但是接下来需要做一些工作来标记由这个函数调用的函数,这也是标准C库的一部分,而不是用户代码。

查找IDA中的地址并不是什么大事,但是仍然有大量的代码是低级函数,如果我能够快速知道是CLIB的一部分而不是应用程序代码,那将会很好。

我会猜测这是建立一个Ollydbg .UDD文件或下载插件或脚本。对不起,如果它在一些文档中很明显,但到目前为止我还没有找到它。所有这一切说,我可以想象,链接器可能会改变这样的事情,如果一些优化完成,每次都可能不会在内存中存在确切的模式。

2

指令同时适用于OllyDbg的1.10和2.01 OllyDbg中,除非另有说明

选择感兴趣的HelloWorld即的模块。使用ALT + E的exe 右与选定的模块点击和输入(在CPU视图代码) 并让OllyDbg的使用CTRL + A

然后使用CTRL + G转到分析模块

type [modname].main without the SQ brackets在编辑框中/列表框中
ollydbg 2.01从下拉列表中选择,然后按照表达
ollydbg 1.10点击确定

,你将在主要功能
和OllyDbg的会显示你的主正确注释
enter image description here

进一步微调也可以做

comments pane can be cycled通过comments and source
right click->appearance->show bar
点击通过源栏周期上,评论,轮廓
如果你已经建立了调试信息的可执行文件在OllyDbg中会显示相对于正确的源代码行,你也可以设置反汇编的显示使用

拆装
CTRL + O
和检查标记对应于
显示符号名称显示模块名称相应的复选框,等
(探索并决定为你的自我什么适合你)

,以了解导致实际代码 的CRT函数安装Visual Studio的一些版本,并期待在CRT文件夹,并设置src文件夹的目录结构的实际来源OllyDbg的给他们拉起来,并显示它并排在注释窗格

我不知道你的意思OllyDbg的不承认喜欢IDA 功能虽然伊达有天赋(在签名标准码的形式预先收集的资料)OllyDbg的做一个体面的工作,在注释功能

,因为你说你编译它是否启用调试信息在编译时(/ ZI开关中产生,如果你编译它的Visual C++组合物1如果你从其他编译器编译它,请查找类似的开关

如果你用visual studio编译它,那么你应该在文件夹中有一个crt函数副本(c:\ progxxx \ mic vis \ xxx \ crt)

visual studio 2010 express的这些src文件的原始位置是f:\ dd(如果您没有名为f的分区,请使用mount,如果您有其他设备占用的drivepath f,例如cdrom,请使用diskmgmt的.msc更改驱动器盘符把可移动磁盘使用dismgmt.msc更改驱动器号F:为可移动磁盘,复制粘贴源到该驱动器OllyDbg的会自动把它

的UDL功能并非导入库。
导入库不包含对象数据

头文件是文本文件,他们是没有用的,同样,在做二进制分析

纬度,但并非最不重要的有几个插件,可以导入IDA签名到OllyDbg的 一个这样的idasig /或godup插件看看tuts4you.com你可能会发现数百 插件在IDA OllyDbg的 生产 - 使用这些插件

有你的设置选项>地图文件,导入地图文件 - >码 - 。检查有关显示当地的痕迹,显示符号地址等

OllyDbg的的屏幕截图显示了printf函数 enter image description here

  0

谢谢,这有助于添加标签。我可以用':'添加标签,并看到CALL指令使用该标签名称,然后像你说的那样用ctrl-G去找它们。 我仍然试图让Olly识别IDA所做的功能,我没有编译器链接的LIBC.LIB的源文件。我尝试在STDIO.H和LIBC.LIB中拖放,但Olly只是将它们显示为二进制文件。我看到Debug - >“Create Function Library”,并在选项 - >目录选项卡中提到“Stardard Function Libraries”(.UDL文件)。所以我试着看看如何创建或导入这些。 28 1月. 162016-01-28 23:02:00

  0

我添加了更多信息看一看 29 1月. 162016-01-29 05:08:40

  0

感谢Blabb,我现在知道如何看到至少我自己的源代码以及Olly中的程序集,只需简单地将.PDB文件与.EXE一起。我现在出现了C源代码行。对于VS6,我必须更改一些设置才能获取.PDB文件以供发布[链接](http://blogs.msdn.com/b/rickrain/archive/2004/11/05/253101.aspx)。由于我在虚拟机中安装了VS6,我不得不重现目录路径并将源代码放在那里,我想.PDB文件有绝对文件路径。 因此,接下来按照您的建议,像那样获取CRT或CLIB库源代码。 29 1月. 162016-01-29 09:03:48


0

不是我想要的东西稍有不同的来源(识别奥利LIBC/CRT)是看IDA中的图表。起初,它显示所有功能显示令人生畏(见下面的可怕图片,我的主要()是黑色方框标记'_main')。注意我的程序是对printf()的单个调用。

enter image description here

然后读IDA的教程link后,我看我可以使用,然后将其绘制在“忽略”打开勾选“从库函数”的enter image description here按钮“由用户指定外部参照的显示图”更简单的树:

enter image description here

所以我现在看到如何轻松地从C lib和启动功能区分应用程序代码,至少在IDA。

对于Ollydbg,Blabb的答案显示了如何用PDB文件做到这一点,现在我想尝试在没有调试或者.PDB文件的情况下做到这一点。