|
一、反调试
为了保护自己的程序,现在很多程序都加入了反调试,那么,有什么简单的方法来进行调试检测么?
在程序启动后,会有一个STARTUPINFO的结构体变量,来保存程序启动的信息,我们通过其中参数的改变来检测程序是正常运行还是在调试器中运行的。
在一般情况下,程序是由explorer.exe调用的(如果对此有疑问,你可以安装一个hips来了解下,例如:2012/4/17 星期二 15:23:42 c:\windows\explorer.exe 创建新进程 d:\program files\屏幕录像专家\屏录专家.exe 允许 [应用程序]* 命令行: "D:\Program Files\屏幕录像专家\屏录专家.exe" ),具体就是explorer.exe使用shell32中的ShellExecute来运行程序,而ShellExecute会在执行时清除不使用的值。而如果程序是由OD调用的话,会对STARTUPINFO结构体中的dwFlags 进行修改。
好,下面我们先来具体看看STARTUPINFO结构体的情况:
1 typedef struct _STARTUPINFOW {
2 DWORD cb;
3 LPWSTR lpReserved;
4 LPWSTR lpDesktop;
5 LPWSTR lpTitle;
6 DWORD dwX;
7 DWORD dwY;
8 DWORD dwXSize;
9 DWORD dwYSize;
10 DWORD dwXCountChars;
11 DWORD dwYCountChars;
12 DWORD dwFillAttribute;
13 DWORD dwFlags;
14 WORD wShowWindow;
15 WORD cbReserved2;
16 LPBYTE lpReserved2;
17 HANDLE hStdInput;
18 HANDLE hStdOutput;
19 HANDLE hStdError;
20 } STARTUPINFOW, *LPSTARTUPINFOW;
其中的参数很多,不过我们只关心DWORD类型的变量。
要想弄懂问题,我们就先来看看代码吧。
|