首页
社区
课程
招聘
[讨论]求教这个hook
发表于: 2015-10-22 16:45 3620

[讨论]求教这个hook

2015-10-22 16:45
3620
想做个简单的进程拦截 判断创建浏览器进程 是的话给他加个命令行跳到我的首页。但hook后,创建进程就闪退,感觉代码没啥问题啊,原因是什么呢?

typedef BOOL (_stdcall *MYCREATEPROCESS)(    LPCTSTR lpApplicationName,
      LPTSTR lpCommandLine,
         LPSECURITY_ATTRIBUTES lpProcessAttributes,
       LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
       LPVOID lpEnvironment,
        LPCTSTR lpCurrentDirectory,
         LPSTARTUPINFO lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation

);

//创建进程测试
void CHdllEXEDlg::OnBnClickedButton1()
{
	STARTUPINFO si = { sizeof(si) }; 
	PROCESS_INFORMATION pi; 

	si.dwFlags = STARTF_USESHOWWINDOW; 
	si.wShowWindow = TRUE; //TRUE表示显示创建的进程的窗口
	TCHAR cmdline[] =TEXT("c://program files//internet explorer//iexplore.exe c6bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4G2L8h3#2#2L8X3W2@1P5g2)9J5k6h3y4K6k6r3&6Q4x3X3g2F1k6i4c8Q4x3V1j5`.");
	BOOL bRet = ::CreateProcess ( 
		NULL,
		cmdline, //在Unicode版本中此参数不能为常量字符串,因为此参数会被修改	 
		NULL, 
		NULL, 
		FALSE, 
		CREATE_NEW_CONSOLE, 
		NULL, 
		NULL, 
		&si, 
		&pi); 
		::CloseHandle (pi.hThread); 
		::CloseHandle (pi.hProcess); 

}


//开始HOOK
void CHdllEXEDlg::OnBnClickedButton2()
{
	Start();
}


DWORD jmpto=0;

typedef BOOL (_stdcall *MYCREATEPROCESS)(LPCTSTR lpApplicationName,
										 LPTSTR lpCommandLine,
									     LPSECURITY_ATTRIBUTES lpProcessAttributes,
										 LPSECURITY_ATTRIBUTES lpThreadAttributes,
										 BOOL bInheritHandles,
										 DWORD dwCreationFlags,
										 LPVOID lpEnvironment,
										 LPCTSTR lpCurrentDirectory,
										 LPSTARTUPINFO lpStartupInfo,
										 LPPROCESS_INFORMATION lpProcessInformation);

PTCHAR cmdline =TEXT("c://program files//internet explorer//iexplore.exe 2c5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4G2L8h3#2#2L8X3W2@1P5g2)9J5k6h3y4K6k6r3c8Q4x3X3g2F1k6i4c8Q4x3V1j5`.");

__declspec(naked) BOOL HookedCreateProcess(LPCTSTR lpApplicationName,
										   LPTSTR lpCommandLine,
										   LPSECURITY_ATTRIBUTES lpProcessAttributes,
										   LPSECURITY_ATTRIBUTES lpThreadAttributes,
										   BOOL bInheritHandles,
										   DWORD dwCreationFlags,
										   LPVOID lpEnvironment,
										   LPCTSTR lpCurrentDirectory,
								           LPSTARTUPINFO lpStartupInfo,
									       LPPROCESS_INFORMATION lpProcessInformation)
{
	__asm
	{
		push eax
		push ebx
		mov eax,esp
		add eax,0x10
		mov ebx,cmdline
		mov [eax],ebx
		pop ebx
		pop eax
	}
	//cmdline=TEXT("c://program files//internet explorer//iexplore.exe 566K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4G2L8h3#2#2L8X3W2@1P5g2)9J5k6h3y4K6k6r3c8Q4x3X3g2F1k6i4c8Q4x3V1j5`.");

	_asm
	{
		mov edi,edi
		push ebp
		mov ebp,esp
		jmp jmpto
	}
	
}

void Start()
{
	HMODULE hm=GetModuleHandle(L"kernel32.dll");
    MYCREATEPROCESS RealCreateProcess=(MYCREATEPROCESS)GetProcAddress(hm,"CreateProcessW");
   
    DWORD oldpro=0;    
  
    VirtualProtect(RealCreateProcess,5,PAGE_EXECUTE_READWRITE,&oldpro); 
	jmpto=(DWORD)RealCreateProcess+5;
	DWORD value = (DWORD)HookedCreateProcess - (DWORD)RealCreateProcess - 5;
     __asm
	 {
		   pushad
           mov eax,RealCreateProcess
		   mov byte ptr[eax],0xe9
		   add eax,1
           mov ebx,value
		   mov dword ptr[eax],ebx
		   popad
	 }

	VirtualProtect(RealCreateProcess,5,oldpro,&oldpro);

}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
貌似是因为你全局的cmdline指向的是常量
因此CreateProcess失败了
2015-10-22 17:58
0
雪    币: 60
活跃值: (524)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
3
我不用cmdline直接赋值0也是不行
2015-10-22 18:48
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我试了下,就是我说的问题……
你直接赋值0,CreateProcess第一个参数又是null,如何启动程序。。
2015-10-22 19:11
0
雪    币: 60
活跃值: (524)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
5
不能用全局,难道我要在栈中自己构造字符串?这是不是太麻烦了。
2015-10-22 19:39
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
可以用全局……
比如改成TCHAR cmdline[] = L"iexplore.exe 227K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0";
或者TCHAR* cmdline = new TCHAR[xxx];
都行
只是前者要稍微改一下汇编代码
2015-10-22 20:10
0
雪    币: 60
活跃值: (524)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=yuchengton;1398464]可以用全局……
比如改成TCHAR cmdline[] = L"iexplore.exe ecdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0";
或者TCHAR* cmdline = new TCHAR[xxx];
都行
只是前者要稍微改一下汇编代码[/QUOTE]

我不就是第一种方法赋值的,也不是常量啊。
2015-10-22 20:25
0
雪    币: 60
活跃值: (524)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=yuchengton;1398464]可以用全局……
比如改成TCHAR cmdline[] = L"iexplore.exe b67K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0";
或者TCHAR* cmdline = new TCHAR[xxx];
都行
只是前者要稍微改一下汇编代码[/QUOTE]

我把PTCHAR cmdline =TEXT("c://program files//internet explorer//iexplore.exe 23aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0i4K6u0r3");
改为
TCHAR cmdline[] =TEXT("c://program files//internet explorer//iexplore.exe d76K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0i4K6u0r3");

下面的对应mov改为lea就好了,但我用OD调试的时候CMDline也复制成功了。但崩溃,很奇怪。
2015-10-22 20:36
0
游客
登录 | 注册 方可回帖
返回