-
-
[原创]某考试软件逆向分析
-
发表于: 2025-1-12 15:59 2490
-
前言
某考试软件的逆向分析,分析它是如何禁用远程桌面、黑屏、全屏等方法来达到防作弊目的的。
准备工作
先用die静态检查。发现客户端使用QT5.15进行开发。
在多次调试中发现基址的都不一致,才发现了客户端使用了动态基址。在进行分析之前首先去掉动态机制。如下图所示:
使用010Editor找到数据结构dllcharacteristics,把值改为0,就禁用了随机基址。
静态分析
主函数入口是WinMain,有GetCommandLineW函数,用来获取命令行参数。
在函数sub_401F20中,发现了初始化窗口相关的操作,
再往下发现了nohook、repair的命令行参数
经过测试,命令行中带有--nohook会去掉键盘的限制,任务管理器也能调用了,使用向日葵远程也不黑屏了。
分析了一下init_window,逻辑很复杂,为了简化流程,直接使用函数搜索,能更快找到关键点。让某窗口黑屏的函数是SetWindowDisplayAffinity,直接查找引用,在sub_40c170函数中发现了引用。把sub_40c170重命名为black_window,便于之后分析。
调用black_window的函数是sub_405360,把sub_405360命名为hook_window。调用hook_window的函数有init_window、sub_404d10、sub_4052e0,而sub_404d10和sub_4052e0都会被init_window调用,所以hook_window很关键。
接下来具体分析hook_window,这里有6个函数,各自进行分析后,给出如下的注释。
分别进行重命名,如下所示。
其中发现a1这个变量被多次引用,说明这个a1作为是否设置限制的判断条件。在set_hook中的判断如下。
在set_desktop中的判断如下。
如果a1=0,那么会使得所有的限制得到解除。查看hook_window函数的调用关系图。
有init_window、sub_404d10、sub_4052e0三个函数会调用,而a1作为第一个参数传入hook_window,所以把调用函数的参数都改为0。
在IDA中,用keypatch,应用到exe文件,运行.按下win键,弹出了windows开始菜单,成功解除限制。
想让软件界面窗口化显示,QT界面设置窗口全屏显示,可以采取以下方法:
showFullScreen()、setWindowFlag()。查找函数setWindowFlag,找到4个引用位置,在引用中一个一个试。
在update_page中,把QWidget::setWindowFlag(v63, 0x800, 1);改为QWidget::setWindowFlag(v63, 0x1, 1);
修改后,窗口依然会全屏幕显示。查找showFullScreen,发现了调用。在sub_4054f0中,经过调试,发现会调用showFullScreen,改为jmp,调用showMaximized。
成功将软件窗口化了,但是鼠标被限制了,只能点击窗口内的组件,窗口外是没反应的。限制光标的函数是clipCursor,直接查找clipCursor的调用。在sub_40C1E0找到了调用。
用keypatch改为push 0;nop;nop;call ds:ClipCursor。
现在就能自由地放大缩小了,如下图: