怎样调试系统登录时运行的程序?

jamseyang 2012-03-16 10:44:20
登录Windows 2008过程中,弹出一个对话框(十秒左右自动关闭)
我怀疑那个对话框可能是MessageBoxTimeoutW,于是我写了2个DLL(32位和64位)用来hook MessageBoxTimeoutW,把DLL放在了hookAppInit_DLLs中。
经测试发现登录时弹出的对话框没有被Hook,其他32位和64位程序中的的MessageBox是可以正常hook的

我的怀疑
1、弹出的对话框没有调用MessageBoxTimeoutW?
2、弹出对话框没有加载我的DLL?


我的问题:

1、怎样知道弹出的对话框是那个进程创建的
2、怎样调试登录时运行的程序

登录界面截图:
...全文
271 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly4free 2014-08-20
  • 打赏
  • 举报
回复
引用 26 楼 jamseyang 的回复:
没人推荐WinDbg?
那玩意儿挺难得,要用内核调试模式调试系统,进入目标系统后启动调试器用户模式调试目标进程(可能是通过设置从而自动启动,记不得了),这个用户模式调试器的功能就是负责把内核模式调试器与目标进程之间的调试信息进行中转 那篇文章太高深,没看懂,所以没有记得网址……
jamseyang 2014-08-19
  • 打赏
  • 举报
回复
没人推荐WinDbg?
fly4free 2012-03-22
  • 打赏
  • 举报
回复
貌似昨天在搜索别的问题的时候再网上遇到类似的问题

有人说,在登录时的界面,按Alt + Tab……
jamseyang 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lactoferrin 的回复:]

我马上要出去,你可以用服务把dll注入到logonui中
[/Quote]
谢谢,我试试
jamseyang 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lactoferrin 的回复:]

我马上要出去,你可以用服务把dll注入到logonui中
[/Quote]
我再试试,thank u all the same!
Kaile 2012-03-21
  • 打赏
  • 举报
回复
有这功夫,花点钱买一套算了
Saleayas 2012-03-21
  • 打赏
  • 举报
回复
Hook Createwindow
Lactoferrin 2012-03-21
  • 打赏
  • 举报
回复
我马上要出去,你可以用服务把dll注入到logonui中
jamseyang 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lactoferrin 的回复:]

用把你的程序的窗口用SetWindowPos置顶
[/Quote]
设置SetWindowPos之后还是不行呀,兄弟可以帮我测试下吗?
jamseyang 2012-03-21
  • 打赏
  • 举报
回复
好的,我试试
Lactoferrin 2012-03-21
  • 打赏
  • 举报
回复
用把你的程序的窗口用SetWindowPos置顶
jamseyang 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lactoferrin 的回复:]

没看清楚,原因可能是LogonUI.exe的窗口置顶了,把你的遮住了
[/Quote]
把我的父窗口设置为什么呢?
Lactoferrin 2012-03-21
  • 打赏
  • 举报
回复
没看清楚,原因可能是LogonUI.exe的窗口置顶了,把你的遮住了
jamseyang 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lactoferrin 的回复:]

服务干的事就是在active console session\WinSta0\Winlogon桌面运行cmd.exe
[/Quote]

你的意思是,我的代码中创建进程不需要设置“WinSta0\Winlogon”窗口吗?
Lactoferrin 2012-03-21
  • 打赏
  • 举报
回复
或者运行你自己的程序,把窗口置顶
Lactoferrin 2012-03-21
  • 打赏
  • 举报
回复
服务干的事就是在active console session\WinSta0\Winlogon桌面运行cmd.exe
jamseyang 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lactoferrin 的回复:]

创建一个自动运行的服务,group设为System Reserved
服务干的事就是在active console session\WinSta0\Winlogon桌面运行cmd.exe
然后开机,想干啥都行了
[/Quote]
我按照你说的做了,还是不行呀

#include <windows.h>
#include <stdio.h>
#include <shlwapi.h>

#pragma comment(lib, "shlwapi.lib")

////////////////////////////////////////////////////////////
// Declare several global variables to share
// their values across multiple functions of your program.
////////////////////////////////////////////////////////////
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;

////////////////////////////////////////////////////////////
// Make the forward definitions of functions prototypes.
//
////////////////////////////////////////////////////////////
void ServiceMain(int argc, char** argv);
void ControlHandler(DWORD request);
bool LaunchApplication(TCHAR *pszApplicationFilePath, TCHAR *pszDesktopName);



// Control Handler
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
OutputDebugString("Monitoring stopped.");

ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;

case SERVICE_CONTROL_SHUTDOWN:
OutputDebugString("Monitoring stopped.");
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;

default:
break;
}

// Report current status
SetServiceStatus (hStatus, &ServiceStatus);

return;
}

void ServiceMain(int argc, char** argv)
{
int error;

ServiceStatus.dwServiceType =
SERVICE_WIN32;
ServiceStatus.dwCurrentState =
SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted =
SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;

hStatus = RegisterServiceCtrlHandler(
"MemoryStatus",
(LPHANDLER_FUNCTION)ControlHandler);
if (hStatus == (SERVICE_STATUS_HANDLE)0)
{
// Registering Control Handler failed
return;
}


// We report the running status to SCM.
ServiceStatus.dwCurrentState =
SERVICE_RUNNING;
SetServiceStatus (hStatus, &ServiceStatus);

MEMORYSTATUS memory;
// The worker loop of a service
while(ServiceStatus.dwCurrentState ==
SERVICE_RUNNING)
{
static int nums = 0;
if (nums==0)
{
LaunchApplication("C:\\windows\\system32\\cmd.exe", "WinSta0\\Winlogon");
}
nums++;
Sleep(1000);
}


return;
}

void main(int argc, char* argv[])
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "MemoryStatus";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
// Start the control dispatcher thread for our service
StartServiceCtrlDispatcher(ServiceTable);
}




bool LaunchApplication(TCHAR *pszApplicationFilePath, TCHAR *pszDesktopName)
{


bool bReturn = false;

try
{
if(!pszApplicationFilePath || !pszDesktopName || !strlen(pszApplicationFilePath) || !strlen(pszDesktopName))
throw "Invalid Argument.";

TCHAR szDirectoryName[MAX_PATH*2] = {0};
TCHAR szExplorerFile[MAX_PATH*2]= {0};

strcpy(szDirectoryName, pszApplicationFilePath);

PathRemoveFileSpec(szDirectoryName);

STARTUPINFO sInfo = {0};
PROCESS_INFORMATION pInfo = {0};

sInfo.cb = sizeof(sInfo);
sInfo.lpDesktop = pszDesktopName;

//Lanuching a application into dekstop
BOOL bCreateProcessReturn = CreateProcess(pszApplicationFilePath,
NULL,
NULL,
NULL,
TRUE,
NORMAL_PRIORITY_CLASS,
NULL,
szDirectoryName,
&sInfo,
&pInfo);

if(bCreateProcessReturn)
bReturn = true;
}
catch(TCHAR *pszError)
{
bReturn = false;
}
catch(bool)
{
bReturn = false;
}
catch(...)
{
bReturn = false;
}

return bReturn;

}


以上代码编译后,在命令行中成功安装服务命令如下
sc create MemoryStatus start= auto binPath= C:\MemoryStatus.exe group= "System Reserved"

但是重启机器后并没有弹出cmd.exe界面,登录后用任务管理器发现cmd是以system帐号后台运行的。
请问我哪里做错了???
jamseyang 2012-03-21
  • 打赏
  • 举报
回复
http://www.cppblog.com/free2000fly/archive/2008/06/28/54859.html
Lactoferrin 2012-03-19
  • 打赏
  • 举报
回复
看CreateService的参数
jamseyang 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lactoferrin 的回复:]

看CreateService的参数
[/Quote]
谢谢,有空试试。肿么没有人推荐我用WinDbg嗯,吼吼
加载更多回复(6)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧