前段时间看了一阵子汇编,也算是对荒废的大学四年的祭奠,有的时候通过了解底层的东西, 对高级语言的理解还是灰常有帮助地。
c/c++中是存在可变长参数的,但那些仅仅是在编译阶段的可变长参数,运行时的调用参数状态则是固定的,
至于c++中的默认参数就根本和可变长不沾边儿了,只不过编译器做了个顺水人情而已
至于能不能在运行阶段在确定参数的个数呢,当然是可以的,用一些低级语言来做就很容易,例如汇编
下面就是实现一个对 c api sprintf 的改写 sprintf_x
;sprintfx.asm
.386P
.model flat
public _sprintfx
extern _sprintf:near ;C lib api sprintf
;TCHAR* pOutBuf,
;TCHAR* pszFormat,
;LPCTSTR* pszData,
;int x
_sprintfx proc near
push ebp
mov ebp, esp
mov esi, [ebp+10H]
mov ecx, dword ptr [ebp+14H]
LArgv:
push dword ptr [esi] ;sprintf( *, *, argv[] sequenc reverse.... );
add ESI, 4
loop LArgv
push [ebp+0CH] ;sprintf( *, szFormat, .... );
push [ebp+8] ;sprintf( szBuffer, *, .... );
call _sprintf
mov esp, ebp ;balance the stack
pop ebp
ret
_sprintfx endp
[培训]科锐逆向工程师培训第53期2025年7月8日开班!