|
发表于 2025-2-27 17:15:14
|
显示全部楼层
河南省新乡市
你提出的这个问题非常具有普遍性,所以我专门花了一些时间整理了方法,希望能得到你的最佳(注:所有命令均需要精易模块,请自行调用)
(草,我特么自己读一遍感觉好像AI啊,但这全是我自己一个字一个字抠出来的)
首先最简单的方法,判断进程名
此检测的问题在于:如果文件名被修改,进程名也不同,此检测就会失效
由此我写了第二种检测
这种检测可以针对窗口名和窗口类名进行模糊搜索查找但问题在于:窗口名的修改十分容易,只要有对应句柄就能够进行修改,或者干脆程序启动时直接随机化窗口名,甚至压根就不弹出窗口,只在后台做小动作,此检测自然就会失效了
同时由于检测方法调用了精易模块的模糊遍历,还有误判的可能
我又从窗口格式进行下手 变量名 | 类 型 | 静态 | 数组 | 备 注 | 窗口信息数组 | 精易_窗口信息 | | 0 | i | 整数型 | | | 窗口_枚举 (窗口信息数组 ) 计次循环首 (取数组成员数 (窗口信息数组 ), i ) 如果真 (窗口取宽度 (窗口信息数组 [i ].窗口句柄 ) = 宽 且 窗口取高度 (窗口信息数组 [i ].窗口句柄 ) = 高 ) 返回 (真)  计次循环尾 ()返回 (假)
这种检测能够暴力枚举所有窗口,同时检查有没有窗口满足了所提供的宽和高
但程序只需在启动时随机化窗口的宽度和高度,甚至压根没有窗口,此检测自然也就失效了
同时还有一个问题:如果目标程序的窗口大小恰好为全屏,或者恰好与某些应用窗口大小相等,还会导致误判
我又尝试用曾经检测CE时用到的一种方法:枚举dll
|
方法4_检测进程调用dll | 逻辑型 | | |
检测dll名 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 进程信息数组 | 进程信息 | | 0 | 进程_模块信息 | 进程_模块信息 | | 0 | i1 | 整数型 | | | i2 | 整数型 | | | 逻辑值 | 逻辑型 | | |
逻辑值 = 假 进程信息数组 = 取系统进程列表 () 计次循环首 (取数组成员数 (进程信息数组 ), i1 ) 进程_枚举进程模块 (进程信息数组 [i1 ].进程标识符, 进程_模块信息 ) 计次循环首 (取数组成员数 (进程_模块信息 ), i2 )  如果真 (进程_模块信息 [i2 ].模块文件名 = 检测dll名 )   逻辑值 = 真     计次循环尾 () 计次循环尾 ()返回 (逻辑值 )
这种检测暴力枚举所有进程,再二次枚举出每个进程所调用的dll,这个的确非常有效,只要你调用了具有特异性的dll,就难以逃脱这种方法的追杀
但问题仍然存在:如果目标程序只调用了大众化的系统dll,使用这种方法不仅无法准确判断,还会误判其他程序
所以我又尝试从目录下手
|
方法5_检测进程目录下是否存在指定文件 | 逻辑型 | | |
文件名 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 进程信息数组 | 进程信息 | | 0 | i | 整数型 | | | 临时路径 | 文本型 | | |
进程信息数组 = 取系统进程列表 () 计次循环首 (取数组成员数 (进程信息数组 ), i ) 临时路径 = 子文本替换 (进程_PID取路径 (进程信息数组 [i ].进程标识符 ), 进程信息数组 [i ].进程名称, “”, , , 真) 如果真 (文件是否存在 (临时路径 + 文件名 ))  返回 (真)  计次循环尾 ()返回 (假)
首先枚举所有进程,然后得到所有进程的当前目录,再判断其目录下方有没有要寻找的文件
这种方法适合某些必须依托同一文件夹下资源文件才能运行的程序
但反制同样简单,只要我不在程序所在文件夹下存放资源即可,甚至压根不写出资源,不调用资源
还有一个问题:如果判断的文件名比较大众化,例如data.ini,还可能会导致误判
这个时候我打开任务管理器,发现每个进程都会有“描述”,我再次尝试从这个方向下手
|
方法6_检测文件信息 | 逻辑型 | | |
欲比对文件信息 | 整数型 | | | | 比对内容 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 进程信息数组 | 进程信息 | | 0 | i | 整数型 | | | 临时路径 | 文本型 | | |
进程信息数组 = 取系统进程列表 () 计次循环首 (取数组成员数 (进程信息数组 ), i ) 如果真 (文件_取文件信息 (进程_PID取路径 (进程信息数组 [i ].进程标识符 ), 欲比对文件信息 ) = 比对内容 ) 返回 (真)  计次循环尾 ()返回 (假)
这个判断应该比较稳定,也可能是我对文件信息这方面了解的不多
例如e.exe的描述为“易语言”,精易编程助手.exe的描述为“编程必备工具”
同时还可以从文件版本内部名称公司名备注产品名称等等等等方面进行多重判断,相对来说比较稳定
但要注意,如果比对内容较为大众化,会出现误判的情况,例如描述为:“Windows 服务主进程”或“易语言”
以上我提供的这么多方法,尽量要融合起来使用,多重检测,这样一来概率就会大很多
同时,被检测程序如果仍然在保持更新,你也要跟着一起更新,以确保每个版本都能被准确检测到
检测与过检测一直都在相互对抗,没有万无一失的方法,要灵活应用!
|
|