并不是传址,用OllyDbg调试可知,%cmdcmdline%是通过GetCommandLine函数来获取的:
GetCommandLine函数返回指向当前命令行缓冲区的指针,一般来说,程序是不应该修改这个缓冲区中的数据的,而是应该先拷贝一份再进行修改,
然而CMD在进行变量偏移或变量替换时,却直接修改了缓冲区中的数据,导致之后调用GetCommandLine时返回的都是修改后的值。
例如,在替换%cmdcmdline:~m,n%时,CMD大致是这么做的:- wchar_t *argv = GetCommandLine();
- wcsncpy(argv, argv+m, n);
复制代码 所以在下次调用GetCommandLine时仍然是修改后的值。 |