首页
社区
课程
招聘
[求助]APIHOOK碰到问题
发表于: 2008-10-22 10:42 5505

[求助]APIHOOK碰到问题

2008-10-22 10:42
5505
进程通过使用CreateMutexA 来达到防止重复运行的问题,我想通过APIHOOK 来解决这个问题,使得进程可以重复运行,我用APIHOOK 钩到了 CreateMutexA ,然后直接Return NULL; 可是进程中的CreateMutexA 还是成功创建了互斥对象,好奇怪

HANDLE WINAPI CModuleScope::MyCreateMutexA(  LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitiaOwner,  LPCSTR lpName)
{
        char szBuffer[MAX_PATH];
        sprintf_s(szBuffer, "Process (%u%d) CreateMutex Now ! Let's Return NULL", ::GetCurrentProcessId(),u);
        LogMessage(szBuffer);
        return NULL;
       
}

api hook 是以SetWindowsHookEx来实现的,后来我尝试钩住进程的GetLastError() ,在我的钩子函数中直接SetLastError(0),结果还是不行。

请问各位大侠,用api hook 应该怎么做才能解决进程通过CreateMutexA 来防止重复运行的问题??

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
判断last error如果是 ERROR_ALREADY_EXISTS就改成ERROR_SUCCESS,但返回的句柄不应是NULL
2008-10-22 11:28
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不行啊
我的进程中CreateMutex 的代码是这样写的:
HANDLE   hMutex;   
hMutex   =   CreateMutex(NULL,   FALSE,   "TestAPP");     
       
if(GetLastError() == ERROR_ALREADY_EXISTS)   
{   
        MessageBox(NULL,"程序已经运行!","test",0);   
        return   FALSE;   
}     

我将HOOK截获的 LPCSTR lpName 打印出来发现,是 MSCTF.Shared.MUTEX.MCG ,并不是我传进去"TestApp" ,为什么回这样?
2008-10-22 11:40
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
所以你还要验证一下互斥体的名字,只拦截你关心的
2008-10-22 12:05
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
随手写点代码给你:
HANDLE MyCreateMutex(
                                         LPSECURITY_ATTRIBUTES lpMutexAttributes,
                                         BOOL bInitialOwner,
                                         LPCTSTR lpName
                                         )
{
        HANDLE hMutex=OldCreateMutex(lpMutexAttributes,bInitialOwner,lpName);
        if (!lstrcmp(lpName,"TestApp"))
        {
                if (ERROR_SUCCESS==GetLastError())//第一次调用则正常返回
                {
                        return hMutex;
                }
                if (ERROR_ALREADY_EXISTS==GetLastError())//第二次调用则仍然让它返回正常
                {
                        SetLastError(ERROR_SUCCESS);
                        return hMutex;
                }

        }
        else
        {
                return hMutex;
        }
}
2008-10-22 12:26
0
雪    币: 220
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
SetWindowsHookEx能勾住CreateMutexA吗?
2008-10-24 12:27
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
回楼上:两者没有直接关系,但你可以在SetWindowsHookEx安装的钩子DLL中Hook你感兴趣的函数
2008-10-24 14:05
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
exe被钩住的时机发生在尝试去取消息的时刻,如果该exe运行时直接调用CreateMutex,这时候钩子是还没来得及挂钩的。
这一点LZ可以自己写一个调用CreateMutex的程序作测试,你可以发现,只有在CreateMutex之前执行过GetMessage的才可以被成功挂钩。
至于3L的问题,很可能是因为你自己调用的那次还没有勾搭上,勾搭上以后,被你截获的那次可能是其他库里面自己的调用。
2008-10-25 13:46
0
雪    币: 249
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
你写再多代码也没用

CreteMutex -> CreateWinows

问题是用SetWinowsEx晚了
2008-10-25 14:13
0
雪    币: 249
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
SetWinowsHookE
2008-10-25 14:13
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
这只是把dll弄到进程里面去吧。
2008-10-25 17:13
0
游客
登录 | 注册 方可回帖
返回
//