_acmdln_dll 是什么?

逆向工程 拆卸 视窗 x86
2021-06-25 17:22:48

有人知道是什么_acmdln_dll吗?我找不到任何有用的文档。

我问是因为我尝试分析的程序集中有以下行:

 MOV EAX, DWORD PTR DS : [_acmdln_dll]

在该行之后,我注册EAX了当前进程的路径。所以我的假设现在以_acmdln_dll某种方式将路径存储为字符串序列。真的吗 ?

有人可以确认或有人知道更多信息_acmdln_dll吗?

2个回答

这些是 Microsoft 运行时库提供的全局变量。以下是MSDN在线文档的摘录,其中谈到了该_acmdln变量:

_acmdln, _tcmdln,_wcmdln

这些变量存储完整的命令行。_acmdln将数据存储为字符串_wcmdln将数据存储为宽字符串。_tcmdln可以定义为_acmdln_wcmdln,具体取决于哪个是合适的。

重新阅读原始问题后,似乎我的答案
和我跟进的答案都没有回答
原始问题询问的有关 acmdln_dll 在 vs crt 中无处可寻
的答案,因为它假设后缀__dll 在不是本地 ms 的代码中,就像这里的 reactos

http://code.google.com/p/reactos-mirror/source/browse/trunk/reactos/lib/crtdll/misc/GetArgs.c?spec=svn271&r=271

下面的答案与没有后缀 _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 时代

http://support.microsoft.com/kb/94248