本帖最后由 anticode 于 2017-5-8 08:26 编辑
0x01 起因
最近玩了一下魔兽争霸。
但小兵太多总是顾不过来于是下载了一个显血外挂,效果很好。
于是我就想看看它到底是怎么实现的。
0x02 逆向分析
用peid一查发现是:UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
直接就手脱了,可以运行。
根据我以前逆向vb的经验,vb调用api有个地方可以把它所有调用的api全部截取到。
先下这个地方的断点:
00401440 .- FF25 7C104000 JMP DWORD PTR DS:[<&MSVBVM60.DllFunction>; MSVBVM60.DllFunctionCall
跟进,在:
7339A107 8BF0 MOV ESI,EAX
的断点。在ecx中显示的就是api了。
然后f9跑起来。
其间拦到几个GlobalAddAtomA,RegisterHotKey,WaitMessage。。。。 全部不用管。
这里有个小插曲,一般的外挂我拦截的时候起码有findwindow,writeprocessmemory等函数的,但这个常用的外挂函数几乎
一个都没有,这让我十分好奇,难道它已经达到不用钩子,不写内存的超高级境界了?
直接让它跑,主界面出来后按程序提示按home,就是显血的键了。
拦截到keybd_event。
查看msdn
VOID keybd_event( BYTE bVk, // virtual-key code BYTE bScan, // hardware scan code DWORD dwFlags, // flags specifying various function options DWORD dwExtraInfo // additional data associated with keystroke );
按msdn的说法就是扔一个按键消息到消息队列,当然是扔给的是当前活动窗口,
怪不得没有使用findwindow函数。
它的参数,参1,虚拟按键码,参2,扫描码,参3,可选标识,参4,附加信息。
关于参3,msdn说有KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP 两种选择,如果单用KEYEVENTF_EXTENDEDKEY是按下某个键,
配合KEYEVENTF_KEYUP就是弹起了。
好了继续跟踪,跟踪keybd_event来到:
00402C41 . 0BC0 OR EAX,EAX ; USER32.keybd_event 00402C43 . 74 02 JE SHORT unpack.00402C47 00402C45 . FFE0 JMP EAX 00402C47 > 68 242C4000 PUSH unpack.00402C24 00402C4C . B8 40144000 MOV EAX,<JMP.&MSVBVM60.DllFunctionCall> 00402C51 . FFD0 CALL EAX 00402C53 . FFE0 JMP EAX
注意00402C53 .- FFE0 JMP EAX ; USER32.keybd_event
这个被调用了。
看堆栈:
0012EF10 00403F82 /CALL 到 keybd_event 来自 unpack.00403F7D 0012EF14 000000DB |Key = DB 0012EF18 00000000 |ScanCode = 0 0012EF1C 00000000 |Flags = 0 0012EF20 00000000 \ExtraInfo = 0
至此一切都已经清晰了。
|Key = DB 所指的就是“[”这个按键。
我用了一个懒办法验证,进游戏直接按“[”血就显示了出来。
0x03 总结 该显血外挂的核心,就是使用keydb_event模拟按下显示血量的按钮,从而实现显血的功能。 如果学习作者的思路,完全可以自己编写模拟键盘模拟的软件,从而使一些繁琐的工作,交给软件自动执行。 附件为显血外挂工具。
|