轩辕三官 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 在渗透测试中,一些工具(如Powershell的高版本)的运行依赖于微软的环境。NET框架4.0。 默认情况下,Win7不支持微软。NET框架4.0。为了保证工具可以在Win7下使用,需要安装微软。命令行下的. NET Framework 4.0。 经过一番搜索,我找不到任何关于安装微软的信息。NET框架下的命令行。 于是我写了这篇文章介绍我的实现方法,开源C代码,分享脚本开发的实现原理和细节。 0x01 简介 本文将介绍以下内容: 安装Microsoft的正常方法。Win7下的. NET框架4.0 命令行下的实现方法 实现原则 脚本开发的细节 0x02 Win7下安装Microsoft .NET Framework 4.0的正常方法 Microsoft有两种类型的安装包。NET框架: (1)网络安装程序 下载地址: https://www.microsoft.com/en-us/download/details.aspx?displaylang=enid=17851 Web安装程序的文件非常小,需要互联网连接才能下载其他所需的文件。NET Framework组件。 (2)独立安装程序 下载地址: https://www.microsoft.com/en-US/Download/confirmation.aspx?id=17718 独立安装程序的文件会相对较大,因为它包括完整的组件,并且在安装过程中不需要互联网连接。 以独立安装程序为例。正常流程如下: 1.下载Standalone Installer 获取文件dotnetfx 40 _ full _ x86 _ x64.exe。 2.运行dotNetFx40_Full_x86_x64.exe 弹出对话框,选择同意协议,点击安装按钮。 如下图 3.等待安装过程 如下图 4.安装完成,弹出对话框 如下图 单击“完成”按钮进入下一步。 5.再次弹出对话框,提示选择是否重启系统 如下图 系统重启后,完成所有安装工作。 0x03 命令行下的实现方法 这是我最初的想法: 我们可以通过向安装程序的面板发送按键消息来模拟用户的点击行为。 要确保在命令行下安装,需要向弹出的对话框发送隐藏窗口的消息。 为了保证按键的准确性,不应该通过计算坐标来模拟鼠标点击,而应该通过枚举窗口来获得按钮的句柄,并将鼠标点击的消息发送到目标句柄。 为了验证我的想法,我需要写一个程序,看看能否得到每个安装页面的按钮句柄。 我写了下面的C代码: #包括 #包括 BOOL回调EnumChildWindowProc(HWND Child _ HWND,LPARAM lParam) { WCHAR SZ title[1024]; if (Child_hWnd) { GetWindowText(Child_hWnd,szTitle,sizeof(SZ title)); printf('[*] Handle: X\n',child _ hwnd); printf('[*] Caption: %ws\n ',SZ title); 返回true } 返回false } int _tmain(int argc,_TCHAR *argv[]) { HWND hWnd3=FindWindow(NULL,L'Microsoft。NET Framework 4 Setup’); if (hWnd3==NULL) { printf('[!]我找不到主窗口。\ n’); 返回0; } EnumChildWindows(hWnd3,EnumChildWindowProc,0); 返回0; } 对于第一个安装页面,使用程序枚举所有子窗口、输出句柄和标题,如下图所示。 注意这里的Install按钮,默认情况下它处于禁用状态。如果要进入下一步,需要先将安装按钮设置为启用状态,然后发送鼠标点击的消息。 在代码实现中加入一个if判断来实现。关键代码如下: if (wcscmp(szTitle,L'Install')==0) { printf('[ ]接住!\ n’); printf('[*] Handle: X\n',child _ hwnd); printf('[*] Caption: %ws\n ',SZ title); printf('[*]启用安装按钮。\ n’); EnableWindow(Child_hWnd,TRUE); printf('[*]发送click命令进行安装。\ n’); * PostMessage(Child _ hWnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(0,0)); * PostMessage(Child _ hWnd,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(0,0)); } 在这一步之后,我们将进入下一步,等待安装完成后的第二页,同样枚举所有子窗口,如下图所示。 我们看到上一页的子窗口还在,我们需要向Finish按钮发送一个鼠标点击消息。关键代码如下: if (wcscmp(szTitle,L'Finish')==0) { printf('[ ]接住!\ n’); printf('[*] Handle: X\n',child _ hwnd); printf('[*] Caption: %ws\n ',SZ title); printf('[*]发送click命令完成。\ n’); * PostMessage(Child _ hWnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(0,0)); * PostMessage(Child _ hWnd,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(0,0)); } 接下来,转到最后一步,再次枚举所有子窗口,如下图所示。 我们看到页面的子窗口被刷新,在程序实现这里需要重新获取主窗口的句柄。我们向“稍后重启”按钮发送一条鼠标点击消息,关键代码如下: if (wcscmp(szTitle,L'Restart Later')==0) { printf('[ ]接住!\ n’); printf('[*] Handle: X\n',child _ hwnd); printf('[*] Caption: %ws\n ',SZ title); printf('[*]发送click命令以便稍后重新启动。\ n’); * PostMessage(Child _ hWnd,WM_LBUTTONDOWN,MK_LBUTTON,MAKELPARAM(0,0)); * PostMessage(Child _ hWnd,WM_LBUTTONUP,MK_LBUTTON,MAKELPARAM(0,0)); } 至此,关键实现代码已经完成。 为了完成Microsoft的安装。NET Framework命令行下,需要考虑以下问题: 1.当启动安装程序dotNetFx40_Full_x86_x64.exe前,需要检查安装环境,如果已经存在另一个安装进程,那么会弹框提示冲突 如下图 在这里,你需要在开始之前做一个判断:如果有另一个安装过程,结束安装操作。 2.当启动安装程序dotNetFx40_Full_x86_x64.exe时,会启动子进程Setup.exe,这里没法做到通过设置启动参数隐藏启动进程Setup.exe来隐藏窗口 这里需要添加一个循环判断,一找到就隐藏主窗口。 为了避免过多占用CPU,在做while循环的时候要加一个睡眠功能。 3.启动安装程序后需要模拟鼠标点击 需要注意的是,在接下来的安装过程中,子窗口Install(名为Install)将一直存在。为了避免向安装按钮重复发送点击消息,我使用了第二个函数来匹配其他按钮。 4.安装完成后,弹出新的窗口提示安装成功,捕获子窗口,向其发送鼠标按键的命令 这里捕获的子窗口的名称是Finish。 5.接下来,弹框提示是否重新启动系统时,需要通过FindWindow()重新获得句柄 它可以被放在第二个函数的同一个循环中,当发现子窗口Restart Later时,鼠标按钮命令被发送给它。 注意,需要弹出的窗口是新窗口,不能使用之前的窗口句柄。您需要通过FindWindow()再次获取句柄。 完整的实现代码已经开源,地址如下: https://github . com/3g student/home-of-C-Language/blob/master/Install _。Net _ Framework _ from _ the _命令行. cpp 代码支持微软的安装。NET框架4,微软。NET框架4.5和微软。命令行下的. NET Framework 4.5.1。 0x04 小结 本文介绍了微软的安装方法。NET框架下通过命令行发送鼠标消息,开源C代码,分享脚本开发的实现原理和细节。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子