首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,546 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,351 阅读
3
【技术分享】NASM x86 Assembly Language
5,982 阅读
4
【技术分享】CK竞技之王游戏辅助制作
3,725 阅读
5
【每日随记】天涯明月刀无限飞修改思路
2,816 阅读
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
Search
标签搜索
Windows
Web安全
Python3
Linux
逆向工程
CTF
红队技术
人工智能
C/C++
黑客工具
Go
密码学
二进制安全
数学
漏洞挖掘
Android
eNSP
渗透测试
蓝队技术
黑客大会
发光的神
累计撰写
160
篇文章
累计收到
103
条评论
首页
栏目
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
页面
实用工具
我的旅程
在线壁纸
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
160
篇与
的结果
2022-08-05
此内容被密码保护
加密文章,请前往内页查看详情
2022年08月05日
56 阅读
0 评论
7 点赞
2022-08-04
【网络通信】IP地址与进制计算 ( 总结 )
IP地址IP地址是一个32位的二进制数,通常被分割为4个 "8位二进制数" (也就是4个字节)。通常用 "点分十进制" 表示成(A.B.C.D)的形式,其中A、B、C、D都是0~255之间的十进制整数。在一个子网中第一个和最后一个为保留地址,所以在一般情况局域网中可使用的IP为1~254。IP类别网络标识可支持网络数目主机标识每个网络支持主机数A类前8位(左第一个为0)2^7-2=126后24位256^3-2=16777214B类前16位(左前两个为10)2^14=16384后16位256^2-2=65534C类前24位(左前三个为110)2^21=2097152后8位256-2=254D类IP地址范围从224.0.0.0 - 239.255.255.255D类IP地址为组播地址,一般用于多路广播用户E类IP地址范围为240.0.0.0 - 255.255.255.255此类为保留地址,留待特殊用途// 全部1十进制那就是255 A:00000000 ~ 01111111 64 + 32 + 16 + 8 + 4 + 2 + 1 // 加起来就是结果127 B:10000000 ~ 10111111 128 32 16 8 4 2 1 C:11000000 ~ 11011111 128 64 16 8 4 2 1 D:11100000 ~ 11101111 128 64 32 8 4 2 1 E:11110000 ~ 11111111 128 64 32 16 8 4 2 1 把是的1加起来就行了等于127,0是一个保留地址,127是一个测试地址。 A类地址范围:1 ~ 126 // 大型网络 B类地址范围:128 ~ 191 // 中型网络 C类地址范围:192 ~ 223 // 小型网络 D类地址范围:224 ~ 239 // 广播地址(路由器用的) E类地址范围:240 ~ 255 // 实验保留(我们用不到)子网掩码简单来说将一个IP地址区分为,网络位和主机位,同一网络位的IP地址能互相通信,不需要通过网关,如果是不同的网络位IP地址进行通信,就需要网关路由转发。192.168.1.0 // C类IP地址 255.255.255.0 // 子网掩码24位 255转二进制是8个1,这里有3组8 3*8=24 11111111.11111111.11111111.00000000 // 连续的1对应的是网络号和子网号 0是主机位 // 地址从 256 - 2 = 254 可以存储1 ~ 254个主机 202.136.10.20 // 20转二进制 00010100 255.255.255.128 // 128转二进制 10000000 20:00010100 // 进行与运算 两个是1那么就是1 一个不是1那就是0 128:10000000 // 两个真那就是真一个真一个假那就是假 可以发现都没对上那就是0 202.136.10.0 // 255全是1那么就是它本身直接写下来 与出来的结果是0加上 255.255.255 // 这个掩码是24位再加上10000000里有一位就是25掩码范围 202.136.10.0/25 // 能储存 2 ^ 25 - 2 = 33554430 个主机 在划分的ip地址中有两个地址是不能用的,那就是网络号和广播地址,所以这里要减去2。 255.255.255.1281.有一个子网计算工具,百度下就有可以很形象的看出来。进制表示有(十进制、二进制、八进制、十六进制)在日常生活中我们用的是十进制,一位的十进制数的范围是0~9如果要表示10,那么就要用两位的十进制数。二进制是计算机用的更适合逻辑运算 二进制只有两种状态1和0表示真和假 类似一个信号开和关一样。1 字节(B)=8 比特(bit)1个字节(Byte)等于8个bit位,每个bit位是0/1两种状态,也就是说一个字节可以表示256个状态,计算机里用字节来作为最基本的存储单位。字节间换算1kB = 1000B(字节, Byte)。1KB=1024B;1MB=1024KB=1024×1024B。1B(byte,字节)= 8 bit(见下文);1KB(Kilobyte,千字节)=1024B= 2^10 B;1MB(Megabyte,兆字节,百万字节,简称"兆")=1024KB= 2^20 B;1GB(Gigabyte,吉字节,十亿字节,又称"千兆")=1024MB= 2^30 B;4字节能存储多大的数字呢?有符号:2 ^ 31 - 1 = 2147483647 无符号:2 ^ 32 - 1 = 4294967295二进制转十进制01100000 转十进制是 96 怎么得出来的呢 很简单 按2的倍数开始计位如下: 0 1 1 0 0 0 0 0 128 64 32 16 8 4 2 1 有1的就把下面的倍数加起来就是了 64 + 32 = 96 这就是结果 十进制转二进制100 转二进制 快速反推思路 在64 ~ 1内多少加起来等于100 64 32 16 8 4 2 1 很显然 64 + 32 + 4 = 100 这样就得出来了 直接补上就是了 64 32 4 都是1其他的是0 最终结果:01100100 二进制转十六进制10:1 0 1 0 8 4 2 1 // 把是1的位数加起来就行 8 + 2 = 10 = A // 在16进制里10就A 38:0 0 1 1 1 0 0 0 // 4位为一组 后面有三个0 不用加0 因为四位一组 8 4 2 1 8 4 2 1 // 前4位2 + 1 = 3 后4位是8 拼接起来 3 + 8 = 38 // 十六进制 38二进制转八进制10:1 0 1 0 1 4 2 1 // 把是1的位数加起来就行 1 + 2 = 12 // 1和2拼接起来 70:0 0 1 1 1 0 0 0 // 3位为一组 有三个0 要加一个0 因为3位一组 2 1 4 2 1 4 2 1 // 前3位4 + 2 + 1 = 7 后3位是0 拼接起来 7 + 0 = 70 // 八进制 70
2022年08月04日
283 阅读
0 评论
37 点赞
2022-08-01
【英语笔记】英语单词笔记
天气单词翻译sunny晴天cloudy阴天rainy雨天windy刮风snowy下雪dry干燥wet湿润cold冷的hot热的thunder打雷typhoon台风rainbow彩虹星期单词翻译Monday星期一Tuesday星期二Wednesday星期三Thursday星期四Friday星期五Saturday星期六Sunday星期天季节单词翻译season季节spring春天summer夏天autumn秋天winter冬天warm暖的hot热的cool凉的食物单词翻译rice米饭noodle面条cookie饼干bread面包cake蛋糕beef牛肉chicken鸡肉fish鱼fruit水果garlic大蒜lamb羊肉meat肉类onion洋葱pork猪肉seafood海鲜vegetables蔬菜文具单词翻译bag包book书pen钢笔ruler尺子pencil铅笔eraser橡皮crayon蜡笔职业单词翻译teacker老师student学生doctor医生nurse护士driver司机farmer农民cook厨师singer歌手其它|单词| 翻译||increasing| 增加||locate | 探索||whereis|然而、在何处|单词翻译abandon放弃、抛弃ability能力、能够able能够、才能aboard在船上about在...附近be about to do sth即将above在什么之上above all首先abroad到国外be absorbed in专心于abstract抽象的abolish废除、废止abrupt突然的、意外的absence缺席、离开absent缺席的、不在场的absolute绝对的、完全的absorb吸收、理解accent口音abundant大量的、丰盛的abuse滥用、妄用academic学业的、教学的accept接收、答应accompany陪伴, 伴随accomplish完成according依照ache疼痛achieve完成achievement成绩acquire获得across横过act行为act on照做action行动account账户accuse控告active有活动力的account for解释accurate准确的activity活动actor男演员actress女演员actual实现的adapt使适应add增加addition加法additional附加的address地址adjective形容词adjust调整administration管理admire赞美admission准许进入admit许可进入adopt采取adult成年的advance前进advanced高级的advantage优势take advantage of乘机adventure奇遇adverb副词advertisement广告advice劝告、建议advise劝告affair实物affect影响afford买得起afraid害怕的after在...之后one after another一个接一个afternoon午后again再次against相反agent代理人ago以前agree赞同、赞成agreed to同意agreed with一致agree on对意见一致agreement协议agriculture农业ahead在前aid援助aim瞄准air空气airline航空公司airplane飞机airport飞机场alarm报警alike相似alive活着all全部above all最重要的after all毕竟all but几乎all over遍及in all总共not at all一点也不allow允许almost几乎alone单独地along往前aloud大声alphabest字母表already已经also也、同样although虽然、尽管altitude高度altogether完全地always总是amaze使惊奇america美国american美国人among在...之中amount数量amuse使欢笑analysis分析analyze分析、分解ancient古代的and和、并、那么、又anger愤怒angle角度angry生气的animal动物announce发表annoy使恼怒annual每年的another另外的answer答案、回复answer for对..负责ant蚂蚁anxious忧虑的any什么、一些anybody任何人anyhow无论如何anyone任何人anything任何实物anything but除此...之外anyway无论如何anywhere在什么地方apart去除apart from除外..外apartment房间apologize道歉apology道歉、辩解apparent明显appear出现appearance出现appetite食欲apple苹果application请求apply应用appoint任命appreciate感激approach走近appropriate正确的approve批准approximately近似,大约april四月area范围,区域argue辩论argument争论arise出现,发生arise from由...而产生arithmetic算术arm手臂,武器army陆军around到处arrange排列arrest逮捕arrival到来arrive到达arrow箭头,记号art艺术article文章artist艺术家as同样as if好像,好似as to至于,关于as well也,又ash灰,灰烬ashamed羞愧的aside在旁边ask询问ask after问候(身体健康)ask for要求,请求asleep睡着的aspect样子,外貌assist援助assistant援助associate交往,结交associate with sb与……来往association协会,社团assume假设assure使确信,向....保证astonish使惊讶astronaut太空人at在...方面atmosphere大气atom原子attach系上,贴上attach to依附attack进攻attempt尝试attend出席attend to倾听attendtion注意,关心pay attention to注意,关心attitude姿势,态度attract吸引attractive吸引人的audience听众Auguest八月aunt姑妈author作家authority权威auto mobile汽车autumn秋天available可用的avenue大街average平均数avoid避免awake醒来award奖品aware知道away离去right away马上awful可怕的baby宝贝back后面,背部back and forth往返background背景backward向后的bad坏的badly坏bag袋子,包baggage行李bake烘、烤balance秤ball球balloon气球ban禁令banana香蕉band带子,乐队bank银行bar酒吧barber理发师bare赤裸bargain廉价物base基础,底部basic基本的,基础的basin盆,脸盆basis基础on the nbasis of在 ... 的基础上basket篮子basketball篮球bat蝙蝠bath浴缸bathe沐浴bathroom浴室battery电池battle战役bay海湾be是,在,做beach海滩beam梁,横梁bean豆,蚕豆bear熊beard胡须beast野兽beat敲打,打beautiful美丽的beauty美丽because因为since自从,因为because of由于become变成,成为bed床bee蜜蜂beef牛肉beer啤酒before在前,以前beg请求beggar乞讨begin开始to begin with首先、本来beginning开始behave举止behavior举止behind在...之后being存在belief信任believe相信believe in相信bell钟,铃belong属于belong to属于below在...下面belt带子bench长凳bend弯曲beneath在下边benefit利益beside在...旁边besides而且best最好的at best最多get the best of胜过make the best of充分利用bet打赌better较好的for the better好转get the better of打败had better最好还是between在...之间beyond到那边Bible圣经bicycle脚踏车big大的bill账单billion十亿bind捆绑biology生物学bird鸟birth出生birthday生日biscuit饼干bit一点bite咬bitter痛苦的black黑色blackboard黑板blame指责blank空白的blanket毯子blind瞎的block木块blood血blow打,一击blue蓝色board木板on board在船boat小船body身体boil煮沸bold大胆的bomb炸弹bond结合bone骨头book书boot靴子border边界bore令人讨厌的人born天生的borrow借boss老板both两者both ...and既...又bother烦扰bottle瓶子bottom底部boundary边界bow弓、鞠躬bowl碗box盒子boy男孩brain脑,头脑branch树枝brand商标brave勇敢的bread面包break休息,打破break down损坏break off断绝break out逃出break up终止、打碎breakfast早餐breath呼吸breathe呼吸brick砖bridge桥、桥梁brief简短的in brief简单地说bright明亮的brilliant灿烂的bring拿来bring about带来bring down打到bring forth产生bring forward提出bring up教育The second set0age年龄agency代理adequate足够的acceptable可接受的access通道、穿过accident事故、意外遭遇children孩子们normally通常、平常lot一群anxiety焦虑difference差别feelings感受trouble麻烦their他们couples夫妻had有extend扩大worthwhile值得的cheerful快活的rid使摆脱those那些revolution革命pizza比萨饼ink墨水final最后的dangerous危险的next下一个forth向前late晚的online在线的bet打赌spacious宽敞的respective分别better更好的rob抢劫telescope望远镜characteristic特征policeman警察ocean海洋jewel珠宝melt消失task任务salt盐childhood童年original最初的food食物skate溜冰total总数喜欢的句子great things happen when you setp out of your comfort zone. 当你走出舒适区,伟大的事情就会发生 I like you,but just like you. 我喜欢你,仅仅如此,喜欢而已。「纵然万劫不复,纵然相思入骨,我也待你眉眼如初,岁月如故。」 Effort will not be seen, but lazy will be. 努力不会被看到,但偷懒一定会。 All you need in this life is ignorance and confidence and then success is sure. 你这一生所需要的只是无知和自信,那么成功就一定会实现 experience is simaply the name we give our mistakes. 经验只是我们给自己的错误取的名字。 I really don't believe in magic. 我真的不相信魔法。 Every day is beautiful if you choose to see it. 如果你愿意去发现,其实每一天都很美 Don't give up just because of what people said. Use that as your motivation to push harder. 别因为别人说的话而放弃,把那些话当做加倍努力的动力 I lose, I lose, but I never give up. 我输过,我败过,但我从未放弃过 I am the luckiest person in the world. 我是世界上最幸运的人 Someone to love, something to do, and something to hope for. 有爱的人,有喜欢的事业,有梦想 anything that adds laughter and joy to your life. 不要延迟任何可以给你的生活带来欢笑与快乐的事情 The best way out is always through. 一路走到底,你就会发现那个最佳出口 Life is like a cup of tea. It won't be bitter for a lifetime but for a short while anyway. 人生就像一杯茶,不会苦一辈子,但总会苦一阵子 You must learn a new way to think before you can master a new way to be. 在掌握新方法之前,你必须要先换一种思考方法 I love you for my life past. 我爱你,爱了整整一个曾经 Change your thoughts and you change your world. 改变你的思想,你就能改变自己的命运 The best hearts are always the bravest. 心灵最高尚的人也总是最勇敢的人 As long as there s tomorrow, today s always the startng lne. 只要还有明天,今天就是起跑线 May we all have the power to love ourselves and others. 愿我们,都有能力爱自己,有余力爱别人 Like a child, always believe in hope, I believe the dream. 像孩子一样,永远相信希望,相信梦想 People are not just to love and live. 人不是仅仅为了爱而生存的 Sometimes you have to be your own hero. 有时候必须做自己的英雄 With the wonder of your love, the sun above always shines. 拥有你美丽的爱情,太阳就永远明媚 Nothing in the world is difficult if you put your heart into it. 世上无难事,只怕有心人 It is by acts and not by ideas that people live. 行动是根本,想法锦上添花 Time always save the best for last. 时间总把最好的人留到最后 success is a batt;e between you and youself only. 成功是一场和自己的比赛 Be happy. No worries, just smile. 开心点,别担心,微笑就好 The greatest test of courage on earth is to bear defeat without losing heart. 世界上对勇气的最大考验是忍受失败而不丧失信心 Work hard in silence, let success make the noise. 在沉默中努力,让成功自己发声 love understands love; it needs no talk. 相爱的心息息相通,无需用言语倾诉 I am ordinary yet unique. 我很平凡,但我独一无二 If we dream, everything is possible. 敢于梦想,一切都将成为可能 May you live like a child forever. 愿你永远活的像个孩子 Don’t worry about what others are doing better than you. Concentrate on beating your own records every day. 不要担心别人会做得比你好。你只需要每天都做得比前一天好就可以了 Don't look back, you're not going that way. 别回头,你要走的不是那条路 The wise man is always a good listener. 智慧比财富更宝贵 Time such as water, always silent. If you are well, it is sunny. 时光如水,总是无言。若你安好,便是晴天 Nothing is more terrible than ignorance in action. 最可怕的事莫过于无知而行动 No matter how you feel, get up, dress up and fight for your dreams. 无论你现在感觉如何,请起床、穿好衣服然后为你的梦想而奋斗 Live every day as the last day of life. 把活着的每一天看作生命的最后一天 If you never chase your dream, you will never catch them. 若不去追逐梦想,你将永远无法抓住梦想 Sometimes a winner is just a dreamer that never gives up. 有时候,成功者只是坚持梦想不放弃的人 If you get tired, learn to rest, not to quit. 如果你累了,学会休息,而不是放弃 When your faith is stronger than your fears, you can make your dreams happen. 当你的信念强于你的胆怯时,你就可以将梦想变为现实了 You have to work very hard to seem effortless. 你必须十分努力,才能看上去毫不费劲
2022年08月01日
784 阅读
0 评论
40 点赞
2022-07-23
【技术分享】Python3 屏幕单目标跟踪 opencv + dlib实现 ( 第六课 )
简介dlib提供了dlib.correlation_tracker()类用于跟踪目标,于是自己修改了下直接在屏幕上绘制识别物体,效果一般有时识别会出错。完整代码import cv2 import numpy as np import dlib, mss, os window_name = 'Testone' window_size = 2 sct = mss.mss() screen_width = 1920 screen_height = 1080 # win_left , win_top, win_width, win_height = screen_width // 3, screen_height // 3, screen_width // 3, screen_height // 3 rwidth, rheight = screen_width // window_size, screen_height // window_size monitor = { 'left': 0, 'top': 0, 'width': 1920, 'height': 1080, } tracker = dlib.correlation_tracker() start_flag = True selection = None track_window = None drag_start = None def onMouseClicked(event, x, y, flags, param): global selection, track_window, drag_start if event == cv2.EVENT_LBUTTONDOWN: drag_start = (x, y) track_window = None if drag_start: xMin = min(x, drag_start[0]) yMin = min(y, drag_start[1]) xMax = max(x, drag_start[0]) yMax = max(y, drag_start[1]) selection = (xMin, yMin, xMax, yMax) if event == cv2.EVENT_LBUTTONUP: drag_start = None track_window = selection selection = None cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) cv2.resizeWindow(window_name, rwidth, rheight) cv2.setMouseCallback(window_name, onMouseClicked) while True: try: img = sct.grab(monitor=monitor) img = np.array(img) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if start_flag == True: while True: img_first = img.copy() if track_window: cv2.rectangle(img_first, (track_window[0], track_window[1]), (track_window[2], track_window[3]), (255,255,255), 2) elif selection: cv2.rectangle(img_first, (selection[0], selection[1]), (selection[2], selection[3]), (255,255,255), 2) cv2.imshow(window_name, img_first) if cv2.waitKey(5) == 13: break start_flag = False tracker.start_track(gray, dlib.rectangle(track_window[0], track_window[1], track_window[2], track_window[3])) else: tracker.update(gray) box_predict = tracker.get_position() cv2.rectangle(img,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),2) cv2.imshow(window_name, img) if cv2.waitKey(10) == 27: break except Exception as e: print(e) os._exit(0) cv2.destroyAllWindows()视频效果{dplayer src="https://www.52tt.pro/usr/uploads/2022/11/11.13.mp4"/}
2022年07月23日
62 阅读
0 评论
4 点赞
2022-07-22
【技术分享】Python3 模型训练与预测 opencv + dlib实现 ( 第五课 )
训练代码import dlib import cv2 as cv def Train(): options = dlib.simple_object_detector_training_options() options.add_left_right_image_flips = True options.C = 5 options.num_threads = 2 options.be_verbose = True dlib.train_simple_object_detector('data.xml', 'data.svm', options) def deteTest(): imgpath = '1.png' image = cv.imread(imgpath) gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) detector = dlib.simple_object_detector("data.svm") dets = detector(gray) for (k, d) in enumerate(dets): cv.rectangle(image, (d.left(), d.top()), (d.left() + d.width(), d.top() + d.height()), (0, 255, 0), 1) cv.imshow("Output", image) cv.waitKey(0) if __name__ == '__main__': while True: print(''' | 1.训练模型 | 2.查看效果 | '''.strip()) var = int(input(">>")) if var == 1: Train() if var == 2: deteTest()检测代码import cv2 as cv import numpy as np import dlib, mss, os window_name = 'Test' window_size = 2 sct = mss.mss() monitor = { 'left': 0, 'top': 0, 'width': 1920, 'height': 1080, } num_res_width = 1920 // 2 num_res_height = 1080 // 2 while True: try: # hwnds = win32gui.FindWindow('Chrome_WidgetWin_1', None) # left, top, right, bottom = win32gui.GetWindowRect(hwnds) img = sct.grab(monitor=monitor) img = np.array(img) gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) cv.namedWindow(window_name, cv.WINDOW_NORMAL) cv.resizeWindow(window_name, num_res_width, num_res_height) detector = dlib.get_frontal_face_detector() dets = detector(gray) for _, d in enumerate(dets): cv.rectangle(img, (d.left(), d.top()), (d.left() + d.width(), d.top() + d.height()), (0, 0, 255), 2) cv.putText(img, "1", (d.left() + d.width(), d.top() + d.height()), cv.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 0), 2) cv.imshow(window_name, img) k = cv.waitKey(1) if k % 256 == 27: cv.destroyAllWindows() exit('已退出...') except Exception as e: print(e) os._exit(0)视频教程{bilibili bvid="BV16T4y1r7Jj" page=""/}{cloud title="训练工具" type="default" url="https://wws.lanzouj.com/iEbAK07u66oj" password=""/}
2022年07月22日
411 阅读
0 评论
125 点赞
2022-07-22
【技术分享】Python3 调用易语言DLL
简介编程只是为了解决我们的一些问题而存在的,没有必要区分太细,哪个方便就用哪个吧,易语言从初中就陪伴着我,用习惯了它很方便也可以开发dll,顺便做个笔记以防忘记,使用Python调用易语言dll遇到的坑。易语言dll1.这里写了几个导出函数,分别是 TS、TS2、TS3,都不同有无参的函数,有传参的函数,还有传参返回的函数,这里注意易语言生成的dll是32位的必须要由32位Python才可以调用,64位会直接报错的。Python3调用import ctypes # 导入C类型模块 dll = ctypes.CDLL(r"E:\桌面\ed.dll") # 导入动态链接库 dll.TS() # 调用无参函数 dll.TS2("测试1".encode("gbk")) # 传参需要编码成 gbk text = dll.TS3("测试2".encode("gbk")) print(ctypes.string_at(text).decode("gbk")) # 通过string_at转换成字符 再解码为gbk效果
2022年07月22日
50 阅读
0 评论
4 点赞
2022-07-22
【技术分享】Python3 比对人脸 opencv + dlib实现 ( 第四课 )
简介在前面的几课中介绍了,如何使用dlib标定人脸 人脸检测 提取68个特征点。这次要在这两个工作的基础之上,将人脸的信息提取成一个128维的向量空间。在这个向量空间上,同一个人脸的更接近,不同人脸的距离更远。度量采用欧式距离,欧氏距离计算不算复杂。二维公式三维公式将其扩展到128维的情况下通常使用的判别阈值是0.6,即如果两个人脸的向量空间的欧式距离超过了0.6,即认定不是同一个人;如果欧氏距离小于0.6,则认为是同一个人。{cloud title="模型下载" type="bd" url="https://www.123684.com/s/Ke1Jjv-31go3" password=""/}完整代码import cv2 import dlib import numpy as np def main(): img1 = cv2.imread("1.jpeg") img2 = cv2.imread("2.jpeg") test = cv2.imread("test.jpeg") # BGR to RGB img1 = img1[:, :, ::-1] img2 = img2[:, :, ::-1] test = test[:, :, ::-1] detector = load_face_detector() predictor = load_key_detector() encoder = load_face_coding_feature_model() img1_128D = encoder_face(img1,detector,predictor,encoder)[0] img2_128D = encoder_face(img2,detector,predictor,encoder)[0] test_128D = encoder_face(test,detector,predictor,encoder)[0] all_image_128D = [img1_128D, img2_128D] distance =compare_faces(all_image_128D,test_128D) print(distance) # 加载人脸检测器 def load_face_detector(): return dlib.get_frontal_face_detector() # 加载关键点模型 def load_key_detector(): return dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 加载人脸编码特征模型 def load_face_coding_feature_model(): return dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat") # 关键点编码为128D def encoder_face(image,detector,predictor,encoder,upsample=1,jet=1): # 检测人脸(检测到几张人脸) faces = detector(image,upsample) # 对检测的人脸进行关键点检测 faces_key_points = [predictor(image,face) for face in faces] # 对每张检测点进行128D return [np.array(encoder.compute_face_descriptor(image,faces_key_point,jet)) for faces_key_point in faces_key_points] # 人脸比较,通过欧式距离 def compare_faces(face_encoding, test_encoding): return list(np.linalg.norm(np.array(face_encoding) - np.array(test_encoding), axis=1)) if __name__ == '__main__': main() {lamp/}
2022年07月22日
263 阅读
2 评论
68 点赞
2022-07-22
【技术分享】Python3 单目标跟踪 opencv + dlib实现 ( 第三课 )
简介dlib提供了dlib.correlation_tracker()类用于跟踪目标,效果一般般,没训练的模型好。官方文档入口:http://dlib.net/python/index.html#dlib.correlation_tracker完整源码(直接绘制完成后按下enter键即可跟踪)import sys import dlib import cv2 tracker = dlib.correlation_tracker() # 导入correlation_tracker()类 cap = cv2.VideoCapture(0) # OpenCV打开摄像头 start_flag = True # 标记,是否是第一帧,若在第一帧需要先初始化 selection = None # 实时跟踪鼠标的跟踪区域 track_window = None # 要检测的物体所在区域 drag_start = None # 标记,是否开始拖动鼠标 # 鼠标点击事件回调函数 def onMouseClicked(event, x, y, flags, param): global selection, track_window, drag_start # 定义全局变量 if event == cv2.EVENT_LBUTTONDOWN: # 鼠标左键按下 drag_start = (x, y) track_window = None if drag_start: # 是否开始拖动鼠标,记录鼠标位置 xMin = min(x, drag_start[0]) yMin = min(y, drag_start[1]) xMax = max(x, drag_start[0]) yMax = max(y, drag_start[1]) selection = (xMin, yMin, xMax, yMax) if event == cv2.EVENT_LBUTTONUP: # 鼠标左键松开 drag_start = None track_window = selection selection = None cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE) cv2.setMouseCallback("image", onMouseClicked) # opencv的bgr格式图片转换成rgb格式 # b, g, r = cv2.split(frame) # frame2 = cv2.merge([r, g, b]) while True: ret, frame = cap.read() # 从摄像头读入1帧 if start_flag == True: # 如果是第一帧,需要先初始化 # 这里是初始化,窗口中会停在当前帧,用鼠标拖拽一个框来指定区域,随后会跟踪这个目标;我们需要先找到目标才能跟踪不是吗? while True: img_first = frame.copy() # 不改变原来的帧,拷贝一个新的出来 if track_window: # 跟踪目标的窗口画出来了,就实时标出来 cv2.rectangle(img_first, (track_window[0], track_window[1]), (track_window[2], track_window[3]), (0,0,255), 1) elif selection: # 跟踪目标的窗口随鼠标拖动实时显示 cv2.rectangle(img_first, (selection[0], selection[1]), (selection[2], selection[3]), (0,0,255), 1) cv2.imshow("image", img_first) # 按下回车,退出循环 if cv2.waitKey(5) == 13: break start_flag = False # 初始化完毕,不再是第一帧了 tracker.start_track(frame, dlib.rectangle(track_window[0], track_window[1], track_window[2], track_window[3])) # 跟踪目标,目标就是选定目标窗口中的 else: tracker.update(frame) # 更新,实时跟踪 box_predict = tracker.get_position() # 得到目标的位置 cv2.rectangle(frame,(int(box_predict.left()),int(box_predict.top())),(int(box_predict.right()),int(box_predict.bottom())),(0,255,255),1) # 用矩形框标注出来 cv2.imshow("image", frame) # 如果按下ESC键,就退出 if cv2.waitKey(10) == 27: break cap.release() cv2.destroyAllWindows() 视频效果隐藏内容,请前往内页查看详情官方示例# The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt # # This example shows how to use the correlation_tracker from the dlib Python # library. This object lets you track the position of an object as it moves # from frame to frame in a video sequence. To use it, you give the # correlation_tracker the bounding box of the object you want to track in the # current video frame. Then it will identify the location of the object in # subsequent frames. # # In this particular example, we are going to run on the # video sequence that comes with dlib, which can be found in the # examples/video_frames folder. This video shows a juice box sitting on a table # and someone is waving the camera around. The task is to track the position of # the juice box as the camera moves around. # # # COMPILING/INSTALLING THE DLIB PYTHON INTERFACE # You can install dlib using the command: # pip install dlib # # Alternatively, if you want to compile dlib yourself then go into the dlib # root folder and run: # python setup.py install # or # python setup.py install --yes USE_AVX_INSTRUCTIONS # if you have a CPU that supports AVX instructions, since this makes some # things run faster. # # Compiling dlib should work on any operating system so long as you have # CMake and boost-python installed. On Ubuntu, this can be done easily by # running the command: # sudo apt-get install libboost-python-dev cmake # # Also note that this example requires scikit-image which can be installed # via the command: # pip install scikit-image # Or downloaded from http://scikit-image.org/download.html. import os import glob import dlib from skimage import io # Path to the video frames video_folder = os.path.join("..", "examples", "video_frames") # Create the correlation tracker - the object needs to be initialized # before it can be used tracker = dlib.correlation_tracker() win = dlib.image_window() # We will track the frames as we load them off of disk for k, f in enumerate(sorted(glob.glob(os.path.join(video_folder, "*.jpg")))): print("Processing Frame {}".format(k)) img = io.imread(f) # We need to initialize the tracker on the first frame if k == 0: # Start a track on the juice box. If you look at the first frame you # will see that the juice box is contained within the bounding # box (74, 67, 112, 153). tracker.start_track(img, dlib.rectangle(74, 67, 112, 153)) else: # Else we just attempt to track from the previous frame tracker.update(img) win.clear_overlay() win.set_image(img) win.add_overlay(tracker.get_position()) dlib.hit_enter_to_continue(){dotted startColor="#ff6c6c" endColor="#1989fa"/}
2022年07月22日
123 阅读
0 评论
50 点赞
2022-07-21
【技术分享】Python3 人脸特征点标定 opencv + dlib实现 ( 第二课 )
简介在我们检测到人脸区域之后,接下来要研究的问题是获取到不同的脸部的特征,以区分不同人脸,即人脸特征检测(facial feature detection)。它也被称为人脸特征点检测(facial landmark detection)。人脸特征点通常会标识出脸部的下列数个区域:右眼眉毛(Right eyebrow)左眼眉毛(Left eyebrow)右眼(Right eye)左眼(Left eye)嘴巴(Mouth)鼻子(Nose)下巴(Jaw)dlib提供了训练好的模型,可以识别人脸的68个特征点{cloud title="68特征数据" type="bd" url="https://www.123684.com/s/Ke1Jjv-h1go3" password=""/} import dlib import cv2 # 使用 Dlib 的正面人脸检测器 frontal_face_detector detector = dlib.get_frontal_face_detector() # Dlib 的 68点模型 predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 读取图片 img = cv2.imread("2.jpeg") # 生成 Dlib 的图像窗口 win = dlib.image_window() win.set_image(img) # 使用 detector 检测器来检测图像中的人脸 faces = detector(img, 1) print("人脸数:", len(faces)) for i, d in enumerate(faces): print("第", i+1, "个人脸的矩形框坐标:", "left:", d.left(), "right:", d.right(), "top:", d.top(), "bottom:", d.bottom()) # 使用predictor来计算面部轮廓 shape = predictor(img, faces[i]) # 绘制面部轮廓 win.add_overlay(shape) # 绘制矩阵轮廓 win.add_overlay(faces) dlib.hit_enter_to_continue()完整示例:import cv2 import dlib # 读取图片 img_path = "1.jpeg" img = cv2.imread(img_path) # 转换为灰阶图片 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 正向人脸检测器 detector = dlib.get_frontal_face_detector() # 使用训练完成的68个特征点模型 predictor_path = "shape_predictor_68_face_landmarks.dat" predictor = dlib.shape_predictor(predictor_path) # 使用检测器来检测图像中的人脸 faces = detector(gray, 1) for i, face in enumerate(faces): # 获取人脸特征点 shape = predictor(img, face) # 遍历所有点 for pt in shape.parts(): # 绘制特征点 pt_pos = (pt.x, pt.y) cv2.circle(img, pt_pos, 1, (255,0, 0), 2) cv2.imshow('opencv_face_laowang',img) # 显示图片 cv2.waitKey(0) # 等待用户关闭图片窗口 cv2.destroyAllWindows()# 关闭窗口{lamp/}
2022年07月21日
85 阅读
0 评论
20 点赞
2022-07-21
【数学笔记】高等数学 函数、极限、连续
简介高数里,函数、极限、连续这三个是基础中的基础,三者是连在一起的:先懂函数,才能学极限,搞懂极限了,才能理解连续。这三个搞不明白,后面的导数、积分根本学不进去。而且我发现,用咱们写代码的思路去理解这些抽象概念,会简单很多!下面我就结合Python代码,把这三个知识点捋清楚,记下来方便自己后续复习,也尽量写得直白,别搞那些花里胡哨的书面话。函数函数类似编程中的函数比如:def f(x): # x 是自变量 :代表它可以发生变化,比如 x = 5,定义域就是x的取值范围,还要排除算不了的数 res = x**2 + 1 # 通过函数的对应法则,x=5时输出的因变量等于 26,就是5²+1的结果 return res f(3) # 因变量输出:10,和数学里算的f(3)=10一模一样,这就是“一个输入对应一个输出”在 $f(x)$ 中的 $x$ 值是自变量,x取值范围就叫做定义域,试想当 $x$ 发生变化比如取任何一个数 $5$,那么通过函数的对应法则 $x ^ 2 + 1$ 进行公式运算后得出 因变量 结果为:$26$。这里要注意,定义域不是随便取的,比如分式分母不能为0、平方根里不能是负数,不然就像编程报错一样,数学里叫“无定义”,x不能取这种数。而且一个x只能对应一个因变量,不能一个x算出两个结果,这是函数的基本规矩,记死就行。为了加深印象,我再补一个代码例子,重点看定义域和函数的确定性:def g(x): # 这个函数是1/x,分式函数,定义域是x≠0,不然报除零错误,数学里无定义 return 1/x # 测试定义域内的数 print(g(2)) # 输出0.5,一个输入对应一个输出,没问题 # 测试定义域外的数x=0 try: g(0) except ZeroDivisionError: print("x=0不在g(x)的定义域内,算不了") # 报错,对应数学里的“无定义”另外,因变量的取值范围叫值域,比如f(x)=x²+1,不管x取啥实数,结果都≥1,值域就是[1, +∞),用代码随便测几个x就能验证:# 验证f(x)=x²+1的值域 test_x = [-3, -2, 0, 1, 4, 10] for x in test_x: print(f"f({x}) = {x**2 + 1}") # 输出依次为10、5、1、2、17、101,都≥1总的来说,函数没什么难的,核心就是“一个输入对应一个输出”,用编程的思路理解,就是“一个参数,一段计算代码,一个返回值”。定义域和值域就是x和f(x)的取值范围,记牢定义域要排除无意义的数,后面学极限、连续都会用到。极限极限描述的是当自变量趋近某个值时,函数的值趋近于什么def f(x): return (x**2 - 1) / (x - 1) # x=1时分母为0,编程报错,数学里无定义,但极限能解决这个问题计算 $\lim_{x \to 1} f(x) = L$,直接代入x=1会导致除零错误,但从极限的角度,可以简化并发现 $x$ 接近 1 时,函数值趋近于 2。这就是函数在 $x=1$ 处的极限。具体来说,把分子因式分解成(x-1)(x+1),因为x是靠近1不是等于1,x-1不等于0,约掉后就是x+1,x靠近1时,x+1就靠近2。我用代码模拟x从1的左右两边慢慢靠近,能更直观看到趋势:def f(x): return (x**2 - 1) / (x - 1) # 从左边靠近1,delta越小,x越接近1 print("从左边趋近x=1:") for delta in [0.1, 0.01, 0.001, 0.0001, 0.00001]: x = 1 - delta val = f(x) print(f"x={x},f(x)={val}") # 输出:x越靠近1,f(x)越靠近2(比如x=0.9→1.9,x=0.99→1.99) # 从右边靠近1 print("\n从右边趋近x=1:") for delta in [0.1, 0.01, 0.001, 0.0001, 0.00001]: x = 1 + delta val = f(x) print(f"x={x},f(x)={val}") # 输出:x越靠近1,f(x)越靠近2(比如x=1.1→2.1,x=1.01→2.01)这里补充个知识点:x从左边靠近的极限叫左极限,右边的叫右极限,只有左右极限都存在且相等,这个点的极限才存在(这里都是2,所以极限就是2)。极限不关心x等于某个值的情况,只看趋势,这是它的核心作用,能解决函数无定义但能看趋势的问题。另外极限还有几个好理解的性质:一是唯一的,一个点的极限只有一个值;二是局部有界,极限存在的话,x附近的f(x)不会无限大/小;三是保号,极限是正数,x附近的f(x)也都是正数。总的来说,极限就是个“看趋势”的工具,搞懂x“靠近”和“等于”的区别,极限就没什么难的了,也是后面学连续的基础。连续函数的连续性表示函数在某一点没有间断。如果函数在某个点的极限值等于该点的函数值,则该函数在此点是连续的def f(x): if x == 2: return 6 # 故意设成6,和极限值5不一样,体现不连续 return x**2 + 1虽然函数在 $x=2$ 处有定义,但由于函数值与极限值不相等,函数在 $x=2$ 处是不连续的。这里要记牢连续的三个条件,少一个都不行:①函数在该点有定义;②极限存在(左右极限都有且相等);③极限值=函数值。先验证x=2处的极限和函数值:# 验证x=2处的极限(趋近2的函数值) print("x趋近于2时,函数值的变化:") for delta in [0.1, 0.01, 0.001, 0.0001]: x1 = 2 - delta # 从左边靠近2 x2 = 2 + delta # 从右边靠近2 print(f"x={x1}时,f(x)={f(x1)};x={x2}时,f(x)={f(x2)}") # 输出:x越靠近2,f(x)越靠近5(极限值是5) # 验证x=2处的函数值 print(f"\nx=2时,f(x)={f(2)}") # 输出6,和极限值5不相等x=2处满足①有定义(f(2)=6)、②极限存在(是5),但③极限值≠函数值,所以不连续,这个点叫“可去间断点”——把x=2的函数值改成5,就连续了:def continuous_f(x): if x == 2: return 5 # 改成和极限值一样的5 return x**2 + 1 # 验证连续性 print(f"x=2处函数值:{continuous_f(2)}") # 5,满足① print("x趋近于2时的函数值:") for delta in [0.1, 0.01, 0.001]: x1 = 2 - delta x2 = 2 + delta print(f"x={x1}→{continuous_f(x1)};x={x2}→{continuous_f(x2)}") # 都趋近5,满足② print(f"极限值={2**2 + 1},函数值={continuous_f(2)}") # 都是5,满足③,连续了除了可去间断点,还有两种常见的间断点,记下来方便复习:1. 跳跃间断点(左右极限都存在但不相等)def jump_f(x): if x < 2: return x + 1 # 左极限=3 else: return x - 1 # 右极限=1 # 验证左右极限 print("x从左边趋近2:") for delta in [0.1, 0.01, 0.001]: x = 2 - delta print(f"x={x},f(x)={jump_f(x)}") # 趋近3 print("\nx从右边趋近2:") for delta in [0.1, 0.01, 0.001]: x = 2 + delta print(f"x={x},f(x)={jump_f(x)}") # 趋近1 # 左≠右,极限不存在,不连续2. 无穷间断点(x靠近时f(x)无限大/小)def infinite_f(x): return 1 / (x - 2) # x=2无定义,x靠近2时f(x)无限大/小 # 验证 print("x从左边趋近2:") for delta in [0.1, 0.01, 0.001]: x = 2 - delta print(f"x={x},f(x)={infinite_f(x)}") # 趋近-∞ print("\nx从右边趋近2:") for delta in [0.1, 0.01, 0.001]: x = 2 + delta print(f"x={x},f(x)={infinite_f(x)}") # 趋近+∞ # 极限是无穷大,不存在,不连续最后补个小性质:连续函数的和/差/积/商(分母≠0)、复合函数还是连续的;闭区间上的连续函数一定有最大值和最小值,结合例子很好理解。总的来说,连续的核心就是“极限值=函数值”,搞懂了极限,连续就很简单,而且连续也是后面学导数、积分的基础,大部分能求导、能积分的函数都是连续的。用编程例子理解这些抽象概念最实用,把公式转化成熟悉的代码,一下子就不懵了。记这个笔记就是为了后续复习,把零散知识点串起来,搞懂本质不硬背,后面可以再补复杂例子巩固。总结函数是核心,和编程函数逻辑一致,核心是“一个输入对应一个输出”,记牢定义域、对应法则、因变量三个核心;极限是看趋势的工具,重点在“趋近”而非“等于”,解决了函数无定义但能判断趋势的问题;连续是函数的性质,核心是“极限值=函数值”,需满足有定义、极限存在、极限值=函数值三个条件,还要分清可去、跳跃、无穷三种常见间断点。
2022年07月21日
117 阅读
0 评论
10 点赞
2022-07-20
【技术分享】Python3 透视自瞄外挂制作
简介Memory64内存模块是自己无聊的时候封装的,它可以轻松的操作进程中的内存,做一些游戏辅助还是可以的,模块源码已上传Github上,现在的版本是1.0.3后续会继续更新的。Github 项目安装教程pip install Memory641.通过Python自带的pip工具就可以安装模块,模块只支持32位Python,64位Python并不兼容。使用步骤python -c "import Memory64; print(Memory64.version)"1.安装好后,在终端输入这行命令,查看下模块版本,正常显示没有报错就证明安装成功了。取64位模块地址from Memory64.Bin32 import * hwnd = Openhwnd("Calculator.exe") # 打开进程句柄 pid = GetProcPid("Calculator.exe") # 获取进程PID mod1 = GetModuleAddr64(hwnd, "shlwapi.dll") # 通过进程句柄获取64位程序模块基址 mod2 = GetModule2(pid, "shlwapi.dll") # 通过进程PID获取64位程序模块基址 print(pid, hwnd, mod1, mod2) # 输出进程PID, 进程句柄, 输出模块基址2.这里我用64位程序计算器,做一个演示看看能不能读到内存地址,很显然是没问题的。读64位进程内存from Memory64.Bin32 import * hwnd = Openhwnd("Calculator.exe") # 打开名为"Calculator.exe"的程序句柄 mod1 = GetModuleAddr64(hwnd, "shlwapi.dll") # 通过进程句柄获取模块基址"shlwapi.dll" print(ReadMemory64Int(hwnd, mod1)) # 读取指定模块基址的64位内存整数3.通过模块读下地址数值,也是没有问题的,后面就不演示了,直接放代码。写64位进程内存from Memory64.Bin32 import * hwnd = Openhwnd("Calculator.exe") # 打开名为"Calculator.exe"的程序句柄 mod1 = GetModuleAddr64(hwnd, "shlwapi.dll") # 获取模块"shlwapi.dll"的基址 addr = ReadMemory64Int(hwnd, 0x7FF8E64CEC48) # 从指定地址读取64位内存整数 addr2 = ReadMemory64Int(hwnd, mod1 + 0x4EC48) # 使用模块基址加上偏移读取64位内存整数 print(addr, addr2) # 输出两个读取的内存地址值 WriteMemory64Int(hwnd, mod1 + 0x4EC48, 10) # 在模块基址加上偏移地址写入整数值10 WriteMemory64Float(hwnd, mod1 + 0x4EC48, 5.261) # 写入小数值5.261 WriteMemory64Int(hwnd, mod1 + 0x4EC48, 10) # 在同一地址写入整数值10 bytesa = "11 33 30 32 32 33 35 40 40 58" # 定义一个字节集数据 WriteMemory64Bytes(hwnd, 0x7FF77E2BE72E, bytesa, 10) # 写入指定地址的字节集数据绘制透明方框from Memory64 import FindWindowPid # 导入内存访问模块 import Memory64.D3Gui # 导入图形绘制模块 hwnd = FindWindowPid(None, "xxx")[0] # 通过窗口名称查找窗口句柄 draw = Memory64.D3Gui.ExecDraw(hwnd) # 初始化图形绘制模块 while True: draw.startLoop() # 开始绘制段 draw.drawRect(100, 100, 100, 100, 5, (255, 254, 0)) # 绘制矩形,参数依次是起始 x 坐标, 起始 y 坐标, 宽度, 高度, 边框宽度, 颜色 (R, G, B) draw.endLoop() # 结束绘制段如何打包最好用这种形式打包:打包方式外挂类型分类AI外挂基于目标检测模型,如 YOLOv5。通过训练目标检测模型,对游戏画面进行分析,检测敌人并自动移动射击。其原理简单,主要依赖于图像处理与深度学习模型,效果一般,适用于辅助操作,但不涉及游戏内修改。内存外挂使用工具如 Cheat Engine(CE)或 Ollydbg(OD)进行内存操作。强大的内存修改能力,可以直接更改游戏数据,但容易被反作弊系统检测。需要掌握游戏内存结构以及通过端口拦截或hook技术来规避检测。封包外挂使用工具如 WPE来抓包并修改数据包。能够欺骗服务器,通过修改包内容实现功能,例如刷枪、强登账号等。数据包(TCP/UDP)可能部分加密,通过技术如异或解密来获取未加密数据部分。脚本外挂模拟玩家的鼠标、键盘操作,通过脚本自动化完成任务。比较简单,适合用来执行重复性操作,但效果有限,仅能辅助功能性增强。代码实现原理Python3 实现:代码结构基于图像处理、内存修改或网络抓包技术。Python可以通过封装库、调用Windows API 或使用现成工具库来实现外挂功能。例如,可以使用 Memory64 库或直接调用内存操作来实现内存外挂。工具推荐:Cheat Engine (CE):内存操作与调试工具。Ollydbg (OD):二进制文件调试工具,适用于反汇编和内存调试。WPE:抓包工具,用于数据包编辑与欺骗服务器。实现说明:所有外挂技术基础都是基于对游戏系统的分析和利用系统漏洞进行功能扩展。所有方法都涉及一定程度的反向工程与安全风险,因此需要谨慎使用。注意事项:所有外挂功能都需要在合法范围内使用,否则可能面临法律后果或账户封禁。游戏外挂涉及风险,因此建议仅用于学习和研究,切勿用于商业或非法用途。自瞄代码from Memory64 import * # 导入自定义的内存访问模块 from math import * # 获取游戏窗口句柄和进程ID hwnd, thre, pid = FindWindowPid("Valve001", None) # 取游戏窗口句柄 func = SetupProce(pid) # 设置进程 Modlue_m = func.GetBaseAddr("cstrike.exe") # 获取模块基址 Modlue_e = func.GetBaseAddr("engine_amxx.dll") # 读取特定内存地址的玩家坐标 Pom = func.ReadMemory(Modlue_m + 0x1033240) # 计算二维坐标之间的距离 def Get_Distance(x1, y2, ex, ey): return sqrt((x1 - ex)**2 + (y2 - ey)**2) / 20 # 启动自瞄功能 def Start_AiMBot(): my_x = func.ReadMemory_float(Pom + 0x88) # 读取玩家 x 坐标 my_y = func.ReadMemory_float(Pom + 0x8C) my_z = func.ReadMemory_float(Pom + 0x90) Enemy_data = [] # 存储敌人数据 Number = 133988 # 初始读取偏移地址 # 遍历敌人的坐标 for _ in range(0, 10): Number += 4 Poe = func.ReadMemory(Modlue_e + Number) # 读取敌人坐标 enemy_x = func.ReadMemory_float(Poe + 0x88) enemy_y = func.ReadMemory_float(Poe + 0x8C) enemy_z = func.ReadMemory_float(Poe + 0x90) enemy_hp = func.ReadMemory_float(Poe + 0x1E0) differ_x = enemy_x - my_x differ_y = enemy_y - my_y _distan = sqrt(differ_x**2 + differ_y**2) differ = Get_Distance(my_x, my_y, enemy_x, enemy_y) AiMBot_y = atan((my_z - enemy_z) / _distan) / pi * 180 # 计算角度 if differ_x > 0 and differ_y > 0: AiMBot_x = atan(differ_y / differ_x) / pi * 180 # 计算第一象限 if differ_x < 0 and differ_y > 0: AiMBot_x = atan(differ_y / differ_x) / pi * 180 + 180 # 计算第二象限 if differ_x < 0 and differ_y < 0: AiMBot_x = atan(differ_y / differ_x) / pi * 180 + 180 # 计算第三象限 if differ_x > 0 and differ_y < 0: AiMBot_x = atan(differ_y / differ_x) / pi * 180 # 计算第四象限 Enemy_data.append([differ, enemy_hp, AiMBot_x, AiMBot_y]) Enemy_data.sort() if Enemy_data[0][1] < 1: del Enemy_data[0] # 删除血量小于1的敌人数据 try: func.WriteMemory_float(Modlue_m + 0x19E10C4, Enemy_data[0][3] + 1) # 设置准星 y 轴位置 func.WriteMemory_float(Modlue_m + 0x19E10C8, Enemy_data[0][2]) # 设置准星 x 轴位置 except Exception: pass # 程序主逻辑 if __name__ == '__main__': try: while True: if MonitorHotkeys(0x20) != 0: # 按空格键开启自瞄 Start_AiMBot() except KeyboardInterrupt: exit()自瞄讲解{dplayer src="https://www.52tt.pro/usr/uploads/2024/03/4066814740.mp4"/}透视代码from Memory64 import * # 导入内存访问模块 import Memory64.D3Gui # 导入图形绘制模块 import numpy as np # 导入数学操作模块 # 获取游戏窗口句柄和进程ID hwnd, thre, pid = FindWindowPid("Valve001", None) Addr = SetupProce(pid) # 设置目标进程 Modlue_e = Addr.GetBaseAddr("amxmodx_mm.dll") # 获取模块基址 Draws = Memory64.D3Gui.ExecDraw(hwnd) # 初始化图形绘制对象 # 初始化矩阵和窗口尺寸 Matarray = np.zeros([4, 4]) GameWinWidth = 1030 / 2 GameWinHeight = 797 / 2 # 开启循环绘制 while True: Draws.startLoop() # 启动绘制循环 initNumber = -4 for i in range(4): for j in range(4): initNumber += 4 Matarray[i][j] = Addr.ReadMemory_float(0x2C20100 + initNumber) # 读取矩阵数据 offset = 0xFFFFFFFFFFFFFCDC for _ in range(2): # 读取敌人坐标数据 offset += 0x324 Poe = Addr.ReadMemory(Modlue_e + 0x1CFE08) # 读取敌人数据块基址 enemy_x = Addr.ReadMemory_float(Poe + 0x88 + offset) # 读取敌人 x 坐标 enemy_y = Addr.ReadMemory_float(Poe + 0x8C + offset) # 读取敌人 y 坐标 enemy_z = Addr.ReadMemory_float(Poe + 0x90 + offset) # 读取敌人 z 坐标 # 计算投影坐标 Vorz = Matarray[0][2] * enemy_x + Matarray[1][2] * enemy_y + Matarray[2][2] * enemy_z + Matarray[3][2] row = 1 / Vorz VorX = GameWinWidth + (Matarray[0][0] * enemy_x + Matarray[1][0] * enemy_y + Matarray[2][0] * enemy_z + Matarray[3][ 0]) * row * GameWinWidth # x 坐标投影 VorY = GameWinHeight - (Matarray[0][1] * enemy_x + Matarray[1][1] * enemy_y + Matarray[2][1] * (enemy_z - 50) + Matarray[3][ 1]) * row * GameWinHeight # y 坐标投影 VorY2 = GameWinHeight - (Matarray[0][1] * enemy_x + Matarray[1][1] * enemy_y + Matarray[2][1] * (enemy_z + 30) + Matarray[3][ 1]) * row * GameWinHeight # 第二个 y 坐标投影 if Vorz < 0: # 如果投影深度小于零,跳过当前循环 continue FanHeight = VorY - VorY2 # 计算高度差 FanWidth = FanHeight * 0.5 # 计算宽度 Draws.drawText("ACT忆梦", 30, 20, 50, (255, 255, 0)) # 绘制文本 Draws.drawRect(VorX - FanWidth / 2, VorY2, FanWidth, FanHeight, 2, (255, 255, 0)) # 绘制矩形 Draws.endLoop() # 结束绘制循环自瞄效果{bilibili bvid="BV1zb4y1E7kC" page=""/}透视效果{bilibili bvid="BV1Eh411q7tA" page=""/}
2022年07月20日
1,678 阅读
0 评论
422 点赞
2022-07-20
【技术分享】MYSQL学习笔记
简介MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性,简单的来说就是用来存储数据的,它由于其体积小、速度快、还是开放源码的,一般中小型网站的开发都选择 MySQL 作为网站数据库。登录mysqlnet start mysql(服务名) # 启动MySQL服务 net stop mysql # 停止服务 mysql -h 主机名 -u 用户名 -p # 登录数据库 # 示例:mysql -h localhost -u root -p123456show 显示数据库show databases; # 查看数据库create 创建数据库create database exp; # 创建数据库use exp; # 使用数据库create 创建表create table ser( id int(11), name varchar(25), age int(3)); # 创建表名为 ser show tables; # 查询表 describe ser | desc ser; # 显示表字段 select 查询select * from sers; # 查询表所有内容 select * from sers where name="小美"; # 查询指定内容 select * from sers order by name desc limit 1; # order by 字段排序 asc 升序 |desc 降序 limit 显示列数 select name as n, age as a from sers; # 修改显示别名 select * from sers where name like "小%"; # 查询关键字insert 插入数据insert into ser value(1, "小华", 20); # 往ser表 插入单行数据 insert into ser value( 2,"小红", 18), (3,"小美", 20); # 往ser表 插入多行数据 select * from ser; # 显示表所有字段内容drop 删除数据库drop table tbem; # 删除表 drop database test; # 删除数据库alter 修改表名alter table ser rename to sers; # 修改表名 show tables # 显示表名alter 修改类型alter table sers modify id int(30); # 修改数据类型alter 删除字段alter table sers drop id; # 删除字段delete 删除字段数据delete from sera where id=1; # 删除指定内容 update 修改内容update sers set name="小王" where age=20; # 通过年龄指定修改名称(可以通过id指定)union 联合查询select name from sera union select name from serb order by name; # 联合两个表查询时间过得真快.. 这门课程已经结束了,只是基础语法先记录在这里了方便自己查阅。安装配置mysql安装与配置教程.docPPT版第1章 数据库基础知识.pptx第2章 MySQL基础.pptx作业学生信息(作业 创建这四个表格).xls银行ATM机管理系统.docx考试案例.docmysql案例.rar{collapse}{collapse-item label="MYSQL命令" close}启动MySQL服务 net start mysql(服务名) 停止服务 net stop mysql 登录指令 mysql -h 主机名 -u 用户名 -p 示例:mysql -h localhost -u root -p123456 退出MySQL指令:\q;quit;exit 修改密码: mysqladmin -u 用户名 -p password 新密码 常用指令: \c 取消当前输入的指令 \G 对查询结果进行排版 \s 获取当前数据库的状态 \u(use) 选择指定数据库 配置MySQL的编码格式 临时配置指令: set character_set_client=gbk; 数据库基本操作指令 创建数据库:create database 数据库名; create database 数据库名 character set 编码格式 collate 编码格式_bin;创建时指定数据库的编码格式. 备注:数据库名可以中文也可以英文单词 查看当前系统中的数据库列表 show databases; 查看当前数据库的创建信息 show create database 数据库名; 修改数据库的编码格式 alter database 数据库名 default character set=gbk collate gbk_bin; 删除指定数据库 drop database 数据库名; drop database if exists 数据库名; 创建数据表的语法格式 create table [if not exists] 表名 (字段名 字段数据类型(长度约束) [字段约束], ... 创建外键 [constraint 外键名] foreign key(本表中的外键字段) references 主表表名(主表主键); ); 查看创建的数据库中得所有表格 show tables; 查询表中字段信息 describe|desc 表名; 查询表格的创建信息 show create table 表名; 删除表格 drop table [if exists] 表名; 修改表的编码格式 alter table 表名 default charset=编码格式; 修改表格结构 增加列 alter table 表名 add 列名 数据类型 [字段约束] [first|after 列名2]; 删除列 alter table 表名 drop 列名; 修改列的数据类型 alter table 表名 modify 列名 数据类型; 改列名 alter table 表名 change 旧列名 新列名 数据类型; 改表名 alter table 表名 rename 新表名; rename table 表名 to 新表名; 往表中插入数据 insert|replace [into] 表名[(列名1,列名2...)] values(数据1,数据2...),(数据1,数据2...); 查询数据记录 select *|字段名 from 表名; 修改表格记录 update 表名 set 需要修改的列=修改的值 [where 修改条件]; 删除表格记录 delete from 表名 [where 删除条件]; truncate 表名; 数据查询语句结构: select [distinct] 字段名|* from 表名1,表名2... [where 筛选条件] [group by 需要分组的字段] [having 筛选条件] [order by 需要排序的字段 asc|desc] [limit [从指定行数开始查询,]查询的结果行数] 为查询字段取别名 select 字段名1 [as] 别名1,字段名2 [as] 别名2 from 表名; 条件查询 select *|字段名 from 表名 where 字段名 运算符 值; 多条件查询 select *|字段名 from 表名 where 字段名1 运算符 值 and|or 字段名2 运算符 值; 指定范围查询 select *|字段名 from 表名 where 字段名 [not] between 值1 and 值2; select *|字段名 from 表名 where 字段名 [not] in(值1,值2...); 模糊查询 select *|字段名 from 表名 where 字段名 like 匹配的值; 通配符: %:匹配任意长度字符串 _:匹配一个字符串 空值查询 select *|字段名 from 表名 where 字段名 is [not] null; 查询排序 select *|字段名 from 表名 order by 字段名1 [asc|desc],字段名2 [asc|desc]...; 查询结果分组 select *|字段名 from 表名 group by 字段名1,字段名2... [having 条件]; 限制查询结果行数 select *|字段名 from 表名 limit [跳过的行数,]显示的行数; 集合函数 count(*|字段):返回某列的行数 sum(字段):返回某列数值的和,只能作用在存储纯数值的字段上 avg(字段):返回某列的平均值,只能作用在存储纯数值的字段上 max(字段):返回某列的最大值 min(字段):返回某列的最小值 多表链接 select 表名.字段名1 [别名],表名.字段名2 [别名]....|* from 表名1 [别名] 链接类型 表名2 [别名] on 链接条件 [where 筛选条件]; 内连接 select 表名.字段名1 [别名],表名.字段名2 [别名]....|* from 表名1 join 表名2 on 表1字段 运算符 表2字段; select 表名.字段名1 [别名],表名.字段名2 [别名]....|* from 表名1,表名2 where 表1字段 运算符 表2字段 外链接 select 表名.字段名1 [别名],表名.字段名2 [别名]....|* from 表名1 left|right|full join 表名2 on 表1字段 运算符 表2字段; 嵌套查询 select 字段名1 [别名]...|* from 表1 where 字段 运算符(子查询语句); 比较子查询 select 字段名1 [别名]...|* from 表1 where 字段 比较运算符(子查询语句); 包含多个值的牵头查询语句(in子查询) select 字段名1 [别名]...|* from 表1 where 字段 in(子查询语句); [not] exists运算符:子查询有结果集就为真 select 字段名1 [别名]...|* from 表1 where [not] exists(子查询语句); any子查询:只要外查询的条件有一个满足就会输出结果 select 字段名1 [别名]...|* from 表1 where 字段 比较运算符 any(子查询语句); all子查询:外查询的条件必须全部满足才会输出结果 select 字段名1 [别名]...|* from 表1 where 字段 比较运算符 all(子查询语句); 合并查询结果 select 字段名1 [别名]...|* from 表1 [where 条件] union [all] select 字段名2...|* from 表2 [where 条件] 当需要查询的数据在一个表中,但已知的条件不在同一个表中就用嵌套查询。 当需要查询的数据在多个表中就用多表查询。 用户会话变量赋值格式 格式1:set @变量名1=初值1,[@变量名2=初值2...]; 格式2:selec t @变量名1:=初值1,[@变量名2:=初值2...] 格式3:select 初值1 into @变量名1; 局部变量 begin declare 变量名 数据类型 [default 初值]; end 函数结构 create function 函数名(参数1,参数2.....) returns 返回数据类型 [函数选项] begin 函数体; return 返回值; end; delimiter // 修改结束符 查询函数创建信息 show create function 函数名; 查询函数基本信息 show function status like '函数名'; 查询函数详细信息 select * from information_schema.routines where routine_name='函数名'; 删除函数 drop function 函数名; 流程控制语句 if条件语句 if 条件表达式 then 语句块1; [elseif 条件表达式2 then 语句块2;]... [else 语句块n] end if; case条件语句 case 表达式 when 匹配值1 then 语句块1; when 匹配值2 then 语句块2; ...... else 语句块n; end case; while循环语句 [循环标签:] while 条件表达式 do 循环体; end while [循环标签]; leave语句:结束当前循环 iterate语句:跳过本次循环,进入下次循环 repeat循环语句 [循环标签:] repeat 循环体; until 条件表达式 end repeat [循环标签]; loop循环语句 [循环标签:] loop 循环体; if 条件表达式 then leave [循环标签]; end if; end loop; 数据完整性 删除主键语句 alter table 表名 drop primary key; 为已存在的表格添加主键 alter table 表名 add [constraint 主键名] primary key(作为主键的字段名); 删除唯一约束 alter table 表名 drop index 唯一约束名; 删除外键 alter table 表名 drop foreign key 外键名称; 为已经存在的表格添加外键 alter table 表名 add [constraint 外键名] foreign key(外键字段) references 主表表名(主表主键); 创建索引 创建表格时创建索引 create table 表名( ...... [unqiue|fulltext|spatial] index|key [索引名](字段[(长度)][asc|desc])) )engine=存储引擎 default charset=字符集类型; 为已经存在的表格添加索引 1、create [unique|fulltext|spatial] index 索引名 on 表名(字段[(长度)][asc|desc]); 2、alter table 表名 add [unique|fulltext|spatial] index|key 索引名(字段[(长度)][asc|desc]); 删除索引 drop index 索引名 on 表名; 创建视图 create [or replace] view 视图名称[(视图字段名)] as select语句 with [cascaded|local] check option; or replace:如果数据库中已经存在同名视图就替换视图,如果没有就创建新视图 修改视图 alter view 视图名 as 新select语句 with [cascaded|local] check option; 查询视图 查询定义语句:show create view 视图名; 查询所有视图:select * from information_schema.views; 删除视图 drop view 视图名1,视图名2...; 存储过程结构语句 create procedure 存储过程名称(in 参数名1 参数类型,out 参数名2 参数类型,inout 参数名3 参数类型) [存储过程选项] begin 存储过程语句块 end; 查看存储过程的语句 show procedure status like '存储过程名'; show create procedure 存储过程名;查看创建信息 select * from information_schema.routines where routine_type='procedure';查询所有数据库的存储过程 删除存储过程 drop procedure 存储过程名; 修改存储过程\函数语句 alter procedure/function 名称 [函数选项|comment|sql security definer|invoker]; 创建触发器语句 create trigger 触发器名称 before|after insert|update|delete on 表名 for each row begin 触发程序; end; 查询触发器语句 show triggers [like '匹配的触发器名']; show create trigger 触发器名;查询某个触发器的创建信息 select * from information_schema.triggers; 删除语句 drop trigger 触发器名; 开启事务的语句 start transaction; 提交事务的语句 commit; 回滚事务 rollback; autocommit=0;关闭自动提交事务 autocommit=1;开启自动提交事务 事务保存点 savepoint 保存点; 回滚到指定保存点 rollback to savepoint 保存点; 删除保存点 release savepoint 保存点; 游标处理语句 1、声明游标 declare 游标名 cursor for select语句; 2、打开游标 open 游标名; 3、获取数据 fetch 游标名 into 变量1,变量2....; 处理错误的语句 declare continue|exit handler for 错误编号 处理语句; 4、关闭游标 close 游标名; 数据备份 select * into {outfile|dumpfile} '备份文件路径和文件名称' from 需要备份的表格; 数据恢复 load data [low_priority] [local] infile '恢复的文件' [replace|ignore] into table 需要恢复的表格; mysqlimport -u user -p --lock-tables --replace 需要恢复的数据库 恢复的文件 添加读锁 lock tables 表名 read; 添加写锁 lock tables 表名 write; 解除锁 unlock tables; 数据库备份 mysqldump -u user -p [--default-character-set=gbk] {--all-databases|需要备份的数据库名 [表名1 表名2]}>备份文件路径及文件名 数据库恢复 mysql -u user -p 需要恢复的数据名<备份文件路径及文件名 添加用户语句 语句1 create user '用户名'@'主机名' identified by '密码',['用户名'@'主机名' identified by '密码']...; 语句2 grant privileges on 数据库名.表名 to '用户名'@'主机地址' identified by '密码',['用户名'@'主机名' identified by '密码']...;(8.0以后不支持该语句创建新用户) 语句3 insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) values('主机地址','用户名',password('密码'),'','',''); 删除用户 drop user '用户名'@'主机地址'; delect from user where user='用户名' and host='主机地址'; 修改用户名 rename user '旧用户名'@'旧主机名' to '新用户名'@'新主机名'; 修改密码 mysqladmin -u 用户名 -h 主机地址 -p password 新密码 update user set password=password('新密码') where user='用户名' and host='主机名'; set password=password('新密码'); 查询用户权限 show grants for '用户名'@'主机名'; 修改用户权限 grant privileges|all privileges on 数据库名.表名 to '用户名'@'主机地址' [with grant option]; 收回权限 revoke privileges|all privileges on 数据库名.表名 from '用户名'@'主机地址' ; 刷新权限 flush privileges;{/collapse-item}{/collapse}
2022年07月20日
107 阅读
0 评论
45 点赞
1
...
8
9
10
...
14
0:00