已添加到注释中,顺便说一句,我忘了说,我在OS-X中,二进制文件是由Lunux编译的。
/>
#1 楼
您可以在其中包含DWARF信息的情况下编译文件,因为IDA支持该文件:#2 楼
并不是的。但是,例如,Visual Studio有一个调试器,如果您在加载解决方案的同一实例中启动调试器,则它可以直接指向源(发生问题的地方)。 Visual Studio还支持输出PDB文件(如果需要,还可以输出MAP文件),该文件将为您提供所有函数名称,变量名称,参数等。这在IDA中调试时也很有用。您应该了解编译器是否还可以输出一种可以在IDA Pro中导入的“调试”文件。如果不是,则在这种情况下是不可能的。
#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
评论
我忘了提到我在OS X中,而二进制文件是在Linux中编译的。
–trusktr
2014年5月17日在11:09