注册 登录
编程论坛 汇编论坛

求助帖 反汇编

z1058238763 发布于 2016-05-10 21:37, 5700 次点击
08048c60 <func4>:
 8048c60:    57                       push   %edi
 8048c61:    56                       push   %esi
 8048c62:    53                       push   %ebx
 8048c63:    8b 5c 24 10              mov    0x10(%esp),%ebx
 8048c67:    8b 7c 24 14              mov    0x14(%esp),%edi
 8048c6b:    85 db                    test   %ebx,%ebx
 8048c6d:    7e 2b                    jle    8048c9a <func4+0x3a>
 8048c6f:    89 f8                    mov    %edi,%eax
 8048c71:    83 fb 01                 cmp    $0x1,%ebx
 8048c74:    74 29                    je     8048c9f <func4+0x3f>
 8048c76:    83 ec 08                 sub    $0x8,%esp
 8048c79:    57                       push   %edi
 8048c7a:    8d 43 ff                 lea    -0x1(%ebx),%eax
 8048c7d:    50                       push   %eax
 8048c7e:    e8 dd ff ff ff           call   8048c60 <func4>
 8048c83:    83 c4 08                 add    $0x8,%esp
 8048c86:    8d 34 07                 lea    (%edi,%eax,1),%esi
 8048c89:    57                       push   %edi
 8048c8a:    83 eb 02                 sub    $0x2,%ebx
 8048c8d:    53                       push   %ebx
 8048c8e:    e8 cd ff ff ff           call   8048c60 <func4>
 8048c93:    83 c4 10                 add    $0x10,%esp
 8048c96:    01 f0                    add    %esi,%eax
 8048c98:    eb 05                    jmp    8048c9f <func4+0x3f>
 8048c9a:    b8 00 00 00 00           mov    $0x0,%eax
 8048c9f:    5b                       pop    %ebx
 8048ca0:    5e                       pop    %esi
 8048ca1:    5f                       pop    %edi
 8048ca2:    c3                       ret   
看不懂这个递归= =求帮助
4 回复
#2
zhulei19782016-05-14 05:54
好麻烦的
#3
AXRZ2016-05-15 02:08
用的是ARM语法,每行代码的意义:
 8048c60:    57                       push   %edi                    ;保护即将要被修改的寄存器的值
 8048c61:    56                       push   %esi
 8048c62:    53                       push   %ebx
 8048c63:    8b 5c 24 10              mov    0x10(%esp),%ebx        ;将第二个参数传递至寄存器中:这里很不解,因为堆栈对不上
 8048c67:    8b 7c 24 14              mov    0x14(%esp),%edi        ;将第一个参数传递至寄存器中:同上
 8048c6b:    85 db                    test   %ebx,%ebx
 8048c6d:    7e 2b                    jle    8048c9a <func4+0x3a>    ;这里的话如果EBX为零则跳转至返回0的返回处
 8048c6f:    89 f8                    mov    %edi,%eax               ;这条指令是传递返回数值的趋势
 8048c71:    83 fb 01                 cmp    $0x1,%ebx
 8048c74:    74 29                    je     8048c9f <func4+0x3f>    ;若EBX为1则跳转至返回处
 8048c76:    83 ec 08                 sub    $0x8,%esp               ;将ESP减8
 8048c79:    57                       push   %edi                    ;保存EDI至堆栈:不难看出此时EDI为函数的参数
 8048c7a:    8d 43 ff                 lea    -0x1(%ebx),%eax         ;将[EBX-1]的地址存入EAX
 8048c7d:    50                       push   %eax                    ;保存EAX至堆栈:不难看出此时EAX同为函数的参数
 8048c7e:    e8 dd ff ff ff           call   8048c60 <func4>         ;递归:调用本函数
 8048c83:    83 c4 08                 add    $0x8,%esp               ;栈中参数释放:由此可以得知参数总共是8个字节(64位),因为这是个32位程序,可以猜测到有2个参数
 8048c86:    8d 34 07                 lea    (%edi,%eax,1),%esi      ;将[EDI+EAX+1]的地址存入ESI
 8048c89:    57                       push   %edi                    ;保存EDI至堆栈
 8048c8a:    83 eb 02                 sub    $0x2,%ebx               ;将EBX减2
 8048c8d:    53                       push   %ebx                    ;保存EBX至堆栈
 8048c8e:    e8 cd ff ff ff           call   8048c60 <func4>         ;再次递归
 8048c93:    83 c4 10                 add    $0x10,%esp              ;释放堆栈
 8048c96:    01 f0                    add    %esi,%eax               ;将EAX加上ESI
 8048c98:    eb 05                    jmp    8048c9f <func4+0x3f>    ;跳转至返回处
 8048c9a:    b8 00 00 00 00           mov    $0x0,%eax               ;返回0的返回处
 8048c9f:    5b                       pop    %ebx                    ;返回处:恢复所有被修改了的寄存器的值
 8048ca0:    5e                       pop    %esi
 8048ca1:    5f                       pop    %edi
 8048ca2:    c3                       ret                            ;返回

总而言之你试着去通过结合调用此函数的前后代码,参数的类型,来猜猜这函数的作用,因为单单看一个函数里面的操作是在过于局限
#4
zhulei19782016-05-15 07:38
是啊,也没有中断,看不出是干什么的
#5
AXRZ2016-05-16 01:24
回复 4楼 zhulei1978
在WIN95还是XP之后中断已经全部是由操作系统接手的了,BIOS下的“低效率”中断估计全部被操作系统的“高效率”中断替换,所以现代操作系统中Ring-3用户级程序是碰不到中断的(INT 21H这样的语句在现在的操作系统中会被视为访问非法区域内存的语句:Accessing Memory Violation。中断只有通过驱动程序,外部设备,或系统本身来触发,所以通常32位程序现在是没有INT指令的
1