|
第四课 用关键字检测OD
在OD调试器里有StrongOD,ODbgScript,单步步入,单步步过等关键字
我们可以利用这个特征来实现调试器检测,这个方法同样适用于检测CE
给出源码
变量名 | 类 型 | 静态 | 数组 | 备 注 | 句柄数组 | 窗口句柄类 | | 0 | x | 整数型 | | | 菜单句柄 | 整数型 | | | 菜单数量 | 整数型 | | | xxx | 整数型 | | | 子菜单句柄 | 整数型 | | | 子菜单子数量 | 整数型 | | | 名字 | 文本型 | | | xxxxxx | 整数型 | | | 文本长度 | 整数型 | | | 启动时间 | 整数型 | | | 特征分割 | 文本型 | | 0 | 特征字节集 | 文本型 | | | YYYYY | 整数型 | | | 子数组 | 窗口句柄类 | | 0 | 子计次 | 整数型 | | | 标题标记 | 文本型 | | |
特征字节集 = “StrongOD,ODbgScript,ODDragAttach,OllyMachine,单步步入,单步步过,自动步入,自动步过,执行到返回,硬件断点,跟踪步入,跟踪步过,断点,调用堆栈,SEH 链,RUN 跟踪,实时调试设置,Step &into,Step &over,Animate into,Animate over,Execute till return,Debugging &options,&Just-in-time debugging,Select A&PI help file,SEH chain,Call stac&k,&Breakpoints,Ru&n trace,内存断点,可执行模块,运行跟踪,INT3 断点,重新开始(&S),&Attach,VEH/SEH chain,INT3 &breakpoints,Call DLL export Alt+F6,Run thread F11,Set condition... Ctrl+T,&Options... Alt+O,Stop hit trace,Run hit trace,Execute till return Ctrl+F9” 特征分割 = 分割文本 (特征字节集, , )标题标记 = “Breakpoints” ‘设置了一个特定的窗口标题标记,用于后续的窗口标题匹配。 计次循环首 (枚举窗口_强力 (句柄数组 ), x ) ’使用 枚举窗口_强力 函数枚举系统中的所有窗口,并将窗口句柄存储在 句柄数组 中。  计次循环首 (枚举所有子窗口_强力 (句柄数组 [x ].句柄, 子数组, , ), 子计次 )   如果真 (子数组 [子计次 ].标题 = 标题标记 )  返回 (真)’开始检测特征字 计次循环尾 () 菜单句柄 = API_取菜单 (句柄数组 [x ].句柄 ) 如果真 (菜单句柄 > 0 )  菜单数量 = API_取条目数量 (菜单句柄 )  如果真 (菜单数量 > 0 )   计次循环首 (菜单数量, xxx )    子菜单句柄 = API_取子菜单句柄 (菜单句柄, xxx - 1 )    子菜单子数量 = API_取条目数量 (子菜单句柄 )    如果真 (子菜单句柄 > 0 且 子菜单子数量 > 0 )     计次循环首 (子菜单子数量, xxxxxx )      名字 = 取空白文本 (200 )      文本长度 = API_取条目字串 (子菜单句柄, xxxxxx - 1, 名字, 200, 1024 )      如果真 (文本长度 > 0 )       计次循环首 (取数组成员数 (特征分割 ), YYYYY )        如果真 (寻找文本 (名字, 特征分割 [YYYYY ], , 真) ≠ -1 )        返回 (真)                计次循环尾 ()            计次循环尾 ()        计次循环尾 ()     计次循环尾 ()返回 (假)
运用这样一层检测,可以轻松检测到驱动ce,魔改ce
|
枚举窗口_强力 | 整数型 | | |
保存数组 | 窗口句柄类 | √ | √ | √ | 只找可见窗口 | 逻辑型 | | √ | | 句柄保存数组 | 整数型 | √ | √ | √ |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 句柄数组 | 整数型 | | 0 | 句柄 | 整数型 | | | 临时 | 窗口句柄类 | | | x | 整数型 | | | 清除数组 (保存数组 )清除数组 (句柄保存数组 )句柄 = GetWindow (API_取屏幕句柄 (), 5 ) 判断循环首 (句柄 ≠ 0 ) 如果 (只找可见窗口 )  如果真 (窗口是否可见 (句柄 ))   加入成员 (句柄数组, 句柄 )    加入成员 (句柄数组, 句柄 ) 句柄 = GetWindow (句柄, 2) 判断循环尾 () 计次循环首 (取数组成员数 (句柄数组 ), x ) 临时.句柄 = 句柄数组 [x ] 临时.标题 = 窗口取标题 (句柄数组 [x ]) 临时.类名 = 窗口取类名 (句柄数组 [x ]) 如果真 (是否为空 (句柄保存数组 ) = 假) 加入成员 (句柄保存数组, 临时.句柄 ) 加入成员 (保存数组, 临时) 计次循环尾 ()返回 (取数组成员数 (保存数组 )) buffer = 取空白文本 (255 )GetClassName (窗口句柄, buffer, 255 )返回 (buffer )变量名 | 类 型 | 静态 | 数组 | 备 注 | String | 文本型 | | | nLength | 整数型 | | |
nLength = GetWindowTextLength (hWnd )String = 取空白文本 (nLength )GetWindowText (hWnd, String, nLength + 1 )返回 (String )返回 (IsWindowVisible (窗口句柄 )) |
枚举所有子窗口_强力 | 整数型 | | |
父窗口句柄 | 整数型 | | | | 保存数组 | 窗口句柄类 | √ | √ | √ | 只找可见窗口 | 逻辑型 | | √ | | 句柄保存数组 | 整数型 | √ | √ | √ |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 句柄 | 整数型 | | | 句柄数组 | 整数型 | | 0 | x | 整数型 | | | 临时 | 窗口句柄类 | | | 需要整理 | 逻辑型 | | |
句柄 = GetWindow (父窗口句柄, 5 ) 判断循环首 (句柄 ≠ 0 ) 如果 (只找可见窗口 )  如果真 (窗口是否可见 (句柄 ))   加入成员 (句柄数组, 句柄 )    加入成员 (句柄数组, 句柄 ) 递归 (句柄, 句柄数组, 只找可见窗口) 句柄 = GetWindow (句柄, 2 ) 判断循环尾 () 如果真 (是否为空 (保存数组 ) = 假) 清除数组 (保存数组 ) 计次循环首 (取数组成员数 (句柄数组 ), x )  临时.句柄 = 句柄数组 [x ]  临时.标题 = 窗口取标题 (句柄数组 [x ])  临时.类名 = 窗口取类名 (句柄数组 [x ]) 加入成员 (保存数组, 临时 ) 计次循环尾 () 如果真 (是否为空 (句柄保存数组 ) = 假) 清除数组 (句柄保存数组 ) 计次循环首 (取数组成员数 (句柄数组 ), x ) 加入成员 (句柄保存数组, 句柄数组 [x ]) 计次循环尾 ()返回 (取数组成员数 (句柄数组))|
递归 | | | |
父窗口 | 整数型 | | | | 句柄数组 | 整数型 | √ | | √ | 只找可见窗口 | 逻辑型 | | √ | |
句柄 = GetWindow (父窗口, 5 ) 判断循环首 (句柄 ≠ 0 ) 如果 (只找可见窗口 )  如果真 (窗口是否可见 (句柄 ))   加入成员 (句柄数组, 句柄 )    加入成员 (句柄数组, 句柄 ) 递归 (句柄, 句柄数组) 句柄 = GetWindow (句柄, 2 ) 判断循环尾 ()
引用的API
|
|