格式化字符串的使用&分析
void print(char * format, ...)
{
char LogBuf[1024];
va_list arglist;
va_start(arglist, format);
int nRet = _vsnprintf ( LogBuf, 1024, (const char*)format, arglist);
va_end(arglist);
printf("%s/r/n", LogBuf);
}
反汇编 print 函数的下面示例:
print("%d %d %d", 1,2,3);
void print(char * format, ...)
{
push ebp
mov ebp,esp
sub esp,4E4h
push ebx
push esi
push edi
lea edi,[ebp-4E4h]
mov ecx,139h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
mov eax,dword ptr [___security_cookie (418004h)]
xor eax,ebp
mov dword ptr [ebp-4],eax
char LogBuf[1024];
va_list arglist;
va_start(arglist, format);
lea eax,[ebp+0Ch] // arglist 指向参数列表堆栈地址, 即取得... 参数的堆栈地址
mov dword ptr [ebp-414h],eax
// format : "%d %d %d"
// _vsnprintf 工作原理:取得格式字符串format 中%* 的个数.
// 顺次在arglist 地址上取得与%* 对应的数值,如果是%d 则直接用数值代替格式字符串中%d 位置。
// 如果是%s, 则用数值上的地址的字符串代替格式字符串中%s 位置
int nRet = _vsnprintf ( LogBuf, 1024, (const char*)format, arglist);
mov esi,esp
mov eax,dword ptr [ebp-414h]
push eax
mov ecx,dword ptr [ebp+8]
push ecx
push 400h
lea edx,[ebp-408h]
push edx
call dword ptr [__imp___vsnprintf (419388h)]
add esp,10h
cmp esi,esp
call @ILT+320(__RTC_CheckEsp) (411145h)
mov dword ptr [ebp-420h],eax
va_end(arglist);
mov dword ptr [ebp-414h],0
printf("%s/r/n", LogBuf);
mov esi,esp
lea eax,[ebp-408h]
push eax
push offset string "%s/r/n" (416748h)
call dword ptr [__imp__printf (41938Ch)]
add esp,8
cmp esi,esp
call @ILT+320(__RTC_CheckEsp) (411145h)
}