第四课 用关键字检测OD
第四课 用关键字检测OD在OD调试器里有StrongOD,ODbgScript,单步步入,单步步过等关键字
我们可以利用这个特征来实现调试器检测,这个方法同样适用于检测CE
给出源码
.版本 2
.子程序 特征字检测OD, 逻辑型
.局部变量 句柄数组, 窗口句柄类, , "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”
'以上是大致的特征字,你自己可以根据现在公开的各种魔改CE来进行添加特征字
特征分割 = 分割文本 (特征字节集, , )
标题标记 = “Breakpoints” ‘设置了一个特定的窗口标题标记,用于后续的窗口标题匹配。
.计次循环首 (枚举窗口_强力 (句柄数组), x) ’使用 枚举窗口_强力 函数枚举系统中的所有窗口,并将窗口句柄存储在 句柄数组 中。
.计次循环首 (枚举所有子窗口_强力 (句柄数组 .句柄, 子数组, , ), 子计次) '枚举子窗口
.如果真 (子数组 [子计次].标题 = 标题标记)
返回 (真)
.如果真结束
’开始检测特征字
.计次循环尾 ()
菜单句柄 = API_取菜单 (句柄数组 .句柄)
.如果真 (菜单句柄 > 0)
菜单数量 = API_取条目数量 (菜单句柄)
.如果真 (菜单数量 > 0)
.计次循环首 (菜单数量, xxx)
子菜单句柄 = API_取子菜单句柄 (菜单句柄, xxx - 1)
子菜单子数量 = API_取条目数量 (子菜单句柄)
.如果真 (子菜单句柄 > 0 且 子菜单子数量 > 0)
.计次循环首 (子菜单子数量, xxxxxx)
名字 = 取空白文本 (200)
文本长度 = API_取条目字串 (子菜单句柄, xxxxxx - 1, 名字, 200, 1024)
.如果真 (文本长度 > 0)
.计次循环首 (取数组成员数 (特征分割), YYYYY)
.如果真 (寻找文本 (名字, 特征分割 , , 真) ≠ -1)
返回 (真)
.如果真结束
.计次循环尾 ()
.如果真结束
.计次循环尾 ()
.如果真结束
.计次循环尾 ()
.如果真结束
.如果真结束
.计次循环尾 ()
返回 (假)
运用这样一层检测,可以轻松检测到驱动ce,魔改ce
.版本 2
.子程序 枚举窗口_强力, 整数型
.参数 保存数组, 窗口句柄类, 参考 可空 数组
.参数 只找可见窗口, 逻辑型, 可空
.参数 句柄保存数组, 整数型, 参考 可空 数组
.局部变量 句柄数组, 整数型, , "0"
.局部变量 句柄, 整数型
.局部变量 临时, 窗口句柄类
.局部变量 x, 整数型
清除数组 (保存数组)
清除数组 (句柄保存数组)
句柄 = GetWindow (API_取屏幕句柄 (), 5)
.判断循环首 (句柄 ≠ 0)
.如果 (只找可见窗口)
.如果真 (窗口是否可见 (句柄))
加入成员 (句柄数组, 句柄)
.如果真结束
.否则
加入成员 (句柄数组, 句柄)
.如果结束
句柄 = GetWindow (句柄, 2)
.判断循环尾 ()
.计次循环首 (取数组成员数 (句柄数组), x)
临时.句柄 = 句柄数组
临时.标题 = 窗口取标题 (句柄数组 )
临时.类名 = 窗口取类名 (句柄数组 )
.如果真 (是否为空 (句柄保存数组) = 假)
加入成员 (句柄保存数组, 临时.句柄)
.如果真结束
加入成员 (保存数组, 临时)
.计次循环尾 ()
返回 (取数组成员数 (保存数组))
.子程序 窗口取类名, 文本型
.参数 窗口句柄, 整数型
.局部变量 buffer, 文本型
buffer = 取空白文本 (255)
GetClassName (窗口句柄, buffer, 255)
返回 (buffer)
.子程序 窗口取标题, 文本型
.参数 hWnd, 整数型
.局部变量 String, 文本型, , , 返回的文本内容
.局部变量 nLength, 整数型
nLength = GetWindowTextLength (hWnd)
String = 取空白文本 (nLength)
GetWindowText (hWnd, String, nLength + 1)
返回 (String)
.子程序 窗口是否可见, 逻辑型, , 返回真为可见,否则为不可见
.参数 窗口句柄, 整数型, , 窗口句柄
.局部变量 a, 逻辑型
返回 (IsWindowVisible (窗口句柄))
.子程序 枚举所有子窗口_强力, 整数型
.参数 父窗口句柄, 整数型
.参数 保存数组, 窗口句柄类, 参考 可空 数组
.参数 只找可见窗口, 逻辑型, 可空
.参数 句柄保存数组, 整数型, 参考 可空 数组
.局部变量 句柄, 整数型
.局部变量 句柄数组, 整数型, , "0"
.局部变量 x, 整数型
.局部变量 临时, 窗口句柄类
.局部变量 需要整理, 逻辑型
句柄 = GetWindow (父窗口句柄, 5)
.判断循环首 (句柄 ≠ 0)
.如果 (只找可见窗口)
.如果真 (窗口是否可见 (句柄))
加入成员 (句柄数组, 句柄)
.如果真结束
.否则
加入成员 (句柄数组, 句柄)
.如果结束
递归 (句柄, 句柄数组, 只找可见窗口)
句柄 = GetWindow (句柄, 2)
.判断循环尾 ()
.如果真 (是否为空 (保存数组) = 假)
清除数组 (保存数组)
.计次循环首 (取数组成员数 (句柄数组), x)
临时.句柄 = 句柄数组
临时.标题 = 窗口取标题 (句柄数组 )
临时.类名 = 窗口取类名 (句柄数组 )
加入成员 (保存数组, 临时)
.计次循环尾 ()
.如果真结束
.如果真 (是否为空 (句柄保存数组) = 假)
清除数组 (句柄保存数组)
.计次循环首 (取数组成员数 (句柄数组), x)
加入成员 (句柄保存数组, 句柄数组 )
.计次循环尾 ()
.如果真结束
返回 (取数组成员数 (句柄数组))
.子程序 递归
.参数 父窗口, 整数型
.参数 句柄数组, 整数型, 参考 数组
.参数 只找可见窗口, 逻辑型, 可空
.局部变量 句柄, 整数型
句柄 = GetWindow (父窗口, 5)
.判断循环首 (句柄 ≠ 0)
.如果 (只找可见窗口)
.如果真 (窗口是否可见 (句柄))
加入成员 (句柄数组, 句柄)
.如果真结束
.否则
加入成员 (句柄数组, 句柄)
.如果结束
递归 (句柄, 句柄数组)
句柄 = GetWindow (句柄, 2)
.判断循环尾 ()
引用的API
.版本 2
.DLL命令 API_取菜单, 整数型, "user32", "GetMenu", , 取得窗口中一个菜单的句柄依附于指定窗口的一个菜单的句柄(如果有菜单);否则返回零
.参数 窗口句柄, 整数型, , 窗口句柄。对于vb,这应该是一个窗体句柄。注意可能不是子窗口的句柄;
.DLL命令 API_取条目数量, 整数型, "user32", "GetMenuItemCount", , 返回菜单中条目(菜单项)的数量菜单中的条目数量;-1意味着出错。会设置GetLastError
.参数 菜单句柄, 整数型, , 目标菜单的句柄;
.DLL命令 API_取子菜单句柄, 整数型, "user32", "GetSubMenu", , 取得一个弹出式菜单的句柄,它位于菜单中指定的位置位于指定位置的弹出式菜单的句柄(如果有的话);否则返回零
.参数 菜单句柄, 整数型, , 菜单的句柄
.参数 位置, 整数型, , 条目在菜单中的位置。第一个条目的编号为0;
.DLL命令 API_取条目字串, 整数型, "user32", "GetMenuStringA", , 取得指定菜单条目的字串在lpString中返回的字串的长度(不包括空中止字符)。零意味着出错
.参数 菜单句柄, 整数型, , 菜单句柄
.参数 条目位置, 整数型, , 欲接收的菜单条目的标识符。如果在wFlags参数中设置了MF_BYCOMMAND标志,这个参数就用于指定要改变的菜单条目的命令ID。如果设置的是MF_BYPOSITION标志,这个参数就用于指定条目在菜单中的位置(第一个条目的位置为0)
.参数 缓冲区, 文本型, , 指定一个预先定义好的字串缓冲区,以便为菜单条目装载字串
.参数 缓冲区长度, 整数型, , 载入lp缓冲区中的最大字符数量+1
.参数 标志, 整数型, , 常数MF_BYCOMMAND或MF_BYPOSITION,取决于wID参数的设置;
页:
[1]