本文主要讲服务的调试。
标准的微软的方法是:
http://support.microsoft.com/kb/824344/zh-cn
注释:这个办法有的地方不适宜windows 7和windows server 2008.
一、附加法调试已经启动的进程
1、通过任务管理器或tlist.exe(WinDBG中的一个命令行工具:C:\Program Files\Debugging Tools for Windows
)命令查看调试进程的PID;
2、启动调试器附加进程,方法:
1)运行命令行,进入WinDbg调试器目录,运行:WinDBG -p ProcessID /g 附加到进程PID
2)运行命令行,进入WinDbg调试器目录,运行:WinDBG -pn ImageName /g 附加到进程名
3)运行命令行,进入WinDbg调试器目录,运行:WinDBG /g 启动调试器,然后在文件菜单中选择附加到进程,选择要调试的进程名。
二、在服务启动时用WinDBG附加
1、设置要调试的服务进程名,方法:
1)使用WinDBG的全局标志设置命令gflags.exe设置,在对话框中的Image File设置要调试 的服务名称,Debugger选择设置调试器的路径;
2)使用注册表编辑器,打开注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options ,添加一个主键,名称为要调试的服务名称,如 MyService.exe,在该主键下再新建一个字符串值,名称为“Debugger”,值为调试器路径;
2、设置要调试的服务与桌面交互,方法:
1)打开“管理工具”,选择“服务”,打开服务管理窗口,选择准备调试的服务名,右击选择“属性”,选择“登录”,勾选“允许服务与桌面交互”;
2)使用注册表编辑器,打开注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \ServiceName(要调试的服务名),选择“Type”,修改其值为:原值 OR 0×00000100(如原值为:0×00000010 OR 0×00000100 =0×00000110);
3、设置服务启动超时时间(系统默认为30秒),启动注册表编辑器,打开注册表路径:HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control,新建DWORD值“ServicesPipeTimeout”,其值为欲设置的超时时间,如设置 24小时,则值为86400000毫秒;
4、启动服务准备调试,打开“管理工具”,选择“服务”,打开服务管理窗口,选择准备调试的服务名,右击选择“启动”
windows 7和windows server 2008的服务调试心得,不敢说是秘籍:(操作系统和服务不限32位和64位)
首先:1.如果没有开启UI0Detect服务,建议开启,2.还有服务的超时时间设置长点,3.再有设置服务为可交互的。
其次在服务的入口,不是程序的入口加入消息框,这样在服务启动的时候能断下来。
第三步是用调试器附加。
第四步是,如果有消息框,进入"交互式服务检测"窗口,点击消息,注意消息框的下面要设置断点。
如果没有开启UI0Detect服务,而在服务的入口下个断点(类似int3),是会死机的(2008会,win7不会)。
这个办法是类似的,变相的调试服务启动,非附加,但用的是附加的办法。
困惑了好久,才解决,才成功。
2012年11月24日星期六
ntsd
ntsd.exe是系统自带的,大家都知道用它来结束进程,
它还有一个功能是显示cpu的信息,可惜这个用法我忘记了(要操作寄存器,是自动的)。
还有一个是添加后门。
ntsd的生成dump文件的方式为: ntsd -pv -p $PID -c ".dump /mf d:\aaa.dmp"。
或者,先是ntsd -pv -p $PID进入交互式命令提示,然后再输入.dump /mf d:\aaa.dmp
其中$PID,是进程的PID。 可惜,win 7不自带了。
或者,先是ntsd -pv -p $PID进入交互式命令提示,然后再输入.dump /mf d:\aaa.dmp
其中$PID,是进程的PID。 可惜,win 7不自带了。
FindFirstUrlCacheEntryEx.Cpp
/*
本文摘自:Microsoft SDKs\Windows\v7.1\Samples\web\Wininet\CacheEnumerate工程。
还有GetUrlCacheEntryInfo,FindFirstUrlCacheGroup,DeleteUrlCacheGroup,FindNextUrlCacheGroup等函数的用法,以后补上。
*/
#include <windows.h>
#include <Wininet.h>
#pragma comment(lib, "Wininet.lib")
VOID EnumerateCache(wchar_t * szUrlSearchPattern)
{
//这个函数有所改动,但大的结构没有改变。
DWORD dwErr = 0;
DWORD cbCacheInfoSize = 0;
LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo = NULL;
HANDLE hEnum = NULL;
hEnum = FindFirstUrlCacheEntryEx(szUrlSearchPattern, 0, URLCACHE_FIND_DEFAULT_FILTER, 0, NULL, &cbCacheInfoSize, NULL, NULL, NULL);
if (!hEnum)
{
dwErr = GetLastError();
switch (dwErr)
{
case ERROR_NO_MORE_ITEMS:
wprintf(L"There are no more entries.\n");//没有东西,这很少发生。
goto cleanup;
case ERROR_INSUFFICIENT_BUFFER:
lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO) malloc(cbCacheInfoSize);
if (!lpCacheEntryInfo) {
goto cleanup;
}
ZeroMemory(lpCacheEntryInfo, sizeof(INTERNET_CACHE_ENTRY_INFO));// zero memory the structure
lpCacheEntryInfo->dwStructSize = cbCacheInfoSize;
break;
default://其他的默认都为失败处理。
goto cleanup;
}
}
hEnum = FindFirstUrlCacheEntryEx(szUrlSearchPattern, 0, URLCACHE_FIND_DEFAULT_FILTER, 0, lpCacheEntryInfo, &cbCacheInfoSize, NULL, NULL, NULL);
if (!hEnum) {
goto cleanup;
}
BOOL bDone = FALSE;
do
{
if (lpCacheEntryInfo->lpszSourceUrlName)
{
wprintf(L"URL is: %s\n\r", lpCacheEntryInfo->lpszSourceUrlName); //The cache entry's source
if (lpCacheEntryInfo->lpszLocalFileName)
{
wprintf(L"file is: %s\n\r", lpCacheEntryInfo->lpszLocalFileName);
}
else
{
wprintf(L"file is:not found\n");
}
//还有更多的内容可现实,类型,上次修改时间,过期时间,上次访问时间,结果,大小等。
wprintf(L"\n");
}
BOOL bRet = FALSE;
bRet = FindNextUrlCacheEntryEx(hEnum, lpCacheEntryInfo, &cbCacheInfoSize, NULL, NULL, NULL);
if (!bRet)
{
dwErr = GetLastError();
switch (dwErr)
{
case ERROR_NO_MORE_ITEMS:
wprintf(L"There are no more entries.\n"); //结束。
bDone = TRUE;
break;
case ERROR_INSUFFICIENT_BUFFER:
free(lpCacheEntryInfo);
lpCacheEntryInfo = (LPINTERNET_CACHE_ENTRY_INFO) malloc(cbCacheInfoSize);
if (!lpCacheEntryInfo) {
goto cleanup;
}
ZeroMemory(lpCacheEntryInfo, sizeof(INTERNET_CACHE_ENTRY_INFO));
lpCacheEntryInfo->dwStructSize = cbCacheInfoSize;
continue;
default:
goto cleanup;
}
}
}
while (!bDone);
cleanup:
if (lpCacheEntryInfo) {
free(lpCacheEntryInfo);
}
if (hEnum) {
FindCloseUrlCache(hEnum);
}
}
int main( int argc, char * argv[])
{
//这个包含全部。
EnumerateCache(0);
wprintf(L"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
wprintf(L"\n");
//这个只包含:visited
EnumerateCache(L"visited:");//这个可能在内存中,没有对应的文件。
wprintf(L"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
wprintf(L"\n");
//这个只包含:cookie
EnumerateCache(L"cookie:" );
wprintf(L"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\");
wprintf(L"\n");
//这个除了visited和cookie的剩下来的,都包含。空的应该也不会包含。
EnumerateCache(L"");
return 0 ;
}
订阅:
博文 (Atom)