Assembly 尽管源代码中没有递归,但仍进行递归程序集调用

Assembly 尽管源代码中没有递归,但仍进行递归程序集调用,assembly,instructions,Assembly,Instructions,我有一个来自转储的代码片段,我想理解它。 最让我困扰的是(似乎)递归调用 bd604:e8 fc ff呼叫bd605+0xb5 他们是干什么的?我在原始函数中不使用递归 Thanks@schnaader 似乎这些调用发出cld并跳转到EAX 编辑:我的功能的完整dmp 00bd550 <SendData>: SendData(): bd550: 55 push %ebp bd551: 57

我有一个来自转储的代码片段,我想理解它。 最让我困扰的是(似乎)递归调用

bd604:e8 fc ff呼叫bd605+0xb5

他们是干什么的?我在原始函数中不使用递归

Thanks@schnaader

似乎这些调用发出cld并跳转到EAX

编辑:我的功能的完整dmp

00bd550 <SendData>:
SendData():
   bd550:   55                      push   %ebp
   bd551:   57                      push   %edi
   bd552:   56                      push   %esi
   bd553:   53                      push   %ebx
   bd554:   83 ec 20                sub    $0x20,%esp
   bd557:   8b 35 74 a2 06 00       mov    0x6a274,%esi
   bd55d:   8b 1d ac a2 06 00       mov    0x6a2ac,%ebx
   bd563:   dd 44 24 40             fldl   0x40(%esp,1)
   bd567:   66 c7 44 24 0e 00 00    movw   $0x0,0xe(%esp,1)
   bd56e:   83 eb 18                sub    $0x18,%ebx
   bd571:   85 f6                   test   %esi,%esi
   bd573:   dd 5c 24 18             fstpl  0x18(%esp,1)
   bd577:   dd 44 24 48             fldl   0x48(%esp,1)
   bd57b:   dd 5c 24 10             fstpl  0x10(%esp,1)
   bd57f:   0f 85 b2 00 00 00       jne    bd637 <SendData+0xe7>
   bd585:   8b 7c 24 38             mov    0x38(%esp,1),%edi
   bd589:   89 dd                   mov    %ebx,%ebp
   bd58b:   c1 fd 02                sar    $0x2,%ebp
   bd58e:   85 ff                   test   %edi,%edi
   bd590:   0f 8e 99 00 00 00       jle    bd62f <SendData+0xdf>
   bd596:   8d 76 00                lea    0x0(%esi),%esi
   bd599:   8d bc 27 00 00 00 00    lea    0x0(%edi,1),%edi
   bd5a0:   0f b7 74 24 0e          movzwl 0xe(%esp,1),%esi
   bd5a5:   39 ef                   cmp    %ebp,%edi
   bd5a7:   89 e8                   mov    %ebp,%eax
   bd5a9:   0f 4e c7                cmovle %edi,%eax
   bd5ac:   dd 44 24 18             fldl   0x18(%esp,1)
   bd5b0:   89 c5                   mov    %eax,%ebp
   bd5b2:   8d 1c ad 00 00 00 00    lea    0x0(,%ebp,4),%ebx
   bd5b9:   29 ef                   sub    %ebp,%edi
   bd5bb:   01 c6                   add    %eax,%esi
   bd5bd:   a1 a8 a2 06 00          mov    0x6a2a8,%eax
   bd5c2:   8d 56 ff                lea    0xffffffff(%esi),%edx
   bd5c5:   dd 58 08                fstpl  0x8(%eax)
   bd5c8:   66 89 50 06             mov    %dx,0x6(%eax)
   bd5cc:   0f b7 54 24 0e          movzwl 0xe(%esp,1),%edx
   bd5d1:   66 89 50 04             mov    %dx,0x4(%eax)
   bd5d5:   8b 54 24 3c             mov    0x3c(%esp,1),%edx
   bd5d9:   89 10                   mov    %edx,(%eax)
   bd5db:   dd 44 24 10             fldl   0x10(%esp,1)
   bd5df:   dd 58 10                fstpl  0x10(%eax)
   bd5e2:   8b 54 24 34             mov    0x34(%esp,1),%edx
   bd5e6:   0f bf 44 24 0e          movswl 0xe(%esp,1),%eax
   bd5eb:   89 5c 24 08             mov    %ebx,0x8(%esp,1)
   bd5ef:   83 c3 18                add    $0x18,%ebx
   bd5f2:   8d 04 82                lea    (%edx,%eax,4),%eax
   bd5f5:   89 44 24 04             mov    %eax,0x4(%esp,1)
   bd5f9:   a1 a8 a2 06 00          mov    0x6a2a8,%eax
   bd5fe:   83 c0 18                add    $0x18,%eax
   bd601:   89 04 24                mov    %eax,(%esp,1)
   bd604:   e8 fc ff ff ff          call   bd605 <SendData+0xb5>
   bd609:   a1 a8 a2 06 00          mov    0x6a2a8,%eax
   bd60e:   c7 44 24 08 00 00 00    movl   $0x0,0x8(%esp,1)
   bd615:   00
   bd616:   89 5c 24 04             mov    %ebx,0x4(%esp,1)
   bd61a:   89 04 24                mov    %eax,(%esp,1)
   bd61d:   e8 fc ff ff ff          call   bd61e <SendData+0xce>
   bd622:   85 ff                   test   %edi,%edi
   bd624:   66 89 74 24 0e          mov    %si,0xe(%esp,1)
   bd629:   0f 8f 71 ff ff ff       jg     bd5a0 <SendData+0x50>
   bd62f:   83 c4 20                add    $0x20,%esp
   bd632:   5b                      pop    %ebx
   bd633:   5e                      pop    %esi
   bd634:   5f                      pop    %edi
   bd635:   5d                      pop    %ebp
   bd636:   c3                      ret   
   bd637:   dd 44 24 18             fldl   0x18(%esp,1)
   bd63b:   dd 1c 24                fstpl  (%esp,1)
   bd63e:   e8 fc ff ff ff          call   bd63f <SendData+0xef>
   bd643:   85 c0                   test   %eax,%eax
   bd645:   74 e8                   je     bd62f <SendData+0xdf>
   bd647:   e9 39 ff ff ff          jmp    bd585 <SendData+0x35>
   bd64c:   8d 74 26 00             lea    0x0(%esi,1),%esi
00bd550:
SendData():
bd550:55%推压ebp
bd551:57推送%edi
bd552:56推送%esi
bd553:53推送百分比ebx
bd554:83 ec 20子$0x20,%esp
bd557:8b 35 74 a2 06 00 mov 0x6a274,%esi
bd55d:8b 1d ac a2 06 00 mov 0x6a2ac,%ebx
bd563:dd 44 24 40 fldl 0x40(%esp,1)
bd567:66 c7 44 24 0e 00 00 movw$0x0,0xe(%esp,1)
bd56e:83 eb 18分$0x18,%ebx
bd571:85 f6测试%esi,%esi
bd573:dd 5c 24 18 fstpl 0x18(%esp,1)
bd577:dd 44 24 48 fldl 0x48(%esp,1)
bd57b:dd 5c 24 10 fstpl 0x10(%esp,1)
bd57f:0f 85 b2 00 jne bd637
bd585:8b 7c 24 38 mov 0x38(%esp,1),%edi
bd589:89日折旧变动率%ebx,%ebp
bd58b:c1 fd 02 sar$0x2,%ebp
bd58e:85 ff测试%edi,%edi
bd590:0f 8e 99 00 00 jle bd62f
bd596:8d 76 00 lea 0x0(%esi),%esi
bd599:8d bc 27 00 00 lea 0x0(%edi,1),%edi
bd5a0:0f b7 74 24 0e movzwl 0xe(%esp,1),%esi
bd5a5:39 ef cmp%ebp%edi
bd5a7:89 e8 mov%ebp%eax
bd5a9:0f 4e c7 cmovle%edi,%eax
bd5ac:dd 44 24 18 fldl 0x18(%esp,1)
bd5b0:89 c5 mov%eax,%ebp
bd5b2:8d 1c ad 00 lea 0x0(,%ebp,4),%ebx
bd5b9:29 ef低于%ebp,%edi
bd5bb:01 c6添加%eax,%esi
bd5bd:a1 a8 a2 06 00 mov 0x6a2a8,%eax
bd5c2:8d 56 ff lea 0xffffffff(%esi),%edx
bd5c5:dd 58 08 fstpl 0x8(%eax)
bd5c8:66 89 50 06 mov%dx,0x6(%eax)
bd5cc:0f b7 54 24 0e movzwl 0xe(%esp,1),%edx
bd5d1:66 89 50 04 mov%dx,0x4(%eax)
bd5d5:8b 54 24 3c mov 0x3c(%esp,1),%edx
bd5d9:89 10 mov%edx,(%eax)
bd5db:dd 44 24 10 fldl 0x10(%esp,1)
bd5df:dd 58 10 fstpl 0x10(%eax)
bd5e2:8b 54 24 34 mov 0x34(%esp,1),%edx
bd5e6:0f bf 44 24 0e movswl 0xe(%esp,1),%eax
bd5eb:89 5c 24 08 mov%ebx,0x8(%esp,1)
bd5ef:83 c3 18添加$0x18,%ebx
bd5f2:8d 04 82 lea(%edx,%eax,4),%eax
bd5f5:89 44 24 04 mov%eax,0x4(%esp,1)
bd5f9:a1 a8 a2 06 00 mov 0x6a2a8,%eax
bd5fe:83 C018添加$0x18,%eax
bd601:89 04 24 mov%eax,(%esp,1)
bd604:e8 fc ff呼叫bd605
bd609:a1 a8 a2 06 00 mov 0x6a2a8,%eax
bd60e:c7 44 24 08 00动产$0x0,0x8(%esp,1)
bd615:00
bd616:89 5c 24 04 mov%ebx,0x4(%esp,1)
bd61a:89 04 24 mov%eax,(%esp,1)
bd61d:e8 fc ff呼叫bd61e
bd622:85 ff测试%edi,%edi
bd624:66 89 74 24 0e mov%si,0xe(%esp,1)
bd629:0f 8f 71 ff jg bd5a0
bd62f:83 c4 20添加$0x20,%esp
bd632:50亿波普%ebx
bd633:5e pop%esi
bd634:5f pop%edi
bd635:5d pop%ebp
bd636:c3 ret
bd637:dd 44 24 18 fldl 0x18(%esp,1)
bd63b:dd 1c 24 fstpl(%esp,1)
bd63e:e8 fc ff呼叫bd63f
bd643:85 c0测试%eax,%eax
bd645:74 e8 je bd62f
bd647:e9 39 ff jmp bd585
bd64c:8d 74 26 00 lea 0x0(%esi,1),%esi
使用(实模式调试器),这将转换为“call-1”,因此bd603处的字节将确定将执行哪个命令。例如,如果这个字节是FF,那么下一个命令将是“jmp ax”,它可能是递归的

无论如何,这看起来更像是一些反调试/自修改代码,而不是真正有意义的代码。

使用(实模式调试器),这将转换为“call-1”,因此bd603处的字节将确定将执行哪个命令。例如,如果这个字节是FF,那么下一个命令将是“jmp ax”,它可能是递归的


无论如何,这看起来像是一些反调试/自我修改的代码,而不是真正有意义的代码。

您可能是从反汇编对象文件(.o)中得到这个转储文件的。如前所述,
e8 fc ff
序列对应于链接阶段之前的函数调用,即在您调用的函数的最终地址(在可执行文件中)已知之前。在此阶段,有关此调用目的地的信息存储在目标文件的重定位表中,等待链接器将可执行文件放在一起


为了避免这个问题,您应该分析最终可执行文件的转储,而不是某个目标文件的转储。在这里,链接器的工作将完成,调用操作数将对应于它们的实际目的地。

您可能是通过反汇编对象文件(.o)获得此转储的。如前所述,
e8 fc ff
序列对应于链接阶段之前的函数调用,在您调用的函数的最终地址(在可执行文件中)已知之前