我想知道是否可以将源代码与IDA Pro中的反汇编程序进行比较? (例如,我在Linux中编译hello.c,然后在OS X中的IDA Pro中打开二进制文件,并希望将程序集与源代码进行比较,以便更轻松地了解正在发生的事情)。

已添加到注释中,顺便说一句,我忘了说,我在OS-X中,二进制文件是由Lunux编译的。

/>

#1 楼

您可以在其中包含DWARF信息的情况下编译文件,因为IDA支持该文件:



#2 楼

并不是的。但是,例如,Visual Studio有一个调试器,如果您在加载解决方案的同一实例中启动调试器,则它可以直接指向源(发生问题的地方)。 Visual Studio还支持输出PDB文件(如果需要,还可以输出MAP文件),该文件将为您提供所有函数名称,变量名称,参数等。这在IDA中调试时也很有用。

您应该了解编译器是否还可以输出一种可以在IDA Pro中导入的“调试”文件。如果不是,则在这种情况下是不可能的。

评论


我忘了提到我在OS X中,而二进制文件是在Linux中编译的。

–trusktr
2014年5月17日在11:09

#3 楼

在寻找IP盗窃之前,我已经做到了这一点,虽然您不太可能恢复完美的一对一匹配,但是仍然存在某些结构和流程,这些结构和流程会渗透到从其他地方复制的功能中。很难阅读一段代码然后复制它,而没有原始思想影响您的设计。您只有一种类似的情况,您正在寻找匹配功能以简化逆向工程。

这就是我要做的事情:我怀疑的二进制文件包含我感兴趣的代码。
如果我有对二进制文件感兴趣的参考源,请:


找出哪些内容使用编译器来构建可疑二进制文件。
使用相同的编译器来编译参考源。现在我们有了引用二进制文件和可疑二进制文件。


一旦我有两个二进制文件,则引用和可疑文件我将通过分析流程图和调用Graphis的东西(例如BinDiff)运行它们。 />然后您便获得了一组候选人,需要您进行深入的研究和分析。

我成功地使用了这种策略,成功地识别和分析了以本地语言编写的软件与软件之间的相似性用托管语言编写。这是一项非常强大的技术。如果您的预算有限,并且参考二进制文件和可疑二进制文件都使用同一编译器针对同一平台,则可以从参考二进制文件中构建FLIRT数据库。但是,这可能会错过大量的优秀候选者。 ,如果使用的是GCC,请参见DWARF;如果使用的是MSVC,请参见PDB。或者,仅告诉编译器产生汇编输出:GCC,MSVC。

#4 楼

如果这是为了学习puprose,并且您想了解如何为源代码行生成程序集,请创建列出每个主要编译器的程序集,该程序集应具有

选项,例如对于Visual Studio,您可以发出/ FAcs切换生成扩展名为.cod的程序集列表文件。该列表文件将显示源代码中的每一行如何转换为程序集

comparesrc:\>dir /b
comparesrc.cpp

comparesrc:\>type comparesrc.cpp
#include <stdio.h>  // standard include file
int main (void)
{ // this line will become prolog
    printf("hello my dear source compare\n");  // see str in .data section
    puts("c");  // will put a char* with line break to console
    puts("om");
    puts("pare");
    int a,b,c,d;
    a = 2; b =3 ; c = 4;
    d = a+b-c;    // 2+3 -4 = 1
    printf("%d\n",d);  // should print 1
    d = (a*b)/c;  // 2*3 /4 = 6 /4  numerator = 1
    printf("%d\n",d);  // should printf 1
    d = (a*b)%c;   // 2 * 3 % 4 denominator = 2
    printf("%d\n",d);  // should print 2
    return 0;   // lets generate a cod file and see the assembly
}   // this line will get converted to epilog



comparesrc:\>cl /FAcs /nologo /Zi  comparesrc.cpp /link /RELEASE
comparesrc.cpp

comparesrc:\>type comparesrc.cod
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01


        TITLE   XXXX\comparesrc.cpp
        .686P
        .XMM
        include listing.inc
        .model  flat

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

CONST   SEGMENT
$SG3850 DB      'hello my dear source compare', 0aH, 00H
        ORG $+2
$SG3851 DB      'c', 00H
        ORG $+2
$SG3852 DB      'om', 00H
        ORG $+1
$SG3853 DB      'pare', 00H
        ORG $+3
$SG3858 DB      '%d', 0aH, 00H
$SG3859 DB      '%d', 0aH, 00H
$SG3860 DB      '%d', 0aH, 00H
CONST   ENDS
PUBLIC  _main
EXTRN   _puts:PROC
EXTRN   _printf:PROC
; Function compile flags: /Odtp
; File xxx\comparesrc.cpp

_TEXT   SEGMENT
_c$ = -16                                               ; size = 4
_d$ = -12                                               ; size = 4
_b$ = -8                                                ; size = 4
_a$ = -4                                                ; size = 4
_main   PROC

; 3    : { // this line will become prolog

  00000 55               push    ebp
  00001 8b ec            mov     ebp, esp
  00003 83 ec 10         sub     esp, 16                        ; 00000010H

; 4    :     printf("hello my dear source compare\n");  // see str in .data sect
ion

  00006 68 00 00 00 00   push    OFFSET $SG3850
  0000b e8 00 00 00 00   call    _printf
  00010 83 c4 04         add     esp, 4

; 5    :     puts("c");  // will put a char* with line break to console

  00013 68 00 00 00 00   push    OFFSET $SG3851
  00018 e8 00 00 00 00   call    _puts
  0001d 83 c4 04         add     esp, 4

; 6    :     puts("om");

  00020 68 00 00 00 00   push    OFFSET $SG3852
  00025 e8 00 00 00 00   call    _puts
  0002a 83 c4 04         add     esp, 4

; 7    :     puts("pare");

  0002d 68 00 00 00 00   push    OFFSET $SG3853
  00032 e8 00 00 00 00   call    _puts
  00037 83 c4 04         add     esp, 4

; 8    :     int a,b,c,d;
; 9    :     a = 2; b =3 ; c = 4;

  0003a c7 45 fc 02 00
        00 00            mov     DWORD PTR _a$[ebp], 2
  00041 c7 45 f8 03 00
        00 00            mov     DWORD PTR _b$[ebp], 3
  00048 c7 45 f0 04 00
        00 00            mov     DWORD PTR _c$[ebp], 4

; 10   :     d = a+b-c;    // 2+3 -4 = 1

  0004f 8b 45 fc         mov     eax, DWORD PTR _a$[ebp]
  00052 03 45 f8         add     eax, DWORD PTR _b$[ebp]
  00055 2b 45 f0         sub     eax, DWORD PTR _c$[ebp]
  00058 89 45 f4         mov     DWORD PTR _d$[ebp], eax

; 11   :     printf("%d\n",d);  // should print 1

  0005b 8b 4d f4         mov     ecx, DWORD PTR _d$[ebp]
  0005e 51               push    ecx
  0005f 68 00 00 00 00   push    OFFSET $SG3858
  00064 e8 00 00 00 00   call    _printf
  00069 83 c4 08         add     esp, 8

; 12   :     d = (a*b)/c;  // 2*3 /4 = 6 /4  numerator = 1

  0006c 8b 45 fc         mov     eax, DWORD PTR _a$[ebp]
  0006f 0f af 45 f8      imul    eax, DWORD PTR _b$[ebp]
  00073 99               cdq
  00074 f7 7d f0         idiv    DWORD PTR _c$[ebp]
  00077 89 45 f4         mov     DWORD PTR _d$[ebp], eax

; 13   :     printf("%d\n",d);  // should printf 1

  0007a 8b 55 f4         mov     edx, DWORD PTR _d$[ebp]
  0007d 52               push    edx
  0007e 68 00 00 00 00   push    OFFSET $SG3859
  00083 e8 00 00 00 00   call    _printf
  00088 83 c4 08         add     esp, 8

; 14   :     d = (a*b)%c;   // 2 * 3 % 4 denominator = 2

  0008b 8b 45 fc         mov     eax, DWORD PTR _a$[ebp]
  0008e 0f af 45 f8      imul    eax, DWORD PTR _b$[ebp]
  00092 99               cdq
  00093 f7 7d f0         idiv    DWORD PTR _c$[ebp]
  00096 89 55 f4         mov     DWORD PTR _d$[ebp], edx

; 15   :     printf("%d\n",d);  // should print 2

  00099 8b 45 f4         mov     eax, DWORD PTR _d$[ebp]
  0009c 50               push    eax
  0009d 68 00 00 00 00   push    OFFSET $SG3860
  000a2 e8 00 00 00 00   call    _printf
  000a7 83 c4 08         add     esp, 8

; 16   :     return 0;   // lets generate a cod file and see the assembly

  000aa 33 c0            xor     eax, eax

; 17   : }   // this line will get converted to epilog

  000ac 8b e5            mov     esp, ebp
  000ae 5d               pop     ebp
  000af c3               ret     0
_main   ENDP
_TEXT   ENDS
END

comparesrc:\>


#5 楼

从根本上讲,在大多数情况下是不可能的。因此,很难识别带有附加代码的代码(尤其是当代码很大时)。

为什么要这样做?有不同的策略可以使用,如果我知道的话,我可以提供更多帮助。
其他人想了解编译器及其工作方式。它们应在调试模式下进行编译,并附加一些支持源代码调试的调试器(例如Windows环境中的WinDbg)。


评论


我的目标是学习其工作原理,并学习逆向工程。

–trusktr
14年5月17日在11:08