有人知道是什么_acmdln_dll吗?我找不到任何有用的文档。
我问是因为我尝试分析的程序集中有以下行:
MOV EAX, DWORD PTR DS : [_acmdln_dll]
在该行之后,我注册EAX了当前进程的路径。所以我的假设现在以_acmdln_dll某种方式将路径存储为字符串序列。真的吗 ?
有人可以确认或有人知道更多信息_acmdln_dll吗?
有人知道是什么_acmdln_dll吗?我找不到任何有用的文档。
我问是因为我尝试分析的程序集中有以下行:
MOV EAX, DWORD PTR DS : [_acmdln_dll]
在该行之后,我注册EAX了当前进程的路径。所以我的假设现在以_acmdln_dll某种方式将路径存储为字符串序列。真的吗 ?
有人可以确认或有人知道更多信息_acmdln_dll吗?
这些是 Microsoft 运行时库提供的全局变量。以下是MSDN在线文档的摘录,其中谈到了该_acmdln变量:
_acmdln,_tcmdln,_wcmdln这些变量存储完整的命令行。
_acmdln将数据存储为字符串。_wcmdln将数据存储为宽字符串。_tcmdln可以定义为_acmdln或_wcmdln,具体取决于哪个是合适的。
重新阅读原始问题后,似乎我的答案
和我跟进的答案都没有回答
原始问题询问的有关 acmdln_dll 在 vs crt 中无处可寻
的答案,因为它假设后缀__dll 在不是本地 ms 的代码中,就像这里的 reactos
下面的答案与没有后缀 _dll 的 _acmdln 有关,另请参阅编辑 3
该complete source code用于提供给您acmdln,如果您已经安装连express version of visual studio。
compile a simple hello world with debug info /Zi 并查看源代码,了解它是什么
Visual Studio crt目录下的源文件
DS:[00408018]=7C812FBD (kernel32.GetCommandLineA)
Jump from __tmainCRTStartup+9B
crt0.c:252. _tcmdln = (_TSCHAR *)GetCommandLineT();
这是一个相关的反汇编通知,GetCommandline 的结果被移动到 acmdln 一个全局
/*
* command line, environment, and a few other globals
*/
#ifdef WPRFLAG
wchar_t *_wcmdln; /* points to wide command line */
#else /* WPRFLAG */
char *_acmdln; /* points to command line */
#endif /* WPRFLAG */
char *_aenvptr = NULL; /* points to environment block */
wchar_t *_wenvptr = NULL; /* points to wide environment block */
拆卸
004014D9 CALL newheapt._amsg_exit
004014DE POP ECX
004014DF CALL NEAR DWORD PTR DS:[<&KERNEL32.GetCommandLineA>] ; _tcmdln = (_TSCHAR *)GetCommandLineT();
004014E5 MOV DWORD PTR DS:[_acmdln], EAX
004014EA CALL newheapt.__crtGetEnvironmentStringsA ; _tenvptr = (_TSCHAR *)GetEnvironmentStringsT();
004014EF MOV DWORD PTR DS:[_aenvptr], EAX
004014F4 CALL newheapt._setargv ; if ( _tsetargv() < 0 )
004014F9 TEST EAX, EAX
004014FB JNS SHORT newheapt.00401505
004014FD PUSH 8 ; _amsg_exit(_RT_SPACEARG);
004014FF CALL newheapt._amsg_exit
00401504 POP ECX
00401505 CALL newheapt._setenvp ; if ( _tsetenvp() < 0 )
0040150A TEST EAX, EAX
0040150C JNS SHORT newheapt.00401516
0040150E PUSH 9 ; _amsg_exit(_RT_SPACEENV);
编辑 3
从一般搜索来看,这似乎是在 crtdll.dll 中定义的
C:\WINDOWS\system32>grep -rs _acmdln_dll *
Binary file crtdll.dll matches
Binary file dllcache/crtdll.dll matches
^C
C:\WINDOWS\system32>
在 ollydbg 中加载 dll _acmdln_dll 与 _acmdln 完全相同
73D91D02 |> \FF15 4410>CALL NEAR DWORD PTR DS:[<&KERNEL32.GetCommandLineA>] ; [GetCommandLineA
73D91D08 |. A3 CC3EDB>MOV DWORD PTR DS:[_acmdln_dll], EAX
73D91D0D |. FF15 4010>CALL NEAR DWORD PTR DS:[<&KERNEL32.GetEnvironmentStrings>>; [GetEnvironmentStrings
73D91D13 |. A3 D03EDB>MOV DWORD PTR DS:[73DB3ED0], EAX
73D91D18 |. FF15 0411>CALL NEAR DWORD PTR DS:[<&KERNEL32.GetVersion>] ; kernel32.GetVersion
而这个 crtdll.dll 似乎来自一个较旧的 windows sdk 一个简短的谷歌产生一个页面,其中暗示 crtdll.lib 属于 windows sdk 3.5 时代