zoukankan      html  css  js  c++  java
  • 监控键盘和鼠标记录内容和截屏,更新版本2.0,增加了Linux服务端!!!

     监控本地并将内容远程输出


     新版本1.0更新版本2.0

    主要更新核心    1.增加了linux服务端(直接python3运行)  2.优化占磁盘容量(30MB减至5MB)   3.解决大部分BUG优化了速度和稳定性    4.解决了WINDOWS客户端微小频率弹窗BUG.

     先上结果图,由于是张我之前录制视频的截图,过程没有进行截图,所以很不详细。你大致可以理解是个后门信息传输的一个交互工具。在后面我们详细讲讲原理和其功能。

     这里先把更新版本的LINUX服务端配置教程放台面,客户端IP与LINUX服务端一致。保存放入客户端

     HR.exe则是我们监控键盘和鼠标的监控软件,监控好的内容都会存储在QQdata文件夹里面,QQ.exe则也会监控里面把内容实时传输给服务端。

    用起来非常简单,这时候服务端就会收到在QQdata上面的jpg格式的截屏和Monitor_log.txt里面的数据。

     

     进入MKB

     

    分别是截屏接收images,键盘监听源码(这里是乱码一般不看),键盘监听明文Monitor_log_chinese.txt 

     账号密码,以及截屏,全部到手。 

     

     开发灵感以及环境


    开发环境环境:windows,开发语言:python3.78
    由于在我测试渗透的过程中,发现meterpreter的键盘监听功能过于单调,没有我心目中想要的功能,网上搜索也是大同小异。于是乎就开启了没日没夜碰瓷之旅。
    从设备行为检测Hook学习到远程传输交互Socket,于是也就是此次软件慢慢形成的雏形。完成一次完整的监控交互涉及到所设计出的三个软件
    1.MonitorNoWin.py  2.SocketWinClient.py 3.SocketWinServer.py 这都是我放github上面的源码名称,如果翻译理解就是1.监控无窗口 2.传输客户端 3.传输服务端,。下面我们先讲讲成品怎么使用,之后会将原理和源码分析。
    目前共开发了  网络传输windows客户端 和win服务端,以及一个监控windows软件。 那么还少个用于我们kali linux的服务端,会在近期内开发出来。

    成品监控工具怎么使用


     源码和成品我已经上传githubhttps://github.com/EternalNight996/KBMonitor 手动下载或命令行下载

    如果在linux上git clone感到速度慢,那么可以加代理去下载。如果不加代理建议用浏览器打开上面网址,手动下载zip包后解压即可。

    git clone https://github.com/EternalNight996/KBMonitor.git 
    由于kali linux 的服务端还没开发出来,暂时用于windows去展示。我们将这个github先下载解压或者git clone如下.
    ico就是软件图标后面会教怎么打包修改图标会说,output则是我们成品输出的目录,sourcecode则是源码,README说明书,如果你是看这个博客就可以不去阅读。VCRUNTIME140.dll这个是后面打包压缩时候需要替换用到的,现在我们讲成品只需要打开output.会出现两个文件夹 客户端无弹窗、服务端弹窗。
    1.先在你的电脑打开服务端

     

    输入你这台服务器挂公网的域名或者IP和端口,不一定是6666主要是你开放能接受访问的端口。不能输入被占用的端口。如果输入错误的IP或域名则会直接退出窗口,这时候你需要把配置文件删除,才能重新输入配置。

    如果不能打开软件则删除这个配置文件Monitor_config.txt,也可以打开手动输入保存。把文件复制起来,所有监控从客户端收到的截屏和内容都会存储在MKBimages 和MKBMonitor_log.txt里面,

     开打进入到客户端无弹窗,我们先把复制好的配置文件粘贴到客户端替换。

    在目标机器用管理权限打开,这里的  QQ.exe是我们的远程传输客户端。

    HR.exe则是我们监控键盘和鼠标的监控软件,监控好的内容都会存储在QQdata文件夹里面,QQ.exe则也会监控里面把内容实时传输给服务端。

    用起来非常简单,这时候服务端就会收到在QQdata上面的jpg格式的截屏和Monitor_log.txt里面的数据。

    监控源码分析


    打开刚刚git clone到的文件夹里的sourcecode
    其对应的成品分别是,MonitorNoWin.py==火绒.exe、SocketWinClient.py==QQ.exe、SocketWinServer.py==双击运行服务端.exe
    这里只讲部分核心源码,如果要看全码直接打开源码即可。

    MonitorNoWin.py


    导入的库有几个是第三方库需要pip或其他方式安装,先讲讲安装方式。如果你是两个版本的python则用pip3,如果下载的是python3则pip。python2不适用
    win32api  主要功能比较鸡肋,不过可以有效减缓内存占有率。

    pip install pywin32 

    PIL 一个负责我们这个程序的截屏的模块

    pip install pillow 

    PyHook3 是一个额外库,关于python3x以上的版本,装起来非常困难。这里的库我已经上传到我的github下载后直接执行就可以装好。

    git clone https://github.com/EternalNight996/PyHook3.git

    cd PyHook3

    pip install PyHook3-1.6.1-cp37-cp37m-win_amd64.whl 

    接下来我们挑几段核心代码去理解

    先讲讲键盘监听所写的代码,导入event则是PyHook3所导入监听去监听里面的事件,其中
    event.Ascii(国际标准码十进制表示)、chr(event.Ascii)(将十进制表示转换明文,但是只有部分32-127内)、event.Key(大部分转义都能明文显示,如right mouse等,但是无法显示大小写字母,所以才需要chr(event.Ascii))、event.WindowName(想必看名字就知道了,窗口名称如我们现在用的编辑器)

     红线画的一条就是窗口显示的名称,如果你打开QQ或微信和哔哩哔哩。如果系统检测到你是中文系统环境则是QQ或微信 哔哩哔哩,如果英文则是wechat QQ bilibili,所以我们这个先的列表按格式添加需要监控的窗口。如果你想监控微博则添加微博,如果想监控github 或 博客,则添加即可。

     如果我们再QQ聊天中换了增加了一个会话,则要么多几个字符要改变数字。这样就无法精准去判断它是不是我们需要监听,程序则会忽略些重要信息,我们这段代码,则是判断开头,如果窗口开头有含百度 或 QQ password则会加入后面判断

    我们这段算法,因为们所有记录的消息都有全局变量 MSG去记录,如果每次只记录一次按键就去传输写进文件,就传输一次。那么我们一条等浪费多数bytes去传输,我们后面会将socket传输文本传输一次1024bytes既8192bit,一个字符加上换行也就几个bytes就浪费了1000bytes。。。。
    只需要我们在写进数据和清零数据,前加个开关即可,判断是否持续累计记录字符。status=0既开启写入并清零累计,我们试当回车的时候会这么做。

    .

    下面则是鼠标监听,由于我们设置了标题开关全局,所以当键盘识别到的窗口为列表内则打开开关,这时候鼠标左右键点击才会生效触发。global_title则是触发的关键,event.MessageName,则会记录我们用鼠标点的是左键还是右键,按下还是放开。

     在我们成品的实战过程中我们知道,我们需要放在Msocket文件夹内才可以。那么下面的代码就是解释为什么需要这么做,由于这段时间过于烧脑偷懒了,有大佬可以优化下面请私聊我。

     我们设置的是存储全局变量pathlist,上面存储同样的目录有两种格式,一种是open存储数据的格式,一种是dos用  os库打开的格式。 

     下面函数则是监控的核心,其中pythoncom.PumpMessages()则是循环进入监控,详细了解不深。但是想要退出这个循环需要讲到另一个库

     下面win32api.PostQuitMessage()则是用来退出这个PumpMessages()的循环用的。

     下面也是最后一部分,所有会运行的函数都会在这里面去运行。init_setting()初始化数据只执行一遍threading.Thread()这个函数是为了让程序进入多线程,为什么要多线程?简单理解,如果我们正常运行好几个不同的函数,但我们都处于一条线上,但内容越来越多就容易造成堵塞就像堵车一样。如果我们将道路分好几条线则能有效解决这种问题,其实际用途还是在socket服务端和客户端上解释。

    SocketClient.py客户端分析


     .

    pip install gevent 

    这里我们看到一个注释掉的库,事实上是暂时没用。multiprocessing安装也很简单pip install multiprocessing,在socket客户端我不在使用全局变量,而是改成了导入变量,这样可以大大的提高效率和界面整洁。

     

     在上面我们可以看到有三处都有用这个多线程去带入函数,是因为我们发送数据包到服务器。很容易出现堵塞尤其学我们传输这个图片,截屏大小是根据你电脑分辨率大小决定。

     

    OK我们来看看,由于我电脑分辨率为2550x1440既2K,则产生的截屏大小800kb,和我们平均一次输入几十个字符大小均为167bytes。也就是说图片是一次文本的大小的4900倍,当然这其中也有不少不准确,因为我们用的模块平均一张图的大小是在500kb既3000倍。那么我们按1024去算则是发1次图片相当500次文本。这压力就大很多,如果我们没有多线程,则会卡顿。如这次500还没发完另一个任务就下来了,以此类推。我也特别设置了8192为图片发包大小只需要发63次,当然也容易造成丢失,如果不稳定则改成4092大小即可。
    发包格式我们用的是"gbk"GBK是中文编码格式,正常用的是utf-8但是如果我们发包内容含中文,则会出现乱码。所以收包和发包都需要一套相同的编码格式。

     这个函数是当检测到特定目录和文件有内容,就会则是这条函数,导入绝对文件名。'rb'则是二进制读取,在我们转16进制后会显示x20x0A空格和换行类似b''前面则有个b。

    我们可以看到'{}|{}|{}'其中管道是为了我们服务端收取数据包后,做分割为数组区分。把长度(刚刚计算的字符长度)和类型(txt,pic)文件名 编译十六进制gbk格式发送到服务端,这时候.recv(文本大小1024)监听,当服务端发送来OK收到了。我我们则把数据返回给上层领导去发全部包。

    发完全部包后服务端会发来类型确认存储完毕"pic done"或“txt done”我们就会清理痕迹。到这里我们核心内容也就讲完了。服务端更简单

    SocketWinServer.py服务端


     核心代码好好理解下面代码,我们想把配置好的数据提取放入.bind我们就可以搭建服务器。这种只是微型服务器搭建的一种。

    (socket.AF_INET, socket.SOCK_STREAM)则是表示IP4网络层 和 TCP传输层。。。我们客户端设置的传输层和网络层必须和服务层一样,否则无法传输数据。当我们需要面向大众配置各式各样的路网类型,我们就需要用到多进程和多线程。前面讲过多线程是分化路线阻止堵塞用的,如果你开的服务器,有几十台客户肉鸡,或几百台肉鸡。你需要向他们发送不同的指令和他们向你发送数据包,这时候就容易造成任务堵塞或数据包堵塞。最后崩溃死机类似DDOS攻击,他们利用世界各地所控制的肉鸡向同一个建立服务器连接并发送大量数据包。造成拥堵的原理就是这样。暂时先讲这么多
    1.threading多线程则是共享函数之间的数据,占内存速度快,结束线程也快。支线PID相同,主线一样。
    2.multiprocessing多进程则是函数或类之间与其他互不干涉,独立PID进程每个PID都是独立的,结束掉其他函数PID也能独立存活,不占内存但占CPU,速度没这么快,函数之间的数据不共享。如果我们需要批量发包给多台肉鸡,并利用肉鸡去形成DDOS攻击,我们就会首要考虑multiprocessing.
    讲完区别我们接着看上面代码,listen(20)最大IP访问量,我们最多允许20个人访问服务器。
    之后进入循环语句,接收客户端访问.accept()  rADDR是访问IP和端口,clientSocket则是客户端内存分配地址和其他,我们发包也是通过这个发送。
    接着我们可以clientSocket.recv接收包,其他都会客户端差不多。最后我们讲讲如何打包,和打包的小技巧。

    python如何打包?


    python打包模块有很多,我自己用的比较舒服的是pyinstaller,虽然也有不少问题,但是都能相对克服。之前我发过篇打包的详细分析,这里就不细讲了。
    pip install pyinstaller
    pip install pywin32 
    就安装我这个成品标准打包,打包这个监听器。我们的ICO图标取材与实际的火绒exe图标直接提取,不可以快连接。 -F则是输出单个文件大小为14.6MB本身是可以优化压缩大小的。但是pyinstaller会出现一些动态链接文件替换问题,然后导致无法打开。还是比较简单,一段代码就可以完成,-w是不弹出窗口
    pyinstaller -w -i ico/HR.exe -F sourcecode/MonitorNoWin.py 
     

     pyinstaller -w -i ico/QQ.exe -D sourcecode/SocketWinClient.py 

    -D则是不单个文件,释放出动态链接库和各种库以及配置文件。大小约36MB非常占容量和速度,我们动态程序则可以做优化。

     这时候我们就可以运行了,但我们需要优化大小。我们先把VCRUNTIME140.dll先剪切走,下面把优化软件下载好。

    git clone https://github.com/EternalNight996/upx-3.96-win64.git 

    每次我们打包exe无论是单个exe,还是动态exe都会在当前目录输出一个配置文件格式为.spec我们可以手动修改也可以参照上次默认配置,输入刚刚下载的解压软件的目录,现在的大小就剩20MB左右,压缩减少了3/1大小。

    pyinstaller --upx-dir "C:UsersAdministratorDesktopmyProjectvenvsKBMonitorupx-3.96-win64" --clean SocketWinClient.spec 

    这时候我们还不能正常运行,必须把刚刚的VCRUNTIME140.dll动态配置文件粘贴到刚优化的目录中。

    pyinstaller -c -i ico/1.ico -D sourcecode/SocketWinServer.py 

    这里服务端用的是-c需要弹窗,因为我们如果不用就能直接关闭不会挂后台影响速度,还有需要看具体传输的数据。

    pyinstaller --upx-dir "C:UsersAdministratorDesktopmyProjectvenvsKBMonitorupx-3.96-win64" --clean SocketWinServer.spec 

    把VCRUNTIME140.dll动态配置文件粘贴


    TO THE END

  • 相关阅读:
    一次惨痛的debug的经历-RuntimeError: CUDA error: an illegal memory access was encountered
    Rank loss调研
    守护进程 supervisor
    PHP实现异步请求非阻塞
    PHP实现图片和文字水印(PHP给图片添加水印功能)
    虚拟机相关博客
    小师妹学JavaIO之:文件系统和WatchService
    后端 Java ActionEvent getModifiers()
    Java中常见的锁简述
    关键系统的JVM参数推荐
  • 原文地址:https://www.cnblogs.com/eternalnight/p/14045089.html
Copyright © 2011-2022 走看看