Assembly 在我使用NDISSM看到的函数之后,汇编说明的目的是什么?

Assembly 在我使用NDISSM看到的函数之后,汇编说明的目的是什么?,assembly,x86,nasm,elf,disassembly,Assembly,X86,Nasm,Elf,Disassembly,我对编译非常简单的源文件test.c产生的代码进行了反汇编,如下所示: void main() {} 我运行这些命令将main函数链接到一个静态可执行文件中(编者注:没有CRT启动代码,所以它会崩溃),然后提取到一个平面二进制文件,删除几个部分,这样我就可以将其提供给ndisam(编者按:它不理解ELF元数据,比如objdump-drwC-Minteldoes) 这就是我得到的: 00000000 55 push ebp 00000001 89E5

我对编译非常简单的源文件test.c产生的代码进行了反汇编,如下所示:

void main() {}
我运行这些命令将
main
函数链接到一个静态可执行文件中(编者注:没有CRT启动代码,所以它会崩溃),然后提取到一个平面二进制文件,删除几个部分,这样我就可以将其提供给
ndisam
(编者按:它不理解ELF元数据,比如
objdump-drwC-Mintel
does)

这就是我得到的:

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  5D                pop ebp
00000004  C3                ret
00000005  0000              add [eax],al
00000007  001400            add [eax+eax],dl
0000000A  0000              add [eax],al
0000000C  0000              add [eax],al
0000000E  0000              add [eax],al
00000010  017A52            add [edx+0x52],edi
00000013  0001              add [ecx],al
00000015  7C08              jl 0x1f
00000017  011B              add [ebx],ebx
00000019  0C04              or al,0x4
0000001B  0488              add al,0x88
0000001D  0100              add [eax],eax
0000001F  001C00            add [eax+eax],bl
00000022  0000              add [eax],al
00000024  1C00              sbb al,0x0
00000026  0000              add [eax],al
00000028  D8FF              fdivr st7
0000002A  FF                db 0xff
0000002B  FF05    00000000      inc dword [dword 0x0]
00000031  41                inc ecx
00000032  0E                push cs
00000033  088502420D05      or [ebp+0x50d4202],al
00000039  41                inc ecx
0000003A  0C04              or al,0x4
0000003C  04C5              add al,0xc5
0000003E  0000              add [eax],al

超过前四行的所有内容的用途是什么?为什么要添加到eax、2*eax、edx+0x52、比较等指向的内存位置?都是为了检查程序是否正确执行或其他什么吗?

我相信您已经反汇编了非代码的位,这就是为什么它没有多大意义的原因。


为了了解文件可能包含的内容,我建议在完整二进制文件(ELF)上运行
objdump
,以查看您是否可以识别任何部分中的上述字节序列。

此部分是
。eh_frame
紧跟在
.text
之后。在使用gcc编译时,您可以使用
-fno异步展开表来消除它


有关更多详细信息,请参阅。

这些是我运行的命令:$gcc-c test.c;ld-o test-Ttext 0x0-e main test.o;objcopy-R.note-R.comment-S-o binary test test test.bin;ndisam-b 32 test.bin谢谢。如果不是代码,那么这些字节最有可能是什么,为什么它们是我的test.bin文件的一部分?是的,或者它可能只是随机数据。使用ob找到它jdump.It是section.eh_frame,紧跟在.text之后,我没有在运行的objcopy命令中用-R删除它。现在它确实有意义了!:)
add[eax],al
总是让我立即产生怀疑。它(几乎)不会出现在实际的代码中,特别是不会经常出现。为了详细说明@harold的评论,
add[eax],al
恰好由字节
00
表示。不知道他们为什么选择用这些字节来表示指令。当您看到该指令时,这些字节很可能是零,原因不是希望将EAX中最低字节的内容添加到EAX指向的地址。通常情况下,代码并不是被反汇编的。
00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  5D                pop ebp
00000004  C3                ret
00000005  0000              add [eax],al
00000007  001400            add [eax+eax],dl
0000000A  0000              add [eax],al
0000000C  0000              add [eax],al
0000000E  0000              add [eax],al
00000010  017A52            add [edx+0x52],edi
00000013  0001              add [ecx],al
00000015  7C08              jl 0x1f
00000017  011B              add [ebx],ebx
00000019  0C04              or al,0x4
0000001B  0488              add al,0x88
0000001D  0100              add [eax],eax
0000001F  001C00            add [eax+eax],bl
00000022  0000              add [eax],al
00000024  1C00              sbb al,0x0
00000026  0000              add [eax],al
00000028  D8FF              fdivr st7
0000002A  FF                db 0xff
0000002B  FF05    00000000      inc dword [dword 0x0]
00000031  41                inc ecx
00000032  0E                push cs
00000033  088502420D05      or [ebp+0x50d4202],al
00000039  41                inc ecx
0000003A  0C04              or al,0x4
0000003C  04C5              add al,0xc5
0000003E  0000              add [eax],al