当函数没有序言时,除了裸功能?除了调用指令外,检测功能如何开始?

时间:2017-08-31 11:09:28

标签: c assembly

我对序言和电话指示有一些疑问。

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避开了序幕。您能否就此提供任何信息资源?

0 个答案:

没有答案