DWORD cbNeeded;
HMODULE hMods;
char szModName[256];
DWORD eachPID;
GetWindowThreadProcessId(trayData.hwnd, &eachPID);
HANDLE hP = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_ALL_ACCESS, false, eachPID);
EnumProcessModules(hP, &hMods, sizeof(HMODULE), &cbNeeded);
GetModuleFileNameEx(hP, hMods, szModName, sizeof(szModName));
用上面这段代码可以获得一般应用程序的模块文件名,但是没有办法获得卡巴的,查其原因,发现是EnumProcessModules返回错误,错误代码说是INVALID_HANDLE,这是怎么回事呢?还有获取卡巴图标的句柄的时候总是返回非法句柄,一直想不明白,请高手指点!

解决方案 »

  1.   

    楼上的说错了,他又不是直接打开"文件",而且枚举进程,进程在内存中何来加壳之说?取不到是因为卡巴本身对OpenProcess进行了APIHOOK,所有企图打开这个进程的操作都会被过滤.所以你取得的是INVALID_HANDLE
      

  2.   

    > 卡巴本身对OpenProcess进行了APIHOOK,所有企图打开这个进程的操作都会被过滤.所以你取得的是INVALID_HANDLE
    不是APIHOOK,而是内核层的SSDT Hook。
    如果楼主想打开之,需要编写驱动进内核层调用NtOpenProcess来打开。
      

  3.   

    楼上的说得对,用IceSword查看SSDT就知道被"卡巴"的驱动Hook掉了,如果能加载驱动,也不用调用NtOpenProcess了,可以直接查找PEB里面的_PEB_LDR_DATA 来获得程序的路径.