最近玩JD上头但是被各路挂壁打的头大,偶然看到隔壁群友发的村瓦挂壁赛直播,起了逆下看看的念头。遂顺着网线一路找到了发卡网,拿到了本次逆向的主角。貌似不简单阿,不过“易语言程序”这几个字了怎么没了???
经典E语言程序配VMP,想必代码肯定是运行时解密的,直接运行dump拖IDA一条龙。这里推荐一下fjqisba老哥的E-Decompiler,运行插件之后看到了熟悉的易语言函数。
直接搜下4D 5A 90能看到有两个结果:
据我所知易语言开发通常会把PE文件当作图片资源存放在易语言资源里面,而资源的数据区上面的DWORD就是数据大小。
按这个规律可以直接dump出两个PE文件:可以看到存在易语言资源中的两个PE文件都是驱动程序,想必这就是包含作弊功能的驱动了,按顺序先分析第一个位于0x004C09A8位置的程序。
标准的WDF驱动,直接跟进DriverInit里面:感谢皮总和养猪哥提供的KDDEBUGGER_DATA_OFFSET。很经典的自删除、清空PiDDBlock、PiDDBCacheTable以及KernelHashBucketList用来隐藏驱动加载过的痕迹,不敢说跟kdmapper一模一样,只能说有个八分像。还有一些像系统版本、PteBase等等的初始化操作,同时可以看出驱动是走的IoControl与用户层通讯,符号链接是TpSafe。下面进IoControl的派遣函数看看:用户层DeviceIoControl的Buffer中传递了一个用来被Map的驱动文件,通过用户层程序也可以看出这一结果。MapDriverThreadProc里面无非一些拉伸PE、修复导入重定位的操作,内存是通过MmAllocateIndependentPages申请的;这里不再赘述,想看的朋友可以自己逆向看。
上来就是vmcall、vmresume,虚拟化技术驱动的歪瓜。。。太卷了。DriverEntry直接进了VM,看来常规方法逆不动了。字符串里有脏东西嗷,直接xref追一下他Hook了AXE-BASE.sys的某个函数(就是AXE自己的CreateHook),特征搜一下看看好家伙,它直接Hook了它的Hook;幸好之前分析过一部分BASE,今天正好派上用场。
再xref看下CreateEptHook的调用:
大致Hook了MmIsAddressValid、MouseClassServiceCallback、KiPreprocessFault、NtCreateSection、PspExitProcess、MmCopyMemory、RtlWalkFrameChain这几个内核函数。
拦截MmIsAddressValid和MmCopyMemory实现隐藏内存,参数中的虚拟地址/物理地址包含驱动模块所在内存区域时返回失败。
拦截RtlWalkFrameChain对抗栈回溯,当调用者回溯的堆栈中包含驱动模块所在内存区域时抹除堆栈信息。
拦截NtCreateSection并过滤特定文件,当文件句柄对应的文件名称为“APEX_Clothing_x64.dll”时调用者即为游戏进程,随即进行初始化。初始化操作(ShadowBreakPoint即“无痕”软件断点):
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
spacetimec 最后还是逃不过截图检测