首页
社区
课程
招聘
是否有办法不调用OpenProcess就可以直接得到句柄?
发表于: 2009-4-22 20:42 10123

是否有办法不调用OpenProcess就可以直接得到句柄?

2009-4-22 20:42
10123
想请问下,我想得到某个进程的句柄,是否除了调用函数来得到,还有其他方法吗?

比如在R0的某个结构体里有,或者哪段内存里可以找到吗?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
可以从其他进程内DuplicateHandle
2009-4-22 21:07
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
参考LzOpenProcess
2009-4-22 22:14
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢2位..

我看了下DuplicateHandle.
这个函数是不是复制句柄的意思呢?
没用过不怎么懂,baidu了一下,没怎么看明白这函数的意思!
2009-4-23 00:23
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
简单说就是从csrss.exe中复制句柄~~
2009-4-23 06:42
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
用上了google学习大法

转]一段精巧的代码~~ring3文件占坑大法
#include <windows.h>

BOOL OccupyFile( LPCTSTR lpFileName );

int main()
{
    OccupyFile("c:\\aaa111.txt");

    return 0;
}

void RaiseToDebugP()
{
    HANDLE hToken;
    HANDLE hProcess = GetCurrentProcess();
    if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
    {
        TOKEN_PRIVILEGES tkp;
        if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
        {
            tkp.PrivilegeCount = 1;
            tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            
            BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
        }
        CloseHandle(hToken);
    }   
}

BOOL OccupyFile( LPCTSTR lpFileName )
{
    BOOL    bRet;
   
    RaiseToDebugP();

    HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);    // 4为system进程号

    if ( hProcess == NULL )
    {
        hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);        // 2K下是 8??
        
        if ( hProcess == NULL )
            return FALSE;
    }

    HANDLE hFile;
    HANDLE hTargetHandle;

    hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);   

    if ( hFile == INVALID_HANDLE_VALUE )
    {
        CloseHandle( hProcess );
        return FALSE;
    }

    bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,
        0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);

    CloseHandle( hProcess );

    return bRet;
}

The DuplicateHandle function duplicates an object handle. The duplicate handle refers to the same object as the original handle.Therefore, any changes to the object are reflected through both handles.For example, the current file mark for a file handle is always the same for both handles.
BOOL DuplicateHandle(
  HANDLE hSourceProcessHandle,  // handle to source process
  HANDLE hSourceHandle,         // handle to duplicate
  HANDLE hTargetProcessHandle,  // handle to target process
  LPHANDLE lpTargetHandle,      // duplicate handle
  DWORD dwDesiredAccess,        // requested access
  BOOL bInheritHandle,          // handle inheritance option
  DWORD dwOptions               // optional actions
);
hTargetProcessHandle
Handle to the process that is to receive the duplicated handle. The handle must have PROCESS_DUP_HANDLE access.

==============

其实就是把该文件的句柄(真正的句柄)复制给了system进程。更详细的东西可以查看windows programming application。

==============

函数比较:

GetCurrentProcess():

GetCurrentProcess得到得到的称之为"伪句柄"
只是一个标识,你可以发现,其实就是返回$FFFFFFFF,
每个进程得句柄都是一样得,只是实用于进程内部得使用.
如果你想得到实际得句柄,在进程间进行通讯,必需要进行转化,
调用DuplicateHandle,注意,得实句柄使用完成以后,你必须要调用CloseHandle去关闭.
其实,你应该明白了为何"伪句柄"得存在,就是使用简单,不用关闭,
不会造成内存泄漏.

同样道理,GetCurrentThread也是伪句柄,其值永远是$FFFFFFFE,只是适用于线程内部得使用.

DuplicateHandle() :

在系统中,对象分两类:核心对象和用户对象.如进程对象,线程对象,文件映射
对象等就是核心对象;而向窗口,菜单等都是用户对象.
两者是有差别的,用于标示用户对象的句柄是系统唯一的,也就是说,一个进程
完全可以对另外一个进程中的用户对象进行操作,比如两个进程间通信的方法之一,
就是发送消息.正是由于窗口是用户对象,所以句柄是系统唯一,通过FindWindow(),
得到另外一个进程的窗口句柄,然后用SendMessage(),让hWnd的窗口过程来处理消
息,实现了进程间的通信.因此,对于用户对象,你根本不用DuplicateHandle(),直接
把句柄拿来用就行了.
而核心对象则不一样.核心对象是为了加强系统的稳定性,因此,核心对象句柄是
进程相关的,在每一个进程中都有一个核心对象表,每一个对象的索引(不完全是)作为内和对象的句柄,从而实现进程相关.同一个对象在不同的进程中可能有不同的索引,即句柄.对核心对象进行操作时,系统还要进行安全检验,看一下你是否有权来操作这个对象.因此你不能同用户对象一样,直接把句柄拿过来用.比方说,你想操作另一个进程中的文件映射对象,这个文件映射对象句柄在那个进程中假设是0x000001,但在你的进程中,很有可能0x00000001时表示另一个核心对象,此时的操作就永远不会成功,甚至会产生灾难性的后果.此时,就有必要用DuplicateHandle().

===========================================
问题:如果要抹掉句柄,该怎么做?因为听说有些防外挂就是采用这样的技术;
复制句柄到system进程后,会有什么情况发生?
2009-4-23 09:57
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
LZ说了,不要调用函数,所以你们都不符合
2009-4-23 09:58
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
复制句柄有一个用途是:若要得到一个线程的退出码,则可以用DuplicateHandle在创建此线程后来复制线程的句柄,这样在线程退出后,可以使用这个复制出来的线程句柄来得到原线程的退出码(因为这个时候原线程已经退出,他本身的句柄已经失效了,而这个复制出来的句柄却可以继续使用。)
2009-4-23 10:08
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼上的方法我都学习下看看...

其实我就是想关闭某写杀软,不想调OpenPro得到句柄,直接在驱动里关了他的进程而已.

因为他都有HOOK打开进程的,我有懒的去饶.所以想看看是不是有什么方法可以直接得到句柄关的.

之前看到某位大大的文章,好象是直接Un Ntdll就可以使进程关了?

那我可以直接在驱里直接卸一下他的模块就可以了?但是又得找到模块的地址.

真够麻烦.不知道有什么好的方法!
2009-4-23 13:39
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
10
unload ntdll也需要打开进程句柄

做木马的话还是省省吧
2009-4-23 13:43
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11
你早说上驱动嘛,都ring0了玩死杀软还不容易~
2009-4-23 13:45
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不是做木马,我也不会做木马呀,有看雪你们这样的大大在,还有我这样的资格来做木马不被你们笑话死呀!呵呵....

ZwUnmapViewOfSection

对啊,这函数也得要句柄,晕菜,有够麻烦的!!!

6楼说的挺详细的,学习下6楼的方法看看了!
2009-4-23 14:16
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我早说了是GOOGLE的,其实就想问个问题:

  问题:1. 如果要抹掉句柄,该怎么做?因为听说有些防外挂程序就是采用这样的技术;
        2. 复制句柄到system进程后,会有什么情况发生?
2009-4-24 09:35
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
14
虽说用了Google,但是好像没有用好。第一个问题:http://bbs.pediy.com/showthread.php?t=70269 第二个问题:这将造成该句柄引用的对象被System占用,在销毁该句柄之前用正常方法无法销毁对应的对象,比如那个文件占坑的例子。对应的解决方法就是关句柄了,也就是你的第一问。
2009-4-24 12:58
0
游客
登录 | 注册 方可回帖
返回
//