Q:请教OD中:ecx指向”abcdefghigklmn”这个字符串的条件断点如何下?
A:ecx==”abcdefghigklmn”

Q:我想断:CreateFileA 条件是文件名字为 “abcdefghigklmn”,我在CreateFileA上Shift-F4或Shift-F2设定条件,都不起作用。我用的不对?能否详细解说一下?谢谢!
A:如果是CreateFileA,你可以在命令行中这样下条件断点:
bp CreateFileA,[[STRING [esp+4]]]==”abcdefghigklmn”
若按 OllyDBG 中的帮助文档上说的,应该是
bp CreateFileA,[STRING [esp+4]]==”abcdefghigklmn”

bp CreateFileA,[[esp+4]]==”abcdefghigklmn”
但我测试过如果按 OD 帮助文档中所说的下条件断点的话,断不下来。原因尚不清楚,等有空再来测试看看。
首先我们看一下 CreateFileA 在 MSDN 中的解释:
HANDLE CreateFile(
LPCTSTR lpFileName,          // pointer to name of the file
DWORD dwDesiredAccess,       // access (read-write) mode
DWORD dwShareMode,           // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
// pointer to security attributes
DWORD dwCreationDisposition,  // how to create
DWORD dwFlagsAndAttributes,  // file attributes
HANDLE hTemplateFile         // handle to file with attributes to
// copy
);
从上面我们可以看出第一个参数就是文件名指针,也就是说这个参数中存放的就是文件名称的地址。在32位程序中调用这个函数时这个参数的堆栈地址就应该是 esp+4(4×8=32),同理,下一个参数就应该是esp+8。其它类推,返回值是esp+0。我们现在要判断文件名,这里的文件名就是esp+4地址所指向的地址中的内容。取地址中的内容在OD中用双方括号来操作,如取esp+4中的内容就该写成这样:[esp+4]。现在我们取的[esp+4]中的内容还是个地址,所以要得到文件名则还要再取这个地址中的内容,就该这样:[[esp+4]]。而那个STRING前缀在OD中的解释是以零作为结尾的 ASCII字符串。所以我们下条件断点时这样写:
bp CreateFileA,[STRING [esp+4]]==”abcdefghigklmn”
但却发现断不下来,写成这样:
bp CreateFileA,[[STRING [esp+4]]]==”abcdefghigklmn”
才能断下来,这里就应该是三层的地址了。为什么这样目前尚不清楚,等我以后有空写第六篇条件断点时我会再详细解释一下。