清朝云资源网

博客

  • 公共DNS服务器地址分享

    在我们的日常网络生活中,DNS(Domain Name System)扮演着至关重要的角色。它相当于网络世界的电话簿,把我们可以理解的网站名(例如:www.google.com)转换成计算机可以理解的IP地址(例如:192.168.1.1)。而公共DNS服务器则是开放给大众使用的,提供DNS解析服务的服务器。

    国内

    • 114DNS
      IPv4:114.114.114.114 114.114.115.115
    • 阿里DNS
      IPv4:223.5.5.5 223.6.6.6
      IPV6:2400:3200::1 2400:3200:baba::1

    国外

    • Google Public DNS
      IPv4:8.8.8.8 8.8.4.4
      IPv6:2001:4860:4860::8888 2001:4860:4860::8844
    • Cloudflare
      IPv4:1.1.1.1  1.0.0.1
      IPv6:2606:4700:4700::1111  2606:4700:4700::1001
    • OpenDNS
      IPv4:208.67.222.222 208.67.220.220
      IPv6:2620:0:ccc::2 2620:0:ccd::2
    • Quad9
      IPv4:9.9.9.9 149.112.112.112
      IPv6:2620:fe::fe 2620:fe::9
  • 互联网副业项目

    互联网副业项目

    大家好,时光如梭,兔年已过去三分之一,如果你还在找项目,请先停一停,听我一言,我们选择项目要做能够产生复利的项目,也就是有沉淀、可以持续做的项目,否则的话,到十年后,2033年,你依然还在找项目做项目的死循环里。

    今天给大家分享6个人人可操作的互联网副业项目,这些项目你不用怀疑,只要坚持做,是一定可以拿到结果的。废话不多说,直接上项目。这些项目我都有写实操,本篇仅作讲解汇总。内容篇幅较长,纯干货分享,建议耐心阅读。

    1、抖音中视频计划

    中视频计划是抖音、西瓜、头条三方发起的创作激励计划,只要在平台发布16:9的视频,只要有播放,官方就给你发钱。活动开通条件,第一个,发布三个作品,第二个,总播放量大于16000,一般对于剪辑新手来说,3个视频是达不到播放要求的,对于新手,一边练习了剪辑技术,一边完成任务,其实也挺不错的。当做几个视频上手以后,也刚好开通了计划,以后发布作品就有了收益。

    e147a1d9806b481e849ee74b43d5166f

    聊聊关于新手选择赛道的问题,如果你没有能力做原创,那么可以选择做二创,也就是把一些猎奇的视频拿过来深加工剪辑,自己重新配音,根据配音内容将画面剪辑重新组合到一起,形成一个全新的作品。这种创作方式,官方也是认可的。就比如剪辑动物世界,荒野求生,、荒野建造、电影、电视剧、动画片、全部都可以做。唯一需要注意的就是B权问题,对于国产的电影电视剧动画片,要特别注意,特别是新出的剧。老电视剧电影动画片随便剪辑,都没有问题的,国外资源的话不用太担心,问题不大。

    新手不知道怎么判断的可以确定素材后现在抖音搜一下,有没有同行剪了,这是个长期项目,做得越久收入越高,哪怕你哪天不更新了,每天依然有钱进账。关于中视频计划,我之前写过一篇非常详细的实战攻略。

    2、抖音壁纸号项目

    其实抖音壁纸号项目是比较适合新手的,相当于上面的中视频来说,上手难度几乎为0,完全就是搬砖项目,先讲一下变现思路,我们把收集的图片上传到抖音的图片小程序,然后我们选几张好看的图片发布抖音图文,通过图文,有人喜欢就想要原图,通过我们留的引导,引导他进入小程序,只有付费或看广告才可以下载,这样我们就产生了收益。

    把全网图片搬到抖音来,没错,我们就是搬运工,图片网站:小红书、知乎、公众号、微博,我们去这些平台多找点分享壁纸的账号,把更新比较频繁的全关注一遍,这样图片问题就解决了,这里有个小技巧,为了解决原创的问题,我们需要对图片参数进行调整,我们把图片参数改了这就是一张原创的图片了。

    把图片上传到抖音小程序里,然后一组照片挑选几张好看的发图文引流。视频播放起来后,在评论区留钩子,观众看见了有兴趣的会顺着钩子去找小程序然后下载图片。整个项目闭环就是如此,项目操作门槛比较低,我很推荐大家来做的。特别是新人朋友,不信你抖音搜一下,很多人做得很好。也赚到钱了。

    这是一个长期项目,随着发的作品越来越多,你的收益会节节攀升。中后期即便你不更新了,依然每天都有钱拿,完全是躺赚。

    3、闲鱼无货源项目

    这是个老掉牙的项目了,对于老司机,可能会嗤之以鼻,但是,闲鱼的火热经久不衰是有原因的,闲鱼都快十多年了,现在反而比之前还火,就是越来越多的人对于二手产品的需求越来越大导致的。

    我们要做的就是做个倒爷,左手倒右手,拼多多倒闲鱼,客户下单,我们下单,客户退货我们退货,客户有疑问,我们也去问卖家,唯一需要注意的就是违J品、侵权、涉及到品牌的我们要注意,还有一个就是尽量去做高利润的,比如一单最少要赚个20元把,我是真心佩服闲鱼那些做低单价的同行,卖便宜的日化的那种,虽然单多,但是利润微薄,一天下来把人都累死了还赚不了多少钱,我建议新手不要做低利润的。做闲鱼要每天要做四件事即可,发产品,擦亮,签到,做闲鱼币任务。就这三样,坚持下去。

    如果发的产品没曝光要么就是敏感了,要么就是你的号有问题,换号继续干。一个号跑通后,根据自己情况,适量多号操作,利润翻倍。

    4、小红书AI绘画项目

    这是基于目前流行的AI衍生出来可落地的项目,根据客户需求将客户发给你的人物照片,利用AI生成2.5D风格、或卡通漫画风格图片发给客户获取报酬,引流也是简单粗暴,直接在小红书多分享点图片就行了,个人介绍里写上支持定制就可以了,有兴趣的粉丝会私信你的。然后我们引导的私域W信来做成交。

    63bc099674db4f4398d278c1f5b046f2

    5、公众号项目

    如果你和我一样,热爱分享、愿意将自己的故事、创业经验、分享给各位屏幕前的陌生人,那么我推荐你也和我一样来做一个知识分享的公众号,你不一定要和我一样做创业,如果你感觉没有别的可写,那么可以做创业公众号,因为创业的公众号变现强。

    6、网站项目

    为什么要聊这个项目,曾经的web 网站可以说整个互联网全靠它,但是由于中国互联网发展路径与国外产生差异,导致国内应用几乎全部转移到了手机端移动互联网,被APP、小程序取代,各类web 网站、PC软件、被边缘化,被淘汰,甚至是曾经的TOP也纷纷陨落,比如天涯论坛、贴吧,已经很久没听到他们的声音了,这是时代的浪潮,我们没有办法。

    但是,我今天却要跟大家聊聊网站这个项目,根据中国互联网发布的网站数据显示,中国互联网web网站正在以每年几十万数量急剧减少,这说明越来越多的站长放弃了网站,我们的竞争对手变少了,再加上在2023年的今天,AI出现了,内容已经完全被解决,不需要我们自己去做磕嘴的伪原创垃圾文章了。

    瘦死的骆驼比马大,虽说现在搜索给的流量不多,但是,只要随着时间,收录的页面持续增加,这些可都是真正的免费流量,再加上竞争对手每年都在逐渐减少,内容又被AI解决,所以我认为今年是做网站的最佳机会!放那里稳定更新内容,随着时间的推移,你的网站竞争力只会越来越强。

    27fe4f362b444e578b117675133f3382

    以上分享的6个项目都没有多大难度,不需要你有资源,有人脉,需要的仅仅是一双手、一台能上网的电脑就能立马开干。

    我钱幕是个实在人,说话很直接,我分享的这些项目可以说没毛病,你要能挑出毛病,什么这个项目不好做吧,那个项目红海了吧,只能说明你对赚钱的欲望还不够大,人一旦不想做一件事,能找出一百个理由。这些项目每个都有一堆人在做,他们也是从零一步步坚持过来的,你甚至都还还没开始。其实你更应该扪心自问,到底是什么原因阻碍了你赚钱。

  • 2023最新OneTool多平台助手程序源码

    2023最新OneTool多平台助手程序源码

    2023最新OneTool多平台助手程序源码+视频教程

    OneTool 是一款功能强大的多平台助手,目前最新版本为 199911 (1.9.1)。除此之外,该应用程序还拥有其他好玩的功能,等着您们来搭建测试。

    可以帮助用户快速完成各种任务。例如网易云音乐每日签到、每日云贝、打卡 300 首歌曲、音乐人每日任务等;WX 运动健身记步范围设定, QQ 空间秒赞秒评;哔哩哔哩视频短片每日签到、每日在线观看、投币机、动漫作品每日签到、分享视频、天选抽奖活动;百度贴吧签到;爱奇艺 VIP 每日任务、每日抽奖活动、二端每日签到等等,都可以通过 OneTool 进行快速操作。

    搭建环境需求:PHP8.0    伪静态设置为thinkphp规则    运行目录设置为public

    下载地址:[reply]https://wwch.lanzoul.com/iOcP70xzndmh容[/reply]

    af1e5b0d2943407ea5c768e43abb7947

    b20e15be14f44f4a973e89d8f04d001a

    a5552d1db285418a94a44728a0fc1d9c

    ede735a1af534fa79f52ef09e215861d

    ae0834bb467945a2a224fdb7cbc877df

     

  • 6月2日,星期五,在这里每天60秒读懂世界!

    6月2日,农历四月十五,星期五!

    在这里,每天60秒读懂世界!

    1、教育部:2023年全国高考报名人数1291万人,再创历史新高;

    2、贵州一地就移风易俗倡导性标准征求意见:乔迁、订婚、再婚、满月、生日、入伍、升学、谢师、祝寿、立碑、店铺开业等酒席一律禁办;

    3、记者采访贵州织金县教师溺亡案被打,官方:打人者系织金县派出所副所长和2名辅警,对三人作出行拘、革职和解聘处理;

    4、1日凌晨,浙江海宁市黄湾镇闸口村一临时工棚发生爆燃事故,致5人死亡,官方通报:当事人欲非法转移箱体内的油品,私自切割箱体时引发了爆燃;

    https://www.zhihu.com/video/1647774331840122881

    5、湖南长沙开福区一母女在幼儿园门口被撞身亡,事故双方均系家长,幼儿园六一活动取消,涉事车疑似调头过程中倒车,错将油门当刹车;

    车祸现场监控图

    6、1日下午,辽宁多地发生龙卷风,黑色漏斗云接天连地,多趟高铁延误或停驶,官方:初步统计有60余处房屋受损,13人受伤;5月31日晚,云南昭通彝良县两河镇境内持续暴雨引发山洪,已致3死1失联,4人或为祖孙关系,失联者仅4岁;

    https://www.zhihu.com/video/1647774774309986304

    7、网传天津津南区一小区路面隆起开裂住户连夜撤离,官方:连夜对相关楼栋居民作妥善安置,相关专家正对受损路面和建筑进行勘探检测;福州房地产中介协会出台指导意见:买、卖双方各收1.5%中介费;

    8、外媒:美台将签署贸易协议,并希望未来能达成全面的自由贸易协定。外交部:美方不得借经贸名义向"台独"分裂势力发出任何错误信号;

    9、欧盟正讨论制裁7家中企,指控他们对俄出售可用于支持战争的微电子等产品,商务部:希望欧方不要开启恶劣先河;

    10、外媒:来华访问后,特斯拉股票大涨,马斯克时隔半年重登"世界首富宝座",资产近2000亿美元;

    伴随着马斯克来访中国,特斯拉的股价也进一步走高,5月30日早盘曾涨近6%,收涨超4%,市值一夜大涨逾250亿美元(近1800亿人民币)。

    11、朝鲜罕见公开卫星发射照片,金与正:将继续推进军事卫星发射。即使朝鲜用气球发射卫星,美国也会说是"威胁";

    朝鲜“千里马-1”新型运载火箭发射升空。图片来源:朝中社虽然卫星发射失败,但朝鲜仍然公开了发射卫星时火箭升空的照片,朝鲜新型火箭首次对外公布。

    12、巴西总统卢拉在南美洲峰会上向11国喊话抛弃美元:团结起来,创立共同货币与之抗衡;欧洲央行行长:将进一步加息以应对持续高企的通胀;

    ▲ 5 月 30 日,在巴西首都巴西利亚,南美洲 12 国领导人合影。

    13、美国宣布新一轮3亿美元对乌军援,军援包括"爱国者"、"海马斯"和弹药等;外媒:当地5月31日,俄罗斯别尔哥罗德州一地遭乌军大规模炮击,造成数百间公寓受损;

    14、外媒:莫斯科遭无人机袭击后,普京证实乌军事情报总部遭俄导弹袭击报复,人员损失惨重,疑有北约军人受重伤;外媒:乌总统大选临近,有议员指控泽连斯基叛国,已有法院要求刑事调查;

    俄罗斯导弹击中乌克兰国防情报总局情报总局大楼被炸

    15、泽连斯基"下通牒":北约峰会要有明确加入邀请,否则不参加!德国外长:近期不应接纳乌克兰;北约秘书长:将尽快让乌加入北约并正在制定一项多年期的援乌计划;

    泽连斯基1日在摩尔多瓦。

    【微语】一只站在树上的鸟,从来不害怕树枝突然折断,因为它相信的不是树枝,而是它自己的翅膀。

  • QQ协议分析及还原

    最初,QQ通信协议并没有加密,而是直接采取明文的方式进行传输,到了后来才使用了加密传输,加密算法一直没有变过,使用的是blowfish算法,但是密钥的交换协议变得比较频繁。其实TX也是被逼的,现在的互联网用户比前几年更加注重隐私安全,这么大用户量的通信软件,如果用户与对方之间的聊天信息可以轻易的被第三方破译获取,那么用户量肯定会离开她,而去选择那些能够更加保护好个人隐私的人通信软件。因此,随着时间的推移和技术的发展,以前设计的协议可能会被研发者发现一些弱点,“图谋不轨”者加以利用,会对TX造成一些潜在的风险,他不得不对协议进行修改(QQ2011正式版中的密钥交换中对密码的MD5计算就加入了salt的概念,这个salt就是对应的QQ号码,后面会有详细的描叙)。

    QQ协议首选的传输层是UDP,如果UDP不可登陆,那么会再尝试使用TCP进行传输。UDP使用的端口是8000,TCP使用的端口是443,应用协议基本一样,只是在通过TCP进行传输时,前两个字节为协议内容的长度(包括2个字节)。

    QQ协议中每个通信内容都带有一个协议头部,如下图:采集失败,请手动处理

     

    其中标识1一个字节,版本号、命令字和序号都是2个字节,QQ号码有4个字节,接下来是数据部分(已加密),最后是一个尾部标识1个字节。

    在进行协议还原的时候,最关心的就是协议头部的命令字,需要根据不同的命令字,来进行相应的处理,最终获取密钥解密聊天内容。

     

    QQ登陆协议密钥交换过程,首先我们使用Wireshark抓报文分析,观察主要用到的命令字(见上一篇Header部分的介绍)。

     

    QQ2011登陆过程分析
    命令字 含义
    1、Touch Information(0×0091) 根服务器SAY HELLO,如果对该报文做一些小动作,可以让QQ认为,TX的服务器或网络不能访问…
    2、Login Request(0x00ba) 未知,可以不进行处理。
    3、Login Verify(0x00dd) 向服务器发送登陆请求,需要使用密码进行运算作为密钥才能机密该报文,解密的报文中包含对第4步的解密密钥。
    4、Login get Information(0x00e5) 未知,但是服务器返回的报文你必须得知道,因为这个报文中包含解密会话密钥报文(第6步)的密钥。
    5、Login verify E3(0x00e3) 未知,可以不进行处理。
    6、Login send Information(0×0030) 客户端向服务器发送sessionKey,使用第4步获取的密钥进行解密。

     

     

    1、Touch Information(0×0091)

    这个报文无需关心,是客户端向服务器在SAY HELLO…

    2、Login Request(0x00ba)

    未知,在此处并不重要。

    3、Login Verify(0x00dd)

    非常重要!!获取会话密钥首先得解密该报文。但是要解密该报文,必须得知道该登陆QQ用户的密码,而用户密码只有用户和TX知道,第三方是不知道的(也有可能存在“不可思议”的第三方…)。数据传输过程中使用的加密算法是blowfish,这个算法目前从公开的资料上来说,还没有发现漏洞。因此,要实时获取用户的聊天信息,除非已经知道密码了,或者已经暴力破解了密码(这里简单介绍一下怎么进行暴力破解,这里的暴力破解,当然不是模拟一个QQ客户端不停的向TX服务器发送登陆请求,这样太慢了,而且TX那边也会有记录。首先,得分析出这个报文的密钥生成算法[不是简单的直接使用密码作为密钥],加密算法(这个已知,是blowfish),第二,需要将对方的登陆报文截取保存到文件,然后写一个程序,不停拼接字符串、数字、标点符号进行组合,根据第一步分析它密钥的生成方法生成出密钥,然后作为blowfish算法的密钥,去解密报文,如果解密成功,恭喜你,你暴力破解到了一个QQ密码。但是这种概率比较小,即使有一些,这些号码的价值不大,扯远了…)。

    LoginVerify报文的解密密钥生成方法,在QQ2011版本之前,是MD5(MD5(PWD)),对QQ的密码做了两次MD5运算。但是QQ2011版本(包括2011版本)之后,这个算法做了一点修改,就是:MD5(MD5(PWD+QQ_NUM)),这个修改其实是非常有必要的,为什么呢?因为随着硬件技术的发展,以及前些年MD5彩虹表的推出,简单密码的MD5值非常容易就能从彩虹表中找出对应MD5值,从而得到原始字符串密码,即使TX做了两次的MD5运算。在彩虹表的推出或以前(因为我也不知道是在这以前还是以后,呵呵),在执行MD5运算时,就有了加SALT的说法,很形象!加盐,在这里,QQ_NUM就是盐,这样就加大了使用彩虹表破解的难度。

    使用密码根据以上的算法得出解密密钥,解密Login Verify报文后,会得到一个新的密钥,这个密钥暂且就叫做verify_key。

    Login Verify Reply(0x00dd)

    服务器对客户端Login Verify报文的响应,这个报文需要verify_key作为密钥进行解密,得出一个新的密钥-verify_reply_key。

    4、Login get information(0x00e5)

    客户端接收到服务器的Login Verify Reply报文后,会使用verify_reply_key加密数据发送到服务器,而这里面又包含了一个key – get_info_key。

    5、Login verify E3(0x00e3)

    未知,此处可以不进行处理。

    6、Login send Information(0×0030)

    使用get_info_key解密该报文,得到会话KEY – session key。

    回想一下:密码是关键,有了密码才能解密Login Verify(0x00dd)报文,解密了Login Verify(0x00dd),才能解密后续的的报文。其步骤是:passwd -> verify_key -> verify_reply_key -> get_info_key -> session_key。

    前面两篇简单的介绍了QQ登陆协议密钥交换过程以及所使用的加密算法,知道了这两点,就可以对它的协议进行还原了。

    QQDecrypt,通过winpcap抓包,实时对QQ聊天协议进行还原。采集失败,请手动处理

     

    除了聊天协议之外,我们还可以对QQ相关的协议进行还原,包括但不限于:

    1、QQ文件传输

    2、QQ音频传输

    3、QQ视频传输

    4、QQ密码验证程序

    5、QQ密码获取,是的,你没有看错,有一种主动的方法(用户登录时)就可以获得QQ的密码。在网络出口获取,而不是在客户端进行HOOK的方式获取。

  • QQ协议分析(一)

    QQ协议分析(一)

    QQ协议首选的传输层是UDP,如果UDP不可登陆,那么会再尝试使用TCP进行传输。UDP使用的端口是8000,TCP使用的端口是443,应用协议基本一样,只是在通过TCP进行传输时,前两个字节为协议内容的长度(包括2个字节)。

    QQ协议中每个通信内容都带有一个协议头部,如下图:

    20150508171015088

    其中标识占一个字节,版本号、命令字和序号都是2个字节,QQ号码有4个字节,接下来是数据部分(已加密),最后是一个尾部标识1个字节。

    在进行协议还原的时候,最关心的就是协议头部的命令字,需要根据不同的命令字,来进行相应的处理,最终获取密钥解密聊天内容。

    在2012这一个版本出来之前,接触包的命令是0091,不过QQ2012之后现在的接触包是0825。

    分析最新的qq2014,发现特征码是0828,客户端的特征串是  02 00 00 00 01 01 01 00 00 67 49

    QQ协议的所有包体都有一个很明显又固定的特征,那就是它每一个包体的未加密部分基本相同,加密部分也能通过未加密部分找出密钥来解密包体。

    包结构类型: 

     

    TCPF包我们把它分为5类: 

     

    登录请求包(LIPLogIn Packet),它是由客户端向服务器发出登录请求的数据包。 

     

    登录应答包(LRPLogin Reply Packet),它是由服务器响应客户端登录请求的数据包。

     

    注销请求包(LOPLogOut Packet),它是由客户端向服务器发出注销登录请求的数据包,服务器对这个包不作应答。 

     

    客户端其它包(CSPClient Sent Packet),它是由客户端向服务器发送的其它包。

     

    服务器其它包(SSPServer Sent Packet),它是由服务器向客户端发送的其它包。

     

    包头: 

     

    所有TCPF包的前7个字节是包头,包头可以识别TCPF包的内容。包头的格式为: 

     

    第0字节:TCPF包标识:0x02 

     

    第1-2字节:发送者标识。如果是0x01 0x00,表明是由服务器发送。客户端的标识与所使用的使用的QQ版本有关,目前最新版本QQ2003(0808)的标识为0x0A 0x1D。具体的协议的格式与这个字段所标识的客户端版本有关。目前我们以这个最新的0A1D版本来讨论。 

     

    第3-4字节:命令编号。具体的命令编号含义在《QQ协议概述》(Protocol Overview.rtf)中有描述。如果这个字段是0x00 0x01,那么这是一个注销请求包。如果这个字段是0x00 0x22,而发送者标识是0x01 0x00,那么这是一个登录应答包。如果这个字段是0x00 0x22,而发送者标识是其它(例如0x0A 0x1D),那么这是一个登录请求包。其它的命令代码表明是其它包,我们通过发送者标识来区分它是CSP还是SSP 

     

    第5-6字节:命令序列号。客户端和服务器都有各自的当前发送序列号。每初始发出一个指令的时候,使用当前的序列号,然后把当前序列号加一,如果超过0xFFFF,就绕回。如果是响应对方发出的命令,则使用这个命令的序列号。例如,客户端当前的序列号为0x1110,它向服务发送一个0x0016命令,它使用0x1110这个序列号,服务器收到以后,返回一个序列号为0x11100x0016命令响应。下一次,客户端又发送一个0x0026命令,这一次它使用加一了的序列号0x1111,服务器也响应0x1111序列号的一个0x0026命令响应。如果这是服务器要向客户端发送0x0017命令,它使用它自己的当前序列号,比如说0x2220,客户端收到以后,也响应一个序列号为0x22200x0017命令应答。我们可以通过序列号来判断发出的指令是否已经得到了应答,如果没有,可以重发。服务器对收到的命令的序列号顺序没有要求。服务器也不会一定按照发出的顺序给予应答。  

     

    包尾: 

     

    所有的TCPF包都以0x03作为包尾。在包头和包尾中间的包数据则不同类型的包有所不同。 

     

    LIP包: 

     

    登录请求包的包数据格式为: 

     

    7-10字节(4 bytes):发出登录请求的QQ号码。这是一个Big Endian(高位在前)的unsigned long型数值。例如:0x01 0x82 0x5D 0x90就是0x01825D90,转换为十进制是25320848,表明发出请求的QQ号是25320848 

     

    11-26字节(16 bytes):随机密钥。这个密钥由于加密后面的数据。QQ使用TEA算法来加密数据。它使用的是128bit16 bytes)的密钥。在0A1D版本中,这个密钥已经固定为1601 

     

    27-106字节(80 bytes):加密后的登录包数据。  

     

    LRP包: 

     

    从第7字节开始到包尾前:加密的登录应答包数据。解密的密钥随客户端版本的不同,有不同的可能。在旧有版本中,使用登录包的随机密钥,在后期的版本,使用用户QQ密码的MD5 Digest。在0A1D中,使用QQ密码的MD5 DigestMD5 Digest(这体现了腾讯有多么的愚昧和无耻,为了改变而改变)。LRP包内数据很重要的是16个字节的Session Key,它用来作为以后通讯的加密密钥。  

     

    LOP包: 

     

    它的序列号总是0xFFFF。不过,在新的版本中,好象已经没有了这个要求。 710字节(4 bytes):发送注销登录请求的QQ号码。 

     

    11字节到包尾前:加密的注销登录包数据。使用Session Key作为密钥。  

     

    CSP包:

     

    7-10字节(4 bytes):发送请求的QQ号码。

     

    11字节到包尾前:加密的包数据。使用Session Key作为密钥。  

     

    SSP包: 

     

    从第7字节开始到包尾前:加密的服务器发送包数据,使用Session Key作为密钥。  

     

    QQ加密算法概述: 

     

     

     

     

     

     

     

     

     

    QQ使用的加密算法来源于一种称为TEATiny Encryption Algorithm)加密算法。它是在1994年由英国剑桥大学的David WheelerRoger Needham所发明的一种加密方法。大概来说,它是使用128bit密钥加密64bit数据产生64bit输出的一种算法。这种算法的可靠性是通过加密轮数而不是算法的复杂度来保证的。具体的算法可以参考:

    http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html。

    实现可以参考:

    http://abcn.net/crypto.htm

     

     

    QQ使用的加密算法来源于一种称为TEATiny Encryption Algorithm)加密算法。它是在1994年由英国剑桥大学的David WheelerRoger Needham所发明的一种加密方法。大概来说,它是使用128bit密钥加密64bit数据产生64bit输出的一种算法。这种算法的可靠性是通过加密轮数而不是算法的复杂度来保证的。具体的算法可以参考:。实现可以参考:。

    QQ使用16轮的加密(这是最低限,推荐应该是32轮)。

    QQ在使用这个算法的时候,由于需要加密不定长的数据,所以使用了一些常规的填充办法和交织算法(也就是说,把前一组的加密结果和后一组的进行运算,产生新的结果)。

    具体的填充算法是:原始字符串加上8个字节再加上填充字符数应该是8的倍数(至少填充2个字节)。填充后的字符串是这样组织的。第一个字节,为填充字符数减2 OR 0xA8。后面是填充字节。然后是待加密的数据,最后是70。填充的字节一般是0xAD,但再0A1dD版本中,会使用随机的填充字符串。一般,我们会用解密后最后是否7个零来判断是否正确的解密。

    交织算法:第一个64bits块,按照一般的TEA加密。下一个64bit块与上一组的加密结果XOR生成待加密数据,加密后与上一组的待加密数据XOR生成加密结果。

  • PC端QQ协议解析之0825

    QQ协议0825代号解析,包括客户端发送包和服务器发送包。

    • 基本信息
      • 操作系统:windows7
      • QQ-Version:3643

    客户端到服务器:

    02:数据传输部分,QQ万年不变的开头02结尾03  
    3643:QQ版本信息(刚刚更新到了最新版本)  
    0825:QQ协议代号  
    178a:报文号  
    6b769aef:我的QQ号  
    03000000010101000067be00000000:固定字节,中间的67be估计和QQ版本有关  
    ec41ba151d655e35df012f196de9f970:随机数,用来解密下面的信息  
    c9f6b7a836a390593cd9a419ee38e6e94f7e9ab7912ea81d9df2f6be3ab2da1207b65542d3250f7cc6d82a07398813735e733dca3e625368c4d78c3e95abe5f18e85f30466c908d0ed182279af3a8f9ce897988fb01b667b49ba8fadb76d637c485e68dfd233cb6103:密文
    
    密文解密的数据如下:
    51061fea:unknown
    001800160001:固定的6个字节
    00000450000000010000155b:固定12个字节
    6b769aef:我的QQ号
    0000:第几次发送包
    0000030900080001:
    b73c3812:IP地址
    0002003600120002000100000000000000000000000000000114001d0102:固定字节
    0019:25字节
    02685c3460985734853b88a8b1a2f3fb2c3ea1efea48c40efb:椭圆曲线加密部分,后面要用的
    00000000000000:填充数
    

    服务器到客户端:

    02:同上
    3643:同上
    0825:同上
    178a:同上
    6b769aef:同上
    000000:固定3个字节
    44bada3f5fc0ae793fcddb9ff4348648e7b893b8b018eee0845e9b591ce60adfa5117c65a1da0535570fda2e75e57b9fa4d88c85e8383e1b83922af9bbf0d5baada549aadbf2c6bf1b8df9e12bf2b57bb41a89814c076342de30d7ea33cfbb33f0d934c82777923a03:密文
    
    使用第一个包的秘钥解密,明文如下:
    27d020205c67dcd90539:unknown
    00:无需更换登录的服务器。也就是无需重定向。要重定向的话,这里就是01了。
    0112:固定
    0038:Token长度
    e174e3d081b3c3c5094533e726b622cb3f775709eeb678317ac7ab7272d41e7b224eaa893b535a00ddf052c05bdcdc8b59b674d6885dd8c7:token
    0017000e0001:
    56e94298:时间
    3bac9bcc850f000003100004:unknown
    b73c3812:IP地址
    00000000000000:填充数
  • qq协议 0825 和 0836 udp 登录包解析

    qq协议 0825 和 0836 udp 登录包解析

      • 参考
      • 使用工具:
      • 概念解释
      • udp报文解析
        • 0825 udp 发送包
          • 报文原始数据:
          • 解析
        • 0825 返回包
          • 原始数据
          • 解析
        • 0836 发送包
          • 原始数据
          • 解析

    参考

    0825包参考: https://www.cnblogs.com/mRRRR/p/5288931.html
    虽然是2016年的, 但是里面的结构大体还是不变

    参考: https://github.com/fa-ge/PCQQ-Protocol
    PCQQ协议的实现, 这里面基本都写清楚了, 但是能不能用我还没试过, 最后更新时间为2018年

    TEA参考: https://github.com/ColasDAD/Py3QQTEA/blob/master/QQTEA.py
    用来解密QQ的TEA加密

    QQ版本号参考: https://bbs.kafan.cn/thread-1295613-1-1.html

    使用工具:

    • Python, 用来解密TEA, 方便的生成Hex和md5
    • 网页的dev console, 有的时候可能用来做一些杂活, 比如统计hex长度以及replaceAll
    • Wireshark, 网卡抓包, 用来抓qq的udp登录包

    概念解释

    qq协议中的udp包通常从02这个字节开始, 03这个字节结束, 然后后面紧跟着版本号然后就是命令, 本文以命令的2个字节作为这个包的名称, 比如:0825包的前面就是 023a570825.
    下面的协议报文中的..省略号只是为了对齐, 别一起复制进去解密了

    udp报文解析

    0825 udp 发送包

    0825发送包(本机发送)

    报文原始数据:

    ec4118251291c85acf44cc810800450000bf9143000040110000c0a81f2478e81418f57b1f4000ab6d89023a5708251115731717b40300000001010100006a4b00000000b899860003144579b8da863c1beed200abf0db243954f2e40089ac685f96cf905858602e7c87068d0f3c0cb7b33b17730f79ecd4d22ffdb42b98bb1c261aa2d7055a8a41def93ade17f969335848b41b8a2e671174a6487d81259c1f0b297501b8e542f04bbcc26acb7b5608d966a76ca0e0ca80648b0eee5f28bed43bd07ea12c2342bf092bd92703
    

    hex视图:

    0000   ec 41 18 25 12 91 c8 5a cf 44 cc 81 08 00 45 00
    0010   00 bf 91 43 00 00 40 11 00 00 c0 a8 1f 24 78 e8
    0020   14 18 f5 7b 1f 40 00 ab 6d 89 02 3a 57 08 25 11
    0030   15 73 17 17 b4 03 00 00 00 01 01 01 00 00 6a 4b
    0040   00 00 00 00 b8 99 86 00 03 14 45 79 b8 da 86 3c
    0050   1b ee d2 00 ab f0 db 24 39 54 f2 e4 00 89 ac 68
    0060   5f 96 cf 90 58 58 60 2e 7c 87 06 8d 0f 3c 0c b7
    0070   b3 3b 17 73 0f 79 ec d4 d2 2f fd b4 2b 98 bb 1c
    0080   26 1a a2 d7 05 5a 8a 41 de f9 3a de 17 f9 69 33
    0090   58 48 b4 1b 8a 2e 67 11 74 a6 48 7d 81 25 9c 1f
    00a0   0b 29 75 01 b8 e5 42 f0 4b bc c2 6a cb 7b 56 08
    00b0   d9 66 a7 6c a0 e0 ca 80 64 8b 0e ee 5f 28 be d4
    00c0   3b d0 7e a1 2c 23 42 bf 09 2b d9 27 03
    

    解析

    qq协议头

    0020   .. .. .. .. .. .. .. .. .. .. 02 3a 57 08 25 11
    0030   15 73 17 17 b4 03 00 00 00 01 01 01 00 00 6a 4b
    0040   00 00 00 00 .. .. .. .. .. .. .. .. .. .. .. ..
    
    • 02 qq报文指定前缀
    • 3a 57 版本号, 可从这里 得知为QQ9.5.9 灰度正式版(28605/28606)
    • 08 25 登录命令
    • 11 15 序列号, 序列号默认为每个包递增
    • 73 17 17 b4 qq id hex
    • 03 00 00 fixed const
    • 00 01 01 01 客户端类型
    • 00 00 6a 4b 发行编号
    • 00 00 00 00 fixed const

    TEA密钥, 16字节长

    0040   .. .. .. .. b8 99 86 00 03 14 45 79 b8 da 86 3c
    0050   1b ee d2 00 .. .. .. .. .. .. .. .. .. .. .. ..
    

    TEA密文

    0050   .. .. .. .. ab f0 db 24 39 54 f2 e4 00 89 ac 68
    0060   5f 96 cf 90 58 58 60 2e 7c 87 06 8d 0f 3c 0c b7
    0070   b3 3b 17 73 0f 79 ec d4 d2 2f fd b4 2b 98 bb 1c
    0080   26 1a a2 d7 05 5a 8a 41 de f9 3a de 17 f9 69 33
    0090   58 48 b4 1b 8a 2e 67 11 74 a6 48 7d 81 25 9c 1f
    00a0   0b 29 75 01 b8 e5 42 f0 4b bc c2 6a cb 7b 56 08
    00b0   d9 66 a7 6c a0 e0 ca 80 64 8b 0e ee 5f 28 be d4
    00c0   3b d0 7e a1 2c 23 42 bf 09 2b d9 27 ..
    

    用Tea解密结果:

    001800160001 0000045f00000001000016ff 731717b4 0000 00000309000a 000a0004 78e815b6 0002003600120002000100000000000000000000000000000114001d0103 0019 027bb75bfbed8d28d1f1bcad2065b24bdc594ab8a52f60d88a 051100060a0000000001
    
    • 001800160001 固定6字节
    • 0000045f00000001000016ff 固定12字节
    • 731717b4 qqid
    • 0000 fixed const
    • 78e815b6 120.232.20.24 目标服务器(dst)的ip hex, 可以用这个工具生成
    • 0019 后面token的长度为25字节
    • 027bb75bfbed8d28d1f1bcad2065b24bdc594ab8a52f60d88a token
    • 051100060a0000000001 fixed const

    固定结尾

    00c0   .. .. .. .. .. .. .. .. .. .. .. .. 03
    

    0825 返回包

    0825返回包(服务器发送)

    原始数据

    c85acf44cc81ec41182512910800457400939b12400035113d0778e81418c0a81f241f40f57b007fde35023a5708251115731717b40000006bb7f0867436bf1be9b560a67834497e59f60988affe5d52594f92dde9a60e7361741a79ad9ea1180886c51514a8b9f9ddd3a38348da8b08fdac2f84a5c73758940a5c0168cc6adfca142de0ef763e7d07a9ced632930d4350fc53e5a325324146249a56d823545103
    

    hex视图

    0000   c8 5a cf 44 cc 81 ec 41 18 25 12 91 08 00 45 74
    0010   00 93 9b 12 40 00 35 11 3d 07 78 e8 14 18 c0 a8
    0020   1f 24 1f 40 f5 7b 00 7f de 35 02 3a 57 08 25 11
    0030   15 73 17 17 b4 00 00 00 6b b7 f0 86 74 36 bf 1b
    0040   e9 b5 60 a6 78 34 49 7e 59 f6 09 88 af fe 5d 52
    0050   59 4f 92 dd e9 a6 0e 73 61 74 1a 79 ad 9e a1 18
    0060   08 86 c5 15 14 a8 b9 f9 dd d3 a3 83 48 da 8b 08
    0070   fd ac 2f 84 a5 c7 37 58 94 0a 5c 01 68 cc 6a df
    0080   ca 14 2d e0 ef 76 3e 7d 07 a9 ce d6 32 93 0d 43
    0090   50 fc 53 e5 a3 25 32 41 46 24 9a 56 d8 23 54 51
    00a0   03
    

    解析

    qq协议头

    0020   .. .. .. .. .. .. .. .. .. .. 02 3a 57 08 25 11
    0030   15 73 17 17 b4 00 00 00 .. .. .. .. .. .. .. ..
    
    • 3a 57 qq版本号
    • 08 25 登录命令
    • 11 15 序列号
    • 73 17 17 b4 qq id hex
    • 00 00 00 fixed const

    密文

    0030   .. .. .. .. .. .. .. .. 6b b7 f0 86 74 36 bf 1b
    0040   e9 b5 60 a6 78 34 49 7e 59 f6 09 88 af fe 5d 52
    0050   59 4f 92 dd e9 a6 0e 73 61 74 1a 79 ad 9e a1 18
    0060   08 86 c5 15 14 a8 b9 f9 dd d3 a3 83 48 da 8b 08
    0070   fd ac 2f 84 a5 c7 37 58 94 0a 5c 01 68 cc 6a df
    0080   ca 14 2d e0 ef 76 3e 7d 07 a9 ce d6 32 93 0d 43
    0090   50 fc 53 e5 a3 25 32 41 46 24 9a 56 d8 23 54 51
    

    Tea用一开始的tea key解密结果:

    00 0112 0038 b36b6e93dd2c93a0efff4a129df6b1103e80975e46188430cc6142f62409b14d53fbfa576d2d835ddadce4d0cb8be9206ff46063c72f67f4 0017000e0001 6274c3a4 78ebbf1fd4b5000003100004 78e81418
    
    • 00 无需更换服务器
    • 0112 fixed const
    • b36b6e93dd2c93a0efff4a129df6b1103e80975e46188430cc6142f62409b14d53fbfa576d2d835ddadce4d0cb8be9206ff46063c72f67f4 密钥
    • 0017000e0001 fixed const
    • 6274c3a4 时间hex
    • 78e81418 120.232.20.24 来源服务器的ip hex

    固定结尾

    00a0   03
    

    0836 发送包

    0836发送包

    原始数据

    ec4118251291c85acf44cc810800450003429144000040110000c0a81f2478e81418f57b1f40032e700c023a5708366148731717b40300000001010100006a4b00000000000201030019027bb75bfbed8d28d1f1bcad2065b24bdc594ab8a52f60d88a0000001066762c87707cf5de93d9c7e837e8e7e6883ebe9cd158374921efa7d4392e33ef9ae0965988257ce5e3b9ae9e4d31c2dfed7eb5b5da7d863de63df01b5e22bf8e383cff4ed00bfea9760cd8de7f1177effc1d716cbdf775e56e032a04dd2f2444fa9a607f3ff2bcb0f3229acc2e889dc5eb9a7f23b581b0f39b60eed3a104233c38f6736a2acd7a0ccf932fb00de2c61718c5d81ec950a2be7676eb096d84484198b11b7deb69c7680293878f6936f4ce310f1f86e44d3913c97693188f9728007b44d1f82e7a645425f6667f71c8411f424144693c034f96ed317b8e89f8b8875ab56721a1d5b6f87dac83a2be459c2460686a88ad9dbde2f5ed6a8548f3ab05ee3c1e86a81cc811596e66f1d3a26a6f5d4a80662a0bf00827a8c49837dc02e70fd51bab408ad7e3a9b807905cfbd5666bf606e72f7ba7af53424ab5dec46e0294812d70198268985fae1b13703c28e27c88d69afae91d6db9c4a83c558ba8d8ce2acc3e3fd4d0e983f80f84e2d3d3172ea1584fcf15f26190a3416deb76934dcabfec6e19d0b0d0c7d1e1a37350b8bcc9d374d1ad62361b70bc2224dfc1d39c4d94ba017ffd7c397435e188ece1c2829895d1e0ff972291a83c045a4bf85997c662dfed3a23e757211743f2de7b0ba543f93d6c9a993130b338746a5892209397dbe58735f49d4c10fc320186bbd06140e777124e0ba96a2c1d64bbde0af54bee2b0140c720b5033497a863224b971f905985c4ea411658defbd211ae53906279458c6f5682bfc5a77f6ee8908b40d72f81236d40f225fe63112813128c2a2bc5d1a399766b7e767c098c1c3ce397e3b7434ceb3996cb885b652266187489dd428dad24f57105f8c17cd34d007c57acea0a0e7a6d8af4bb96cf4508b3d733af44b739c8c997323cf7909f7486c04115d251dca4fde643f10c504e99ba3a58ba99d8a77912501ca56dd6bfec2be69d22639915e9387bb19b6ef8ae954b24aadf750b28c8727adac8ef2be125ef5618ad42780d9acbb33b4ffd196490e5b531a5e8d87c84e641878103
    

    hex视图

    0000   ec 41 18 25 12 91 c8 5a cf 44 cc 81 08 00 45 00
    0010   03 42 91 44 00 00 40 11 00 00 c0 a8 1f 24 78 e8
    0020   14 18 f5 7b 1f 40 03 2e 70 0c 02 3a 57 08 36 61
    0030   48 73 17 17 b4 03 00 00 00 01 01 01 00 00 6a 4b
    0040   00 00 00 00 00 02 01 03 00 19 02 7b b7 5b fb ed
    0050   8d 28 d1 f1 bc ad 20 65 b2 4b dc 59 4a b8 a5 2f
    0060   60 d8 8a 00 00 00 10 66 76 2c 87 70 7c f5 de 93
    0070   d9 c7 e8 37 e8 e7 e6 88 3e be 9c d1 58 37 49 21
    0080   ef a7 d4 39 2e 33 ef 9a e0 96 59 88 25 7c e5 e3
    0090   b9 ae 9e 4d 31 c2 df ed 7e b5 b5 da 7d 86 3d e6
    00a0   3d f0 1b 5e 22 bf 8e 38 3c ff 4e d0 0b fe a9 76
    00b0   0c d8 de 7f 11 77 ef fc 1d 71 6c bd f7 75 e5 6e
    00c0   03 2a 04 dd 2f 24 44 fa 9a 60 7f 3f f2 bc b0 f3
    00d0   22 9a cc 2e 88 9d c5 eb 9a 7f 23 b5 81 b0 f3 9b
    00e0   60 ee d3 a1 04 23 3c 38 f6 73 6a 2a cd 7a 0c cf
    00f0   93 2f b0 0d e2 c6 17 18 c5 d8 1e c9 50 a2 be 76
    0100   76 eb 09 6d 84 48 41 98 b1 1b 7d eb 69 c7 68 02
    0110   93 87 8f 69 36 f4 ce 31 0f 1f 86 e4 4d 39 13 c9
    0120   76 93 18 8f 97 28 00 7b 44 d1 f8 2e 7a 64 54 25
    0130   f6 66 7f 71 c8 41 1f 42 41 44 69 3c 03 4f 96 ed
    0140   31 7b 8e 89 f8 b8 87 5a b5 67 21 a1 d5 b6 f8 7d
    0150   ac 83 a2 be 45 9c 24 60 68 6a 88 ad 9d bd e2 f5
    0160   ed 6a 85 48 f3 ab 05 ee 3c 1e 86 a8 1c c8 11 59
    0170   6e 66 f1 d3 a2 6a 6f 5d 4a 80 66 2a 0b f0 08 27
    0180   a8 c4 98 37 dc 02 e7 0f d5 1b ab 40 8a d7 e3 a9
    0190   b8 07 90 5c fb d5 66 6b f6 06 e7 2f 7b a7 af 53
    01a0   42 4a b5 de c4 6e 02 94 81 2d 70 19 82 68 98 5f
    01b0   ae 1b 13 70 3c 28 e2 7c 88 d6 9a fa e9 1d 6d b9
    01c0   c4 a8 3c 55 8b a8 d8 ce 2a cc 3e 3f d4 d0 e9 83
    01d0   f8 0f 84 e2 d3 d3 17 2e a1 58 4f cf 15 f2 61 90
    01e0   a3 41 6d eb 76 93 4d ca bf ec 6e 19 d0 b0 d0 c7
    01f0   d1 e1 a3 73 50 b8 bc c9 d3 74 d1 ad 62 36 1b 70
    0200   bc 22 24 df c1 d3 9c 4d 94 ba 01 7f fd 7c 39 74
    0210   35 e1 88 ec e1 c2 82 98 95 d1 e0 ff 97 22 91 a8
    0220   3c 04 5a 4b f8 59 97 c6 62 df ed 3a 23 e7 57 21
    0230   17 43 f2 de 7b 0b a5 43 f9 3d 6c 9a 99 31 30 b3
    0240   38 74 6a 58 92 20 93 97 db e5 87 35 f4 9d 4c 10
    0250   fc 32 01 86 bb d0 61 40 e7 77 12 4e 0b a9 6a 2c
    0260   1d 64 bb de 0a f5 4b ee 2b 01 40 c7 20 b5 03 34
    0270   97 a8 63 22 4b 97 1f 90 59 85 c4 ea 41 16 58 de
    0280   fb d2 11 ae 53 90 62 79 45 8c 6f 56 82 bf c5 a7
    0290   7f 6e e8 90 8b 40 d7 2f 81 23 6d 40 f2 25 fe 63
    02a0   11 28 13 12 8c 2a 2b c5 d1 a3 99 76 6b 7e 76 7c
    02b0   09 8c 1c 3c e3 97 e3 b7 43 4c eb 39 96 cb 88 5b
    02c0   65 22 66 18 74 89 dd 42 8d ad 24 f5 71 05 f8 c1
    02d0   7c d3 4d 00 7c 57 ac ea 0a 0e 7a 6d 8a f4 bb 96
    02e0   cf 45 08 b3 d7 33 af 44 b7 39 c8 c9 97 32 3c f7
    02f0   90 9f 74 86 c0 41 15 d2 51 dc a4 fd e6 43 f1 0c
    0300   50 4e 99 ba 3a 58 ba 99 d8 a7 79 12 50 1c a5 6d
    0310   d6 bf ec 2b e6 9d 22 63 99 15 e9 38 7b b1 9b 6e
    0320   f8 ae 95 4b 24 aa df 75 0b 28 c8 72 7a da c8 ef
    0330   2b e1 25 ef 56 18 ad 42 78 0d 9a cb b3 3b 4f fd
    0340   19 64 90 e5 b5 31 a5 e8 d8 7c 84 e6 41 87 81 03
    

    解析

    qq协议头

    0020   .. .. .. .. .. .. .. .. .. .. 02 3a 57 08 36 61
    0030   48 73 17 17 b4 03 00 00 00 01 01 01 00 00 6a 4b
    0040   00 00 00 00 00 02 01 03 00 19 .. .. .. .. .. ..
    
    • 02 qq协议指定前缀
    • 3a 57 qq客户端版本
    • 08 36 二次登录命令
    • 61 48 该包序列号
    • 73 17 17 b4 qq id hex
    • 03 00 00 fixed const
    • 00 01 01 01 client type
    • 00 00 6a 4b 发行编号
    • 00 00 00 00 00 fixed const
    • 02 01 推测是subVer
    • 03 00 推测是echd ver
    • 19 fixed const

    DhPublickey

    0040   .. .. .. .. .. .. .. .. .. .. 02 7b b7 5b fb ed
    0050   8d 28 d1 f1 bc ad 20 65 b2 4b dc 59 4a b8 a5 2f
    0060   60 d8 8a .. .. .. .. .. .. .. .. .. .. .. .. ..
    

    fixed const

    0060   .. .. .. 00 00 00 10 .. .. .. .. .. .. .. .. ..
    

    随机

    0060   .. .. .. .. .. .. .. 66 76 2c 87 70 7c f5 de 93
    0070   d9 c7 e8 37 e8 e7 e6 .. .. .. .. .. .. .. .. ..
    

    密文
    是用DhShareKey私钥加密

    0070   .. .. .. .. .. .. .. 88 3e be 9c d1 58 37 49 21
    0080   ef a7 d4 39 2e 33 ef 9a e0 96 59 88 25 7c e5 e3
    0090   b9 ae 9e 4d 31 c2 df ed 7e b5 b5 da 7d 86 3d e6
    00a0   3d f0 1b 5e 22 bf 8e 38 3c ff 4e d0 0b fe a9 76
    00b0   0c d8 de 7f 11 77 ef fc 1d 71 6c bd f7 75 e5 6e
    00c0   03 2a 04 dd 2f 24 44 fa 9a 60 7f 3f f2 bc b0 f3
    00d0   22 9a cc 2e 88 9d c5 eb 9a 7f 23 b5 81 b0 f3 9b
    00e0   60 ee d3 a1 04 23 3c 38 f6 73 6a 2a cd 7a 0c cf
    00f0   93 2f b0 0d e2 c6 17 18 c5 d8 1e c9 50 a2 be 76
    0100   76 eb 09 6d 84 48 41 98 b1 1b 7d eb 69 c7 68 02
    0110   93 87 8f 69 36 f4 ce 31 0f 1f 86 e4 4d 39 13 c9
    0120   76 93 18 8f 97 28 00 7b 44 d1 f8 2e 7a 64 54 25
    0130   f6 66 7f 71 c8 41 1f 42 41 44 69 3c 03 4f 96 ed
    0140   31 7b 8e 89 f8 b8 87 5a b5 67 21 a1 d5 b6 f8 7d
    0150   ac 83 a2 be 45 9c 24 60 68 6a 88 ad 9d bd e2 f5
    0160   ed 6a 85 48 f3 ab 05 ee 3c 1e 86 a8 1c c8 11 59
    0170   6e 66 f1 d3 a2 6a 6f 5d 4a 80 66 2a 0b f0 08 27
    0180   a8 c4 98 37 dc 02 e7 0f d5 1b ab 40 8a d7 e3 a9
    0190   b8 07 90 5c fb d5 66 6b f6 06 e7 2f 7b a7 af 53
    01a0   42 4a b5 de c4 6e 02 94 81 2d 70 19 82 68 98 5f
    01b0   ae 1b 13 70 3c 28 e2 7c 88 d6 9a fa e9 1d 6d b9
    01c0   c4 a8 3c 55 8b a8 d8 ce 2a cc 3e 3f d4 d0 e9 83
    01d0   f8 0f 84 e2 d3 d3 17 2e a1 58 4f cf 15 f2 61 90
    01e0   a3 41 6d eb 76 93 4d ca bf ec 6e 19 d0 b0 d0 c7
    01f0   d1 e1 a3 73 50 b8 bc c9 d3 74 d1 ad 62 36 1b 70
    0200   bc 22 24 df c1 d3 9c 4d 94 ba 01 7f fd 7c 39 74
    0210   35 e1 88 ec e1 c2 82 98 95 d1 e0 ff 97 22 91 a8
    0220   3c 04 5a 4b f8 59 97 c6 62 df ed 3a 23 e7 57 21
    0230   17 43 f2 de 7b 0b a5 43 f9 3d 6c 9a 99 31 30 b3
    0240   38 74 6a 58 92 20 93 97 db e5 87 35 f4 9d 4c 10
    0250   fc 32 01 86 bb d0 61 40 e7 77 12 4e 0b a9 6a 2c
    0260   1d 64 bb de 0a f5 4b ee 2b 01 40 c7 20 b5 03 34
    0270   97 a8 63 22 4b 97 1f 90 59 85 c4 ea 41 16 58 de
    0280   fb d2 11 ae 53 90 62 79 45 8c 6f 56 82 bf c5 a7
    0290   7f 6e e8 90 8b 40 d7 2f 81 23 6d 40 f2 25 fe 63
    02a0   11 28 13 12 8c 2a 2b c5 d1 a3 99 76 6b 7e 76 7c
    02b0   09 8c 1c 3c e3 97 e3 b7 43 4c eb 39 96 cb 88 5b
    02c0   65 22 66 18 74 89 dd 42 8d ad 24 f5 71 05 f8 c1
    02d0   7c d3 4d 00 7c 57 ac ea 0a 0e 7a 6d 8a f4 bb 96
    02e0   cf 45 08 b3 d7 33 af 44 b7 39 c8 c9 97 32 3c f7
    02f0   90 9f 74 86 c0 41 15 d2 51 dc a4 fd e6 43 f1 0c
    0300   50 4e 99 ba 3a 58 ba 99 d8 a7 79 12 50 1c a5 6d
    0310   d6 bf ec 2b e6 9d 22 63 99 15 e9 38 7b b1 9b 6e
    0320   f8 ae 95 4b 24 aa df 75 0b 28 c8 72 7a da c8 ef
    0330   2b e1 25 ef 56 18 ad 42 78 0d 9a cb b3 3b 4f fd
    0340   19 64 90 e5 b5 31 a5 e8 d8 7c 84 e6 41 87 81 ..
    

    固定结尾

    0340   .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 03
    
  • 检测公网 ip 变化后发送邮箱(三)- 制作方便使用的 docker 镜像

    检测公网 ip 变化后发送邮箱(三)- 制作方便使用的 docker 镜像

    一、修改脚本

    之前用 python 脚本完成了检测公网 ip 变化后发送邮箱的功能。实际能使用,但是如果运行在本地需要做相应的修改。

    个人非常喜欢用 docker 将程序打包,这个脚本也不例外,当然既然要放在 docker 里面运行,就对之前的脚本做了一定的修改和完善。

    比如说之前的 api 只能设置一个,现在可以一次性配置多个,以免某个 api 出现问题导致脚本无法正常运行。此外,将收发件邮箱、授权密码和检测间隔等都做成了环境变量。

    import os
    import requests
    import re
    import time
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.header import Header
    
    class ENV:
      def __init__(self):
    
        if(os.environ.get("FROM_EMAIL") == None):
          raise Exception("请配置发送邮箱账户!")
        if(os.environ.get("FROM_EMAIL_PASSWORD") == None):
          raise Exception("请配置发送邮箱授权密码!")
    
        api_str = "https://myip4.ipip.net, https://ddns.oray.com/checkip, https://ip.3322.net" if os.environ.get("API") == None else os.environ.get("API")
        api_list = api_str.split(",")
        # 对不符合规范添加 http请求头, 使 api 符合协议
        for i in range(len(api_list)):
          match = re.match("http", api_list[i])
          if(match == None):
            api_list[i] = "http://" + api_list[i]
    
        self.api_list = api_list
        self.from_email = os.environ.get("FROM_EMAIL")
        self.from_email_password = os.environ.get("FROM_EMAIL_PASSWORD")
        self.to_email = self.from_email if os.environ.get("TO_EMAIL")  == None else os.environ.get("TO_EMAIL")
        self.smtp_server = "smtp.qq.com" if os.environ.get("SMTP_SERVER") == None else os.environ.get("SMTP_SERVER")
        self.smtp_port = 465 if os.environ.get("SMTP_PORT") == None else os.environ.get("SMTP_PORT")
        self.interval = 10 if os.environ.get("INTERVAL") == None else os.environ.get("SMTP_PORT")
    
    def current_ip(api_list):
      headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"}
    
      for api in api_list:
        html = requests.get(api, headers=headers)
        if(html.status_code == 200):
          currentIp = re.findall( r'[0-9]+(?:\.[0-9]+){3}',html.text)[0]
          return currentIp
      print("所有获取公网的 api 均不可用")
    
    def sendmail(oldIp, currentIp, env):
      # 发信方的信息:发信邮箱,QQ 邮箱授权码
      from_addr = env.from_email
      password = env.from_email_password
      # 收信方邮箱
      to_addr = env.to_email
      # 发信服务器
      smtp_server = env.smtp_server
      smtp_port = env.smtp_port
    
      template = """
      <p>主人,您的 ip 地址改变啦!</p>
      <p>原 ip 地址:{0}</p>
      <p>现 ip 地址:{1}</p>
      """
      html_msg = template.format(oldIp, currentIp)
    
      # 创建一个带附件的实例msg
      msg = MIMEMultipart()
      msg['From'] = Header('阿蛮博客')  # 发送者
      msg['To'] = Header('阿蛮博客')  # 接收者
      subject = 'IP 地址改变提醒'
      msg['Subject'] = Header(subject, 'utf-8')  # 邮件主题
      # 邮件正文内容
      msg.attach(MIMEText(html_msg, 'html', 'utf-8'))
    
      try:
        smtpobj = smtplib.SMTP_SSL(smtp_server)
        smtpobj.connect(smtp_server, smtp_port)    # 建立连接--qq邮箱服务和端口号
        smtpobj.login(from_addr, password)   # 登录--发送者账号和口令
        smtpobj.sendmail(from_addr, to_addr, msg.as_string())
        print("邮件发送成功")
      except smtplib.SMTPException:
        print("无法发送邮件")
      finally:
        # 关闭服务器
        smtpobj.quit()
    
    if __name__ == '__main__':
      # 初始化变量
      env = ENV()
      #随意设置原 ip
      oldIp = "127.0.0.1"
      while True:
        currentIp = current_ip(env.api_list)
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + "---oldIp:" + oldIp + ",currentIp:" + currentIp)
        if(oldIp != currentIp):
          print("Ip 地址发生改变")
          sendmail(oldIp, currentIp, env)
          oldIp = currentIp
        time.sleep(env.interval) 

    二、制作镜像

    dockerfile 内容如下:

    FROM python:3.7-alpine
    
    RUN pip install requests
    
    COPY run.py /run.py
    
    ENTRYPOINT ["python3", "-u","/run.py"]

    制作出来的镜像比较小,20 M 左右。

    三、运行镜像

    最简单运行

    如果你使用的是 qq 邮箱,且收发邮箱都是一个(否则还需要配置收件邮箱),那么你可以运行如下命令:

    docker run -d \
    --name checkip \
    -e FROM_EMAIL="xxx@qq.com" \
    -e FROM_EMAIL_PASSWORD="xxx" \
    --restart=always \
    hausen1012/checkip

    配置全部变量运行

    根据自己需要修改环境变量。

    docker run -d \
    --name checkip \
    -e API="https://myip4.ipip.net,ddns.oray.com/checkip,https://ip.3322.net" \
    -e FROM_EMAIL="xxx@qq.com" \
    -e FROM_EMAIL_PASSWORD="xxx" \
    -e TO_EMAIL="xxx@qq.com" \
    -e SMTP_SERVER="smtp.qq.com" \
    -e SMTP_PORT=465 \
    -e INTERVAL=10 \
    --restart=always \
    hausen1012/checkip

    环境变量解释:

    变量 含义
    FROM_EMAIL 发送人邮箱(必填)
    FROM_EMAIL_PASSWORD 发送人邮箱授权码(必填)
    API 可以返回公网地址的 api,多个地址以半角逗号隔开,默认为 https://myip4.ipip.net, https://ddns.oray.com/checkip, https://ip.3322.net
    TO_EMAIL 收件人邮箱,默认为发送人邮箱
    SMTP_SERVER smtp 服务器地址,默认为 smtp.qq.com
    SMTP_PORT smtp 端口,默认为 465
    INTERVAL 检测间隔,默认为 10s

    了解更多,请访问镜像的 dockerhub 地址

    post-577-63305ff179322

  • 检测公网 ip 变化后发送邮箱(二)- 检测公网 ip 是否改变

    检测公网 ip 变化后发送邮箱(二)- 检测公网 ip 是否改变

    上次搞定发送邮箱的代码以后,接下来就是如果获取自己的公网 ip 了。通过对比 ip 地址,判断是否需要发送邮件。

    获取 ip 地址的网站也有很多,如:https://myip4.ipip.net, https://ddns.oray.com/checkip, https://ip.3322.net 等等。

    大家可以试试,返回的就是你所在网络的出口公网 ip 地址。

    其实如果想要自己搭建一个这样的服务真的非常简单,只需要一个 nginx 。

    其实只需要修改 nginx 的 default.conf 即可。

    server {
      listen 80;
      server_name  localhost;
    
      location / {
        default_type text/plain;
        return 200 "$remote_addr";
      }
    }

    修改后,启动 nginx,然后访问就能得到自己的 ip 了,熟悉 nginx 的话应该不难看懂这个配置。

    但是搭建好的服务需要放在公网,因为如果是局域网搭建的话,请求压根不会经过运营商,自然也就获取不到公网了,返回的是局域网地址。

    我也是做了一个 docker 镜像上传到了仓库。运行 docker run -d -p 80:80 hausen1012/myip 即可,有兴趣的可以去试试。

    下面分享下检测 ip 并发送邮件的完整代码。

    import os
    import requests
    import re
    import time
    # smtplib 用于邮件的发信动作
    import smtplib
    # email 用于构建邮件内容
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    # 构建邮件头
    from email.header import Header
    
    def current_ip():
      headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"}
      html = requests.get('https://ddns.oray.com/checkip', headers=headers)
    
      currentIp = re.findall( r'[0-9]+(?:\.[0-9]+){3}',html.text)[0]
      return currentIp
    
    def sendmail(oldIp, currentIp):
      # 发信方的信息:发信邮箱,QQ 邮箱授权码
      from_addr = 'xxx@qq.com'
      password = 'xxx'
      # 收信方邮箱
      to_addr = 'xxx@qq.com'
      # 发信服务器
      smtp_server = 'smtp.qq.com'
    
      template = """
      <p>主人,您的 ip 地址改变啦!</p>
      <p>原 ip 地址:{0}</p>
      <p>现 ip 地址:{1}</p>
      """
      html_msg = template.format(oldIp, currentIp)
    
      # 创建一个带附件的实例msg
      msg = MIMEMultipart()
      msg['From'] = Header('发送者')  # 发送者
      msg['To'] = Header('接收者')  # 接收者
      subject = 'IP 地址改变提醒'
      msg['Subject'] = Header(subject, 'utf-8')  # 邮件主题
      # 邮件正文内容
      msg.attach(MIMEText(html_msg, 'html', 'utf-8'))
    
      try:
        smtpobj = smtplib.SMTP_SSL(smtp_server)
        smtpobj.connect(smtp_server, 465)    # 建立连接--qq邮箱服务和端口号
        smtpobj.login(from_addr, password)   # 登录--发送者账号和口令
        smtpobj.sendmail(from_addr, to_addr, msg.as_string())
        print("邮件发送成功")
      except smtplib.SMTPException:
        print("无法发送邮件")
      finally:
        # 关闭服务器
        smtpobj.quit()
    
    if __name__ == '__main__':
    
        # 随意设置原 ip
        oldIp = "127.0.0.1"
        while True:
          currentIp = current_ip()
          print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + "---oldIp:" + oldIp + ",currentIp:" + currentIp)
          if(oldIp != currentIp):
            print("Ip 地址发生改变")
            sendmail(oldIp, currentIp)
            oldIp = currentIp
          time.sleep(5) 

    下面是测试结果,同样是完美运行。

    代码日志:

    post-572-632ee5dc4d713

    邮件内容:

    post-572-632ee5e28e1fb

    使用脚本需要注意的是修改邮箱配置。

    晚点做一个 docker 镜像,将邮箱配置、检测间隔作为参数,运行时传参即可。