被刷百万点赞背后的故事,是颜值的支撑还是技术的提升?

小伙伴们是否已经直播上课?是否为你们可爱的老师点赞,又是否破了百万呢?

至少我们是这样 [此处手动狗头]。
在这里插入图片描述
毫无疑问这不可能纯手破百万的,这仅仅三十多人而已。无非就是些鼠标连点器在不停的模拟点击,本文就介绍下鼠标连点器的实现原理。

一、mouse_event

实现连点器的关键,就是mouse_event函数,但是这个函数和其他函数有一个不同点,那就是命名格式,一般Win API很少出现这种风格,不知道是什么原因,就像Java中的Hashtable,但是不影响我们使用。

mouse_event在MSDN中说明已被SendInput取代,但是SendInput不太了解,还是介绍mouse_event吧。
在这里插入图片描述
dwFlags:这个参数也就是指明那个键被按下,取值如下。

MOUSEEVENTF_ABSOLUTEdX和dY参数含有规范化的绝对坐标
MOUSEEVENTF_LEFTDOWN左按钮按下
MOUSEEVENTF_LEFTUP左按钮抬起
MOUSEEVENTF_MIDDLEDOWN中间按钮按下
MOUSEEVENTF_MIDDLEUP中间按钮抬起
MOUSEEVENTF_MOVE移动
MOUSEEVENTF_RIGHTDOWN右按钮按下
MOUSEEVENTF_RIGHTUP右按钮抬起
MOUSEEVENTF_WHEEL滑轮


dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。

dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOUSEEVENTF_ABSOLUTE的设置。

dwData:如果dwFlags为MOUSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,负值表明鼠标轮向后转动,即朝向用户。

dwExtralnfo:指定与鼠标事件相关的附加32位值。

所以最终完成一次左键按下抬起操作,也就是一行。

mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0.

光知道怎么模拟其实还是不够的啊,因为还需要有热键开始暂停。

二、RegisterHotKey

见名知意,这是用来注册热键的,像我们QQ的截图快捷键Ctrl+Alt+A或者是微信的截图快捷键Ctlr+A。
在这里插入图片描述
hWnd:窗口的句柄。
id:热键标识符。
fsModifiers:取以下值,也就是可以指明热键是否带有Ctrl、Alt等键。

MOD_ALTAlt键
MOD_SHIFTShift键键
MOD_WINWindows键
MOD_NOREPEAT更改热键行为,以便键盘自动重复不会产生多个热键通知
MOD_CONTROLCtrl键

vk:指明虚拟键码,比如热键是A,则取65。

这个函数具体处理是在窗口函数中,热键被触发时,窗口函数会接收的WM_HOTKEY消息。wParam就是上面传入的热键标识符,lParam的低位表示fsModifiers的值,高位表示vk的值。

像这些小程序开发,没有比VB更合适的了,但是VB又封装了窗口函数,所以我们又得需要GetWindowLong、SetWindowLong来修改默认的窗口函数。

WndFunchw = GetWindowLong(Me.hwnd, GWL_WNDPROC)
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Proc)

为了防止开始模拟点击后,鼠标被误移动,从而点到其他东西,所以还需要在开始后,不让鼠标移动到其他位置。最简单可以使用GetCursorPos、SetCursorPos。

GetCursorPos在开始时获取鼠标位置并保存下来,SetCursorPos是设置鼠标位置。

三、完整代码

模块中

Public Declare Function RegisterHotKey Lib "user32.dll" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32.dll" (ByVal hwnd As Long, ByVal id As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Type POINTAPI
X As Long
Y As Long
End Type
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Public Declare Function SetCursorPos Lib "user32.dll" (ByVal X As Long, ByVal Y As Long) As Long

Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC As Long = -4

Public Const WM_HOTKEY As Long = &H312


Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

Public Const MOUSEEVENTF_MOVE = &H1
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN = &H8
Public Const MOUSEEVENTF_RIGHTUP = &H10
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20
Public Const MOUSEEVENTF_MIDDLEUP = &H40
Public Const MOUSEEVENTF_ABSOLUTE = &H8000
Public Const HOTLEFT As Integer = 1
Public Const HOTUP As Integer = 2
Public Const HOTRIGHT As Integer = 3
Public Const HOTDOWN As Integer = 4
Public Const HOT_KEY_ID As Integer = 5
Public Const MOD_ALT As Long = &H1
Public Const MOD_CONTROL As Long = &H2

Public hWndFunc As Long
Public isPlay As Boolean
Public mCruuentPoint As POINTAPI

Public Function Proc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Select Case Msg
Case WM_HOTKEY
    If wParam = HOT_KEY_ID Then
        If isPlay = False Then
            Call GetCursorPos(mCruuentPoint)
        End If
        isPlay = Not isPlay
        Form1.Timer1.Enabled = isPlay
    End If

End Select

Proc = CallWindowProc(hWndFunc, hwnd, Msg, wParam, lParam)
End Function

窗体

Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1

hWndFunc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Proc)
Dim r As Long
r = RegisterHotKey(Me.hwnd, HOT_KEY_ID, MOD_CONTROL, Asc("B"))
 If r = 0 Then
    MsgBox "热键注册失败,请关闭使用方向键为ALT+S的程序"
   rk = False
 End If
Label2.Caption = "将鼠标移动到点赞按钮处,安Ctrl+B键 开始\暂停"

End Sub

Private Sub Label2_Click()
	Static count As Long
	count = count + 1
	Me.Caption = count
End Sub

Private Sub Timer1_Timer()
	SetCursorPos mCruuentPoint.X, mCruuentPoint.Y
	Label1.Caption = "开始疯狂输出"
	mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

-原理实现 在上一篇文章中我们,提到了如何获取到sessionkey,如果对此感兴趣的朋友可以自行到[调试逆向]某Qsessionkey查找完整版查看 首先,就是HOOK掉关键传入sessionkey的地方,也就是Common.dll中的Common.oi_symmetry_encrypt2简单的分析一下参数,就可以看到参数中有sessionkey的指针了。 可以说获得了sessionkey基本所有Q的操作我们都可以实现了 简单的分析一下发送的QQ包下面是已经通过sessionkey解的udp数据包 (1) 00000010000000120801120C08 C8A3C3C906 10E30798010008E50F1001220B58 E2D0F3B40D (2) 00000010000000120801120C08 C8A3C3C906 10E30798010008E50F1001220B58 85F99F9103 (3) 00000010000000120801120C08 E2D0F3B40D 10E30798010008E50F1001220B58 C8A3C3C906 (1)和(2)是相同QQ号发送得点赞请求,那么唯一发生变化得就是对方QQ (2)和(3)不同QQ号发送,上面得5字节也发送了变化,那么有理由相信这就是我的QQ号 发送包分析完了,那就得求得加密算法了,QQ转16进制,应该是4字节,而到这里就变成了5字节,那这里一定是加密了,到这里我上网查了一些,没自己分析,就不多bb了,等下下载源码自己看看得了(python中有句话叫不要重复造轮子,确实不想造) 至此感觉,QQ协议不过如此嘛,简简单单,东拼西凑QQ点赞器就成了?当然并没有 确实刚做好能点赞,但是当我重新登录得时候,奇怪得事情还是发生了(bug),点赞并没有成功,于是我猜想了一下原因: 原本QQ协议一些参数需要重新获取 源码本身存在问题 已经被tx察觉 发生ip发生了变化 按照这个调bug思路我走了下去,确实问题发生在了ip上 这不就简简单单,内存中搜索一下不就ok了吗?(你看我这臭毛病,总是喜欢自问自答),但是想在QQ中搜到自己想要的数据几乎不可能,于是还是从函数(win32.api)入手吧! 如果想要发送udp的包,那么一定逃不过下面的api ws2_32.dll.sendto ws2_32.dll.WSASendTo 事实上我们的想法确实是有效的,F2下断在参数中我们就找到了指向ip的指针,使用抓包工具,看看ip,确实是这个ip,至此我们要的所有条件就完成了。 下节我们讲如何获取最新的clientkey(也就是快速登录) 基本内容 老版本clientkey如何获取的 简单的抓包即可实现 新版本会遇到什么问题 本地发包验证 解决思路 拦截http请求,断点调试
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值