我对序言和电话指示有一些疑问。
1)我是否理解正确:
调用指令总是用于调用函数,虽然函数调用并不总是通过使用调用来实现(可以通过使用push + jmp来实现)
大多数功能都有一个序幕,它通常看起来像这样:
push ebp
mov ebp, esp
sub esp, xx
优化编译器的序幕:
sub esp, xxx
我也知道裸体功能,没有序幕和结语。是否存在其他功能没有序幕的情况?或者所有反汇编代码的样本都是裸函数的调用?
call from : 0x77b6f6f0 ntdll.dll!RtlImageDirectoryEntryToData+0x236 ??:0
to : 0x77b62869 ntdll.dll!RtlEnterCriticalSection+0xb559 ??:0
0x77b6f6f0 call $0x77b62869 %esp -> %esp 0xfffffffc(%esp)[4byte]
0x77b62869 mov 0xfffffff0(%ebp)[4byte] -> %ecx
0x77b6286c mov %ecx -> %fs:0x00[4byte]
0x77b62873 pop %esp (%esp)[4byte] -> %ecx %esp
0x77b62874 pop %esp (%esp)[4byte] -> %edi %esp
0x77b62875 pop %esp (%esp)[4byte] -> %edi %esp
0x77b62876 pop %esp (%esp)[4byte] -> %esi %esp
0x77b62877 pop %esp (%esp)[4byte] -> %ebx %esp
0x77b62878 mov %ebp -> %esp
--------------------------------------------------------------------
call from : 0x77b74d5e ntdll.dll!RtlGetCurrentTransaction+0x63a ??:0
to : 0x77b6f5cf ntdll.dll!RtlImageDirectoryEntryToData+0x115 ??:0
0x77b74d5e call $0x77b6f5cf %esp -> %esp 0xfffffffc(%esp)[4byte]
0x77b6f5cf push $0x0000005c %esp -> %esp 0xfffffffc(%esp)[4byte]
0x77b6f5d1 push $0x77b608e8 %esp -> %esp 0xfffffffc(%esp)[4byte]
0x77b6f5d6 call $0x77b62824 %esp -> %esp 0xfffffffc(%esp)[4byte]
0x77b6f5db xor %edi %edi -> %edi
0x77b6f5dd mov %edi -> 0xffffffdc(%ebp)[4byte]
0x77b6f5e0 mov 0x08(%ebp)[4byte] -> %eax
0x77b6f5e3 mov 0x18(%eax)[4byte] -> %edx
0x77b6f5e6 mov %edx -> 0xffffffd8(%ebp)[4byte]
call from : 0x77b6f85f ntdll.dll!LdrGetProcedureAddressEx+0x162 ??:0
to : 0x77b66f58 ntdll.dll!RtlRunOnceBeginInitialize+0xf9 ??:0
0x77b6f85f call $0x77b66f58 %esp -> %esp 0xfffffffc(%esp)[4byte]
0x77b66f58 mov 0xffffffe4(%ebp)[4byte] -> %ecx
0x77b66f5b xor %ebp %ecx -> %ecx
0x77b66f5d call $0x77b62f0c %esp -> %esp 0xfffffffc(%esp)[4byte]
0x77b66f62 jmp $0x77b62869
0x77b66f67 nop
2)在调用指令之后,当调用某些系统函数(例如memcpy)时,命令jmp ds:address会重定向到复制内存的系统库中的func。这是什么意思,为什么不立即重定向到库中func的地址,如果它被加载到prog并且地址是已知的?
3)我如何检测到该调用 - 是函数调用?例如,当我使用间接调用时,我需要确保,我跳转到func的开头。但是func避开了序幕。您能否就此提供任何信息资源?