乐易论坛-乐易网易语言培训教程火山PC视窗中文编程交流论坛

 找回密码
 立即注册

手机号登录

用手机号号登陆

微信登录

微信扫码,快速开始

QQ登录

用QQ账号登陆

办理VIP,定制软件,报名培训联系QQ[重磅]2024年实地培训高清培训目录火山PC版乐易模块使用教程
请牢记揰掵佲的QQ号1615457736 1615457734 其他都是骗子有了火山,易语言是否还有必要学习吗?易语言0基础入门课程
火山PC视窗0基础入门课程易语言外挂0基础入门课程火山PC视窗火山HOOK入门课程
易语言误报处理课程QQ空间POST课程2022年火山PC易语言POST系列课程
Android逆向Jeb动态调试0基础课程QQ邮箱网页POST课程WeChat个微Hook实战课程
百日Js加密分析实战课程(无密下载)QQ群POST课程h5游戏WebSocket逆向视频
JavaScript加密特训课程易语言汇编快速入门课程破解实战系列课程
[2024年]火山PC0基础x64位游戏内存辅助开发教程手游模拟器脚本0基础课程易语言加密防破解0基础入门课程
广告位招租联系QQ1615457736  
查看: 11873|回复: 4

[分析资料] HOOK获取某网游验证码图片数据

[复制链接]

[分析资料] HOOK获取某网游验证码图片数据

[复制链接]
已绑定手机
尘。
等级头衔

等級:顶级Vip

Rank: 14Rank: 14Rank: 14Rank: 14

积分成就
易币
贡献
主题
精华
金钱
积分
470
注册时间
2014-8-18
最后登录
1970-1-1

勋章墙

2019-6-7 23:58:51 | 显示全部楼层 |阅读模式

据统计90%查看本帖的人,都已经注册本站了哦

您需要 登录 才可以下载或查看,没有账号?立即注册

×
某网游登录的时候添加了验证码验证(如图所示),如果要实现验证码的识别,通常方式是截图识别或者直接提取验证码图片
但是这游戏比较蛋疼,图片框的大小和验证码图片的大小有误差,导致部分验证码图片会在窗口中显示不完全
为了提高识别率,采用内存中读取验证码图片数据的方法会比较好
1.png

既然游戏需要获取验证码,那肯定要先和服务器做通讯,下断send WSASend
当按下登录按钮的时候,WSASend被触发,且只触发一次,说明这个包很可能就是请求验证码图片的

alt+k查看栈内的数据,有一个函数名为GetCaptchaForGame,如图所示
2.png

根据函数名我们可以得出这个函数为游戏获取验证码图片的函数。着重分析这个函数。
在函数尾部下断,游戏在弹出验证码之前就已经触发断点,说明该函数仅作为获取验证码数据的功能。
观察函数参数,该函数为5个参数,如图所示
3.png

我们经过观察,逐一分析,可以发现参数5为验证码图片的数据大小,参数4位验证码图片的数据
因为验证码无论获取失败还是错误都会经过这里,我们可以找到更合适的地方去HOOK

既然这里是仅仅作为验证码的获取的函数,那我们看一下参数4 和参数5 会发现都是来自[ebp-0x40]这个架构体
这个结构体指针由ecx传递,如图所示,在调用处传过来
4.png

那我们返回上一层分析,ecx来自[ebp-0x3c]
5.png

让函数执行到返回,发现od一直不会把进程挂起了,而且游戏的验证码识别框出来了,说明这个函数内已经执行了创建窗口的代码
那我们分析这个函数内和[ebp-0x3c]的地方。
在靠后一点就可以看到很有用的东西了
6.png

我们一直步过过去,可以发现到0071FCC1    FF15 4433E300   call dword ptr ds:[0xE33344]执行之后我们的图片框有了数据,那我们在这里HOOK就可以了


下面是HOOK代码的编写,我们可以采取这样一个流程

挂全局钩子,dll注入后判断进程是否为游戏进程,如果是则挂WH_GETMESSAGE类型的钩子,当窗体的类名为SpLoginDialog时安装钩子
EXE部分,我们同样挂WH_GETMESSAGE类型的钩子,用于接收dll的数据

下面代码编写

注入DLL
.版本 2

.子程序 injectDll, 整数型, 公开
.参数 dllPath, 文本型

hHook = SetWindowsHookEx (#WH_GETMESSAGE, 到整数 (&myFun), LoadLibrary (dllPath), 0)
返回 (hHook)


dll的钩子回调
.版本 2

.子程序 myFun, 整数型
.参数 nCode, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型
.局部变量 字节集, 字节集
.局部变量 hWnd, 整数型
.局部变量 className, 文本型

字节集 = 指针到字节集 (lParam, 24)
hWnd = 取字节集数据 (字节集, #整数型, 1)
.判断开始 (hHook = 0)
    .判断开始 (-1 ≠ 寻找文本 (取执行文件名 (), “kartrider”, , 真))
        className = 取空白文本 (255)
        GetClassNameA (hWnd, className, 254)
        .判断开始 (-1 ≠ 寻找文本 (className, “SpLoginDialog”, , 真))
            _setAllHook ()
        .默认

        .判断结束

    .默认

    .判断结束

.默认

.判断结束
返回 (CallNextHookEx (hHook, nCode, wParam, lParam))

卸载钩子
.版本 2

.子程序 unHook, , 公开

UnhookWindowsHookEx (hHook)



下面是HOOK代码的编写,代码执行到我们的HOOK的地方之后,执行postData()函数
.版本 2

.子程序 setHookCapData
.局部变量 hookAddr, 整数型
.局部变量 oldFlag, 整数型
.局部变量 lenth, 整数型
.局部变量 newCode, 字节集

hookAddr = 7470237
lenth = _取子程序地址 (&myShellCode) - hookAddr + 3 - 5
newCode = { 233 } + 到字节集 (lenth)
VirtualProtect (hookAddr, 5, #PAGE_EXECUTE_READWRITE, oldFlag)
写到内存 (newCode, hookAddr, )
VirtualProtect (hookAddr, 5, oldFlag, oldFlag)

.子程序 myShellCode

' _asm:mov ecx,dword [ebp-0x3C]
' _asm:mov dword [ecx+0x8],eax
' _asm:pushad
' _asm:pushfd
' _asm:add ecx,0x40
' _asm:push ecx
' _asm:push eax
_取子程序地址 (&postData)
' _asm:call eax
' _asm:popfd
' _asm:popad
' _asm:push 0x71FCA3
' _asm:retn

postData函数负责把对应信息投递给EXE
.版本 2

.子程序 postData, 整数型
.参数 hWnd, 整数型
.参数 capMsg, 整数型
.局部变量 hWnd_App, 整数型

hWnd_app = FindWindow (“daskjdsa”, 字符 (0))
.如果真 (hWnd_app > 0)
    PostMessage (hWnd_app, 621, hWnd, capMsg)
.如果真结束
g_hWnd = hWnd
返回 (0)



EXE运行后,先安装全局钩子,然后再安装自己的消息钩子
.版本 2

.子程序 __启动窗口_创建完毕

' _验证码初始化 ()
SetWindowsHook (3, &钩子回调)  ' 安装消息钩子,用于启动线程
injectDll (“tools.dll”)


EXE的钩子回调
.版本 2

.子程序 钩子回调, 整数型
.参数 nCode, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型
.局部变量 MSG, MSG
.局部变量 字节集, 字节集
.局部变量 myMsg, myMsg
.局部变量 data, 整数型

字节集 = 指针到字节集 (lParam, 24)
MSG.hwnd = 取字节集数据 (字节集, #整数型, 1)
MSG.message = 取字节集数据 (字节集, #整数型, 5)
MSG.wParam = 取字节集数据 (字节集, #整数型, 9)
MSG.lParam = 取字节集数据 (字节集, #整数型, 13)
.如果真 (MSG.message = 621)
    _getCapData (MSG.wParam, MSG.lParam)
.如果真结束
返回 (CallNextHookEx (0, nCode, wParam, lParam))


图片框显示完整的验证码图片
.版本 2
.支持库 const

.子程序 _getCapData, 逻辑型
.参数 hWnd, 整数型
.参数 capMsg, 整数型
.局部变量 lenth, 整数型
.局部变量 processId, 整数型
.局部变量 hProcess, 整数型
.局部变量 capData, 字节集
.局部变量 dataPoint, 整数型
.局部变量 resultData, 字节集
.局部变量 ret, 逻辑型
.局部变量 data, 字节集

processId = 0
hProcess = 0
lenth = 0
GetWindowThreadProcessId (hWnd, processId)
.判断开始 (processId = 0)
    返回 (假)
.默认
    hProcess = OpenProcess (#PROCESS_ALL_ACCESS, 0, processId)
    .判断开始 (hProcess = 0)
        返回 (假)
    .默认
        ReadProcessMemory (hProcess, capMsg, lenth, 4, 0)
        .判断开始 (lenth = 0)
            CloseHandle (hProcess)
            返回 (假)
        .默认
            ReadProcessMemory (hProcess, capMsg - 4, dataPoint, 4, 0)
            .判断开始 (dataPoint = 0)
                CloseHandle (hProcess)
                返回 (假)
            .默认
                capData = 取空白字节集 (lenth)
                ReadProcessMemory_ (hProcess, dataPoint, capData, lenth, 0)
                .判断开始 (取字节集长度 (capData) = 0)
                    CloseHandle (hProcess)
                    返回 (假)
                .默认
                    图片框1.图片 = capData
                    返回 (ret)

                .判断结束

            .判断结束

        .判断结束

    .判断结束


评分

参与人数 2易币 +6 金钱 +5 收起 理由
13864145036 + 1 卧槽,初夏大神发个跑跑最新的过检测源码出.
Archer + 5 + 5 新技能已get√

查看全部评分

回复

使用道具 举报

已绑定手机
楼主
尘。 楼主
等级头衔

等級:顶级Vip

Rank: 14Rank: 14Rank: 14Rank: 14

积分成就
易币
贡献
主题
精华
金钱
积分
470
注册时间
2014-8-18
最后登录
1970-1-1

勋章墙

2019-6-8 00:01:34 | 显示全部楼层
本帖最后由 尘。 于 2019-6-8 00:05 编辑

不知道为何发布之后看不到帖子内容,但是点编辑能看到全部内容
不管了,看不到也不想重新编辑了
源码就不用放出来了,有新的自己写一份也很简单。这种办法也就工作室比较需要用,客户挂没必要搞啥验证码识别
当然,帖子放出来只为了学习和交流,请勿用于任何违法用途。

点评

大神发个跑跑最新的过检测源码  发表于 2019-10-13 00:56
javascript:;
回复

使用道具 举报

已绑定手机
qq192677759
等级头衔

等級:编程入门

Rank: 4

积分成就
易币
贡献
主题
精华
金钱
积分
452
注册时间
2020-1-5
最后登录
1970-1-1

勋章墙

2020-3-22 13:04:49 | 显示全部楼层
6666666666666666666666
回复

使用道具 举报

已绑定手机
jia3872821
等级头衔

等級:编程学徒

Rank: 3Rank: 3

积分成就
易币
贡献
主题
精华
金钱
积分
257
注册时间
2018-4-16
最后登录
1970-1-1

勋章墙

2023-4-22 19:13:02 高端的乐易手机用户 | 显示全部楼层
我也来看看了
回复

使用道具 举报

如果懒得打字,请选择右侧内容快捷回复 提醒:以任何方式进行『恶意灌水』的行为,进行封号处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

热点推荐上一条 /5 下一条

QQ|网站地图|手机版|小黑屋|乐易论坛-乐易网 | 湘ICP备19007035号

拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表乐易立场!

娄底市乐易网络科技有限公司声明:乐易原创培训课程版权均为我公司所有,未经许可,不得擅自翻录,盗版,破解本站课课程,我们将保留法律诉讼的权利

GMT+8, 2024-6-3 06:02 , Processed in 0.050952 second(s), 51 queries .

Powered by Discuz! X3.4

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表