Assembly 尽管源代码中没有递归,但仍进行递归程序集调用
我有一个来自转储的代码片段,我想理解它。 最让我困扰的是(似乎)递归调用 bd604:e8 fc ff呼叫bd605+0xb5 他们是干什么的?我在原始函数中不使用递归 Thanks@schnaader 似乎这些调用发出cld并跳转到EAX 编辑:我的功能的完整dmpAssembly 尽管源代码中没有递归,但仍进行递归程序集调用,assembly,instructions,Assembly,Instructions,我有一个来自转储的代码片段,我想理解它。 最让我困扰的是(似乎)递归调用 bd604:e8 fc ff呼叫bd605+0xb5 他们是干什么的?我在原始函数中不使用递归 Thanks@schnaader 似乎这些调用发出cld并跳转到EAX 编辑:我的功能的完整dmp 00bd550 <SendData>: SendData(): bd550: 55 push %ebp bd551: 57
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
序列对应于链接阶段之前的函数调用,在您调用的函数的最终地址(在可执行文件中)已知之前