有很多工具都可以生成二进制目标文件的死列表形式的反汇编代码。PE、ELF和MACH-O文件可分别使用dumpbin、objdump和otool进行反汇编。但是,它们中的任何一个都无法处理任意格式的二进制文件。有时候,你会遇到一些并不采用常用文件格式的二进制文件,在这种情况下,你就需要一些能够从用户指定的偏移量开始反汇编过程的工具。
有两个用于x86指令集的流式反汇编器(stream disassembler):ndisasm和diStorm 。ndisasm是Netwide Assembler(NASM) 中的一个工具。下面的例子说明了如何使用ndisasm反汇编一段由Metasploit框架 生成的shellcode:
idabook# ./msfpayload linux_ia32_findsock CPORT=4444 R > fs idabook# ls -l fs -rw-r--r-- 1 ida ida 62 Oct 30 15:49 fs idabook# ndisasm -u fs 00000000 31D2 xor edx,edx 00000002 52 push edx 00000003 89E5 mov ebp,esp 00000005 6A07 push byte +0x7 00000007 5B pop ebx 00000008 6A10 push byte +0x10 0000000A 54 push esp 0000000B 55 push ebp 0000000C 52 push edx 0000000D 89E1 mov ecx,esp 0000000F FF01 inc dword [ecx] 00000011 6A66 push byte +0x66 00000013 58 pop eax 00000014 CD80 int 0x80 00000016 66817D02115C cmp word [ebp+0x2],0x5c11 0000001C 75F1 jnz 0xf 0000001E 5B pop ebx 0000001F 6A02 push byte +0x2 00000021 59 pop ecx 00000022 B03F mov al,0x3f 00000024 CD80 int 0x80 00000026 49 dec ecx 00000027 79F9 jns 0x22 00000029 52 push edx 0000002A 682F2F7368 push dword 0x68732f2f 0000002F 682F62696E push dword 0x6e69622f 00000034 89E3 mov ebx,esp 00000036 52 push edx 00000037 53 push ebx 00000038 89E1 mov ecx,esp 0000003A B00B mov al,0xb 0000003C CD80 int 0x80
由于流式反汇编非常灵活,因此它的用途相当广泛。例如,在分析网络数据包中可能包含shellcode的计算机网络攻击时,就可以采用流式反汇编器来反汇编数据包中包含shellcode的部分,以分析恶意负载的行为。另外一种情况是分析那些格式未知的ROM镜像。ROM中有些部分是数据,其他部分则为代码,可以使用流式反汇编器来反汇编镜像中的代码。
1. VC,GCC的obj,lib格式为COFF,可相互通用。
2. VC,GCC的obj,lib可通过coff2omf转成OMF格式,但VC在编译时要加/Zl选项。
3. VC,GCC的typelib可通过coff2omf转成OMF格式。
4. 由于BCB的OMF是非标的,所以VC的linker无法识别,但它可识别标准的OMF格式。
5. editbin可将标准的OMF转为COFF(只能转obj,不能转lib)。
6. VC,GCC,BCB的二进制查看分别为dumpbin,objdump,tdump。tdump的-C可查看COFF格式。