首页
社区
课程
招聘
[讨论]WIN7下NTOpenprocess被HOOK 导致的困惑
发表于: 2012-12-26 22:34 12926

[讨论]WIN7下NTOpenprocess被HOOK 导致的困惑

2012-12-26 22:34
12926
最近 遇到了一个非常让人困惑的问题,或者说难题吧
一般在XP下 WriteProcessMemory 只要先提权进程权限 获得进程ID然后NTOpenprocess打开进程获得 句柄 virtualqueryEx获得内存信息 VirtualProtectEx 处理下进程中内存区域的保护属性 接着WriteProcessMemory 写入内存最后VirtualProtectEx处理下进程中内存区域的保护属性 即可,但是 貌似这个方法在WIN7下用驱动操作都比较难,本来以为上驱动了么 直接按照这个思路就可以,但是不好意思,我用了 好几种编程语言都失败了,先是封装好的易模块,因为图简单,结果每次都失败了 蓝了很多次,接着用了VC还是失败了,最后我觉得自己 快不行了 ,每天都接受着煎熬,然后 把CE 5.6的代码看了下,逐步的调试 结果发现问题在NTOpenprocess返回的句柄权限不够,然后上CE论坛问了下Dark Byte提示 
OpenProces, VirtualQueryEx and Read/WriteProcessMemory are pointers to a function.
Newkernelhandler.pas decides where those pointers point to.

When using kernelmode openprocess, the OpenProcess call will go to the OpenProcess function implemented in dbk32functions.pas (in 5.x that's in dbk32.dll)
That function tells the dbk32.sys driver to obtain a handle to the process and return it to usermode.
If it fails to get a valid handle, dbk32functions will create a shadow handle that is only valid for the functions of dbk32 itself. (It's used to know the EProcess address of the process opened)
看来 我要写入到其他被NTOpenprocess HOOK的进程需要换个方式了 求大牛指点
下面是部分的代码,希望 有大牛出没。(提升权限 和获得进程ID就不写了 因为都没问题,需要的话我后面发)
procedure TForm1.btn1Click(Sender: TObject);
var
DllVersion : String;
begin
    UseDBKOpenProcess;// LoadDBK32;
    UseDBKReadWriteMemory; //  DBKReadWrite:=true;

    pid:=GetProcessID( 'war3.exe');
     if pid<>0 then
    begin
       lbl1.Caption:='pid'+inttostr(pid);

    end;
    game_dll_BaseAddr:=BEnumProcesses(pid,'Game.dll');
   if GetAppVersion(DllfullName)<>'' then
    begin
      DllVersion:=GetAppVersion(DllfullName);
      end;
        lbl4.Caption:=DllVersion;
     if DllVersion='1.24.4.6387'then
     begin
       hProcess := OpenProcess(PROCESS_ALL_ACCESS,false,pid);//
        lbl2.Caption:='hprocess'+inttostr(hProcess);
     if hProcess <> 0 then
      begin
    patch($356D9C, 3677601843,4);

        CloseHandle(hProcess);
      end;
     end;

procedure Patch(Address: Integer; Value, Size: Integer);
begin
  WriteMemory(address +  game_dll_BaseAddr,Value ,size );
end;


procedure WriteMemory(Address: Integer; intValue, size: Integer);
var
  buffer : ^Integer;
  null : THandle;
  original,oldPro : integer;
  mbi: TMemoryBasicInformation;
begin
  New(buffer);
  buffer^ := intValue;
  if hprocess<>0 then
  begin
    queryaddr:=virtualqueryEx(hProcess,pointer(address),mbi,sizeof(mbi));//just watch MemoryBasicInformation;
    memgetsucess:=VirtualProtectEx( hProcess,Pointer(Address),size, PAGE_EXECUTE_READWRITE,integer(mbi.Protect));// return false if NTopenprocess has been HOOK(r0) windows 7 (win32)
    sucess:=WriteProcessMemory(hprocess,Pointer(Address), buffer ,size , null);//
    memsetsucess:=VirtualProtectEx( hProcess,Pointer(Address),size, integer(mbi.Protect),original);  //
  end;
           if queryaddr=sizeof(mbi) then
        begin
           querysuc:=True;
        end else
        begin
           querysuc:=false;
        end;

  Dispose(buffer);
end; 

这个是我发在CE论坛的连接,因为被墙了,所以 要看帖子的话 请用VPN
http://forum.cheatengine.org/viewtopic.php?p=5438113#5438113

为了免得大家看的多了 头疼 我总结一句话就是  WIN7下 一个进程要写入一个被 HOOK NTOpenprocess 保护的进程的内存 有没有什么方法? 无论 R3 或者R0无论什么语言。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
直接绕过钩子。。。。。或者直接重载内核,用安全的函数。。。。。。哈哈哈哈。。。
2012-12-27 08:56
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
第一,其实没有被hook,只是右键以管理员权限运行,即可。

第二,就算ntopenprocess被hook了,win732位下,还有3种以上的方法获取process句柄,并非一定要openprocess~~~
2012-12-27 09:06
0
雪    币: 122
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
第一是把UAC设置过高的问题?
第二 被hook了,不知有哪三种方法
2012-12-27 11:29
0
雪    币: 6092
活跃值: (734)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
用的是右键以管理员权限运行啊。。。请教大哥指点下 用那3种办法。。。我感觉我真OUT了。这个3个方法获取的句柄可以在后面修改属性并且写入内存么? 求指点 谢谢了
2012-12-27 16:42
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
3L正解.......另外,ring3下还可以从csrss中复制句柄出来用....ring0下直接关掉内存保护然后attach到目标进程写就行了......
2012-12-27 16:43
0
雪    币: 6092
活跃值: (734)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
csrss可以进行对进程的调试 通过这个方式获得句柄对么,ring0下直接关掉内存保护 这个就是那段经典的 汇编是吧?然后通过 attach到目标进程 这个就是进行进程调试的方法对么?我有一些明白了 这个方法看起来不错。
2012-12-27 17:56
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
1.csrss是win32子系统进程,里面有所有用户态进程的句柄,并且句柄权限足够你用了
2.是的.
3.关掉内存保护以后,KeAttachProcess到目标进程,然后直接修改内存就可以了,记得修改之后KeDetachProcess
2012-12-28 05:07
0
雪    币: 6092
活跃值: (734)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
9
写到一半写不下去了 主要是不熟悉这个方面的
2012-12-30 16:56
0
雪    币: 6092
活跃值: (734)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
10
在论坛里面找到C++的原代码 不过要转成DELPHI,先发到这个帖子,以备后面需要的人
void RegularWayGetHandleFromCsrss()
{
	DWORD	CsrssPid;
	XXXZwQuerySystemInformation ZwQuerySystemInformation;
	char*	Buffer;
	DWORD	dwRet;
	DWORD	Index;
	DWORD	AllNum;
	PSYSTEM_HANDLE_INFORMATION	pHandleInfo;
	XXXZwQueryInformationProcess ZwQueryInformationProcess;
	HANDLE	hCsrssHandle;
	DWORD	CrackPid;
	HANDLE	hCrackProcess = INVALID_HANDLE_VALUE;

	CrackPid = GetPid();

	RaisePrivleges();
				
	ZwQueryInformationProcess = (XXXZwQueryInformationProcess)GetProcAddress( 
		GetModuleHandle("ntdll.dll"), "ZwQueryInformationProcess" );

	CsrssPid = GetCsrssPid();

	hCsrssHandle = OpenProcess( PROCESS_DUP_HANDLE, FALSE, CsrssPid);

	if ( hCsrssHandle == INVALID_HANDLE_VALUE )
		return;
	
	ZwQuerySystemInformation = (XXXZwQuerySystemInformation)GetProcAddress( 
		GetModuleHandle("ntdll.dll"), "ZwQuerySystemInformation" );
	
	Buffer = new char [0x100];
	
	ZwQuerySystemInformation( 16, Buffer, 0x100, &dwRet);
	
	delete Buffer;
	
	Buffer = new char [dwRet];
	
	ZwQuerySystemInformation( 16, Buffer, dwRet, &dwRet);
	
	pHandleInfo = (PSYSTEM_HANDLE_INFORMATION)( (DWORD)Buffer + 4 );
	
	AllNum = *(DWORD*)Buffer;

	for ( Index = 0; Index < AllNum; Index++,pHandleInfo++)
	{
		if ( pHandleInfo->ProcessId == CsrssPid && pHandleInfo->ObjectTypeNumber == 5 )
		{
			BOOL			bRet;
			HANDLE			CurrentHandle;	
			PROCESS_BASIC_INFORMATION	ProcessInfo;



			bRet = DuplicateHandle( hCsrssHandle, (HANDLE)pHandleInfo->Handle, GetCurrentProcess(), 
				&CurrentHandle, 0, FALSE, DUPLICATE_SAME_ACCESS);
				
			if ( bRet == FALSE )
			{

				continue;
			}

			bRet = ZwQueryInformationProcess( CurrentHandle, 0, 
				&ProcessInfo, sizeof(PROCESS_BASIC_INFORMATION), &dwRet);

			if ( bRet != 0 )
			{
				CloseHandle( CurrentHandle );
				continue;
			}

			if ( ProcessInfo.UniqueProcessId == CrackPid )
			{
				cout<<"find handle from csrss.exe..\n";
				hCrackProcess = CurrentHandle;
				break;
			}

			CloseHandle( CurrentHandle );
		}
	}
	
	delete Buffer;

	TerminateProcess( hCrackProcess, 0 );------这里获得需要的句柄稍微修改下变成写入即可。

	CloseHandle( hCrackProcess );

}

代码来自论坛的四个螳螂大牛。
2012-12-31 13:34
0
雪    币: 36
活跃值: (102)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
mark
2018-9-15 10:27
0
游客
登录 | 注册 方可回帖
返回
//