怎样看库函数的代码??
public _main
_mainproc near
var_58= dwordptr -58h
var_54= dwordptr -54h
var_3C= dwordptr -3Ch
var_2C= dwordptr -2Ch
var_28= dwordptr -28h
var_24= word ptr -24h
var_22= dwordptr -22h
var_4= dwordptr -4
pushebp
movebp, esp
pushedi
subesp, 54h
andesp, 0FFFFFFF0h
moveax, 0
addeax, 0Fh
addeax, 0Fh
shreax, 4
shleax, 4
mov[ebp+var_3C], eax
moveax, [ebp+var_3C]
call__alloca ;请问这个函数在那个库文件里????
call___main
moveax, ds:dword_74
mov[ebp+var_28], eax
movzxeax, ds:word_78
mov[ebp+var_24], ax
leaedi, [ebp+var_22]
cld
movecx, 0Eh
moval, 0
rep stosb
leaeax, [ebp+var_28]
mov[esp+58h+var_54], eax
leaeax, [ebp+var_2C]
mov[esp+58h+var_58], eax
call_strcpy ;请问这个函数在那个库文件里????
moveax, 0
movedi, [ebp+var_4]
leave
retn
_mainendp
上面是一个小程序的反汇编结果
源程序如下
#include <string.h>
int main()
{
char b[20]= "abcde ";
char a[4];
strcpy(a,b);
return 0;
}
我想看反汇编代码中调用到的库函数的反汇编代码
这个程序我用Dev-C++编写的
用gcc编译
用ida反汇编出来的
我的主要目的是想知道__alloca和_strcpy是怎么样使用参数的。
我在C程序中定义了b的长度是20,a的长度是4,那么反应到编译好的结果中,怎么能看出来这点??
这个就要看alloca到底alloc了多少个空间。
不难发现,源程序中,已经发生了溢出了,但是实际上程序并没有崩溃
[解决办法]
这些函数是 c++ 静态库中的吧, 具体定义在那个 .lib 文件中, 看函数的类型了. alloca 属于内存分配方面的, strcpy 是字符串操作方面的, 可能在相应的 lib 文件中, 也有可能被集中在一个整体的 .lib 库文件里. 可以到自己 c++ 的 lib 目录下看看, 用 ida 反汇编试试
[解决办法]
怎么结果不太一样啊
.text:00401290 sub_401290 proc near ; CODE XREF: ___mingw_CRTStartup+E2p
.text:00401290
.text:00401290 var_58 = dword ptr -58h
.text:00401290 var_54 = dword ptr -54h
.text:00401290 var_3C = dword ptr -3Ch
.text:00401290 var_2C = dword ptr -2Ch
.text:00401290 var_28 = dword ptr -28h
.text:00401290 var_24 = word ptr -24h
.text:00401290 var_22 = dword ptr -22h
.text:00401290 var_4 = dword ptr -4
.text:00401290
.text:00401290 push ebp
.text:00401291 mov ebp, esp
.text:00401293 push edi
.text:00401294 sub esp, 54h ; char *
.text:00401297 and esp, 0FFFFFFF0h
.text:0040129A mov eax, 0
.text:0040129F add eax, 0Fh
.text:004012A2 add eax, 0Fh
.text:004012A5 shr eax, 4
.text:004012A8 shl eax, 4
.text:004012AB mov [ebp+var_3C], eax
.text:004012AE mov eax, [ebp+var_3C]
.text:004012B1 call ___chkstk
.text:004012B6 call ___main
.text:004012BB mov eax, ds:dword_403000
.text:004012C0 mov [ebp+var_28], eax
.text:004012C3 movzx eax, ds:word_403004
.text:004012CA mov [ebp+var_24], ax
.text:004012CE lea edi, [ebp+var_22]
.text:004012D1 cld
.text:004012D2 mov ecx, 0Eh
.text:004012D7 mov al, 0
.text:004012D9 rep stosb
.text:004012DB lea eax, [ebp+var_28]
.text:004012DE mov [esp+58h+var_54], eax
.text:004012E2 lea eax, [ebp+var_2C]
.text:004012E5 mov [esp+58h+var_58], eax
.text:004012E8 call strcpy
.text:004012ED mov eax, 0
.text:004012F2 mov edi, [ebp+var_4]
.text:004012F5 leave
.text:004012F6 retn
.text:004012F6 sub_401290 endp
上面的是crt的入口函数.
这里才是main函数
.text:00401426 loc_401426: ; CODE XREF: ___main+Ej
.text:00401426 pop ebx
.text:00401427 pop ebx
.text:00401428 pop ebp
.text:00401429 retn
.text:0040142A ; ---------------------------------------
.text:0040142A
.text:0040142A loc_40142A: ; CODE XREF: ___main+23j
.text:0040142A mov ecx, ds:off_4018F4
.text:00401430 xor eax, eax
.text:00401432 test ecx, ecx
.text:00401434 jmp short loc_401440
.text:00401436 ; ---------------------------------------
.text:00401436
.text:00401436 loc_401436: ; CODE XREF: ___main:loc_401440j
.text:00401436 inc eax
.text:00401437 mov edx, ds:off_4018F4[eax*4]
.text:0040143E test edx, edx
.text:00401440
.text:00401440 loc_401440: ; CODE XREF: ___main+54j
.text:00401440 jnz short loc_401436
.text:00401442 jmp short loc_401405
.text:00401442 ___main endp