69,372
社区成员
发帖
与我相关
我的任务
分享
int _call_num;
void func(int a)
{
int i = 0;
unsigned long adr = 0;
unsigned char *ptr = (unsigned char *)&a;
if(!_call_num) {
for(i = 0; i < a ; ++i) {
ptr -= 4;
adr = *((unsigned long *)ptr);
printf("[func]:%d:%x\n", i, adr);
ptr -= 4;
ptr = (unsigned char *)(*((unsigned long *)ptr));
ptr += 8;
}
_call_num++;
}
}
#include "stdafx.h"
#include <stdlib.h>
int _call_num = 0;
void func(int a)
{
004113A0 push ebp
004113A1 mov ebp,esp
004113A3 sub esp,0E4h
004113A9 push ebx
004113AA push esi
004113AB push edi
004113AC lea edi,[ebp-0E4h]
004113B2 mov ecx,39h
004113B7 mov eax,0CCCCCCCCh
004113BC rep stos dword ptr es:[edi]
void *adr = (void *)0;
004113BE mov dword ptr [adr],0
void **ptr = (void **)&a;
004113C5 lea eax,[a]
004113C8 mov dword ptr [ptr],eax
if(!_call_num)
004113CB cmp dword ptr [_call_num (417178h)],0
004113D2 jne func+0A7h (411447h)
{
for(int i = 0;i < a;i++)
004113D4 mov dword ptr [i],0
004113DB jmp func+46h (4113E6h)
004113DD mov eax,dword ptr [i]
004113E0 add eax,1
004113E3 mov dword ptr [i],eax
004113E6 mov eax,dword ptr [i]
004113E9 cmp eax,dword ptr [a]
004113EC jge func+9Ah (41143Ah)
{
ptr-- ;
004113EE mov eax,dword ptr [ptr]
004113F1 sub eax,4
004113F4 mov dword ptr [ptr],eax
adr = *ptr;
004113F7 mov eax,dword ptr [ptr]
004113FA mov ecx,dword ptr [eax]
004113FC mov dword ptr [adr],ecx
printf("[%d]:%p\n",i,adr);
004113FF mov esi,esp
00411401 mov eax,dword ptr [adr]
00411404 push eax
00411405 mov ecx,dword ptr [i]
00411408 push ecx
00411409 push offset string "[%d]:%p\n" (41563Ch)
0041140E call dword ptr [__imp__printf (4182C4h)]
00411414 add esp,0Ch
00411417 cmp esi,esp
00411419 call @ILT+315(__RTC_CheckEsp) (411140h)
ptr--;
0041141E mov eax,dword ptr [ptr]
00411421 sub eax,4
00411424 mov dword ptr [ptr],eax
ptr = (void **)(*ptr);
00411427 mov eax,dword ptr [ptr]
0041142A mov ecx,dword ptr [eax]
0041142C mov dword ptr [ptr],ecx
ptr += 2;
0041142F mov eax,dword ptr [ptr]
00411432 add eax,8
00411435 mov dword ptr [ptr],eax
}
00411438 jmp func+3Dh (4113DDh)
_call_num++;
0041143A mov eax,dword ptr [_call_num (417178h)]
0041143F add eax,1
00411442 mov dword ptr [_call_num (417178h)],eax
}
}
00411447 pop edi
00411448 pop esi
00411449 pop ebx
0041144A add esp,0E4h
00411450 cmp ebp,esp
00411452 call @ILT+315(__RTC_CheckEsp) (411140h)
00411457 mov esp,ebp
00411459 pop ebp
0041145A ret
unsigned char *ptr = (unsigned char *)&a; //ptr 指向 a
if(!_call_num) {
for(i = 0; i < a ; ++i) {
ptr -= 4; //指向eip,函数的返回地址
adr = *((unsigned long *)ptr);
printf("[func]:%d:%x\n", i, adr);
ptr -= 4; //指向ebp,.
ptr = (unsigned char *)(*((unsigned long *)ptr));//指向调用函数的ebp
ptr += 8; //这里+8是为了上面下次定位.
}
_call_num++;
}
下面这样写要好一点吧
void func(int a){
void *adr = (void *)0;
void **ptr = (void **)&a;
if(!_call_num){
for(int i = 0;i < a;i++){
ptr-- ;
adr = *ptr;
printf("[%d]:%p\n",i,adr);
ptr--;
ptr = (void **)(*ptr);
ptr += 2;
}
_call_num++;
}
}