33,311
社区成员
发帖
与我相关
我的任务
分享
typedef struct {
long hHook;
short iHookType;
long pEThread;
long offPfn;
} MsgHookInfo ;
#include<windows.h>
#include<tchar.h>
long (__stdcall *NtReadVirtualMemory)(long ProcessHandle,long BaseAddress,void* pBuffer,long NumberOfBytesToRead,long*NumberOfBytesReaded)=0;
long (__stdcall *NtWriteVirtualMemory)(long ProcessHandle,long BaseAddress,void* pBuffer,long NumberOfBytesToWrite,long*NumberOfBytesWritten)=0;
const unsigned long NtGetCurrentProcess = 0xffffffff;
typedef struct{
long psi;// As Long 'tagSERVERINFO
long aheList;// As Long '_HANDLEENTRY - handle table pointer
long pDispInfo;// As Long 'global displayinfo
long ulSharedDelta;// As Long 'delta between client and kernel mapping of ...
}SHAREDINFO;
typedef struct{
long phead ;//pointer to the real object
long pOwner ;//pointer to owning entity (pti or ppi)
BYTE bType ;//type of object
BYTE bFlags ;//flags - like destroy flag
short wUniq ;//uniqueness count
}HANDLEENTRY;
typedef struct { //si
short wRIPFlags; //As Integer 'RIPF_ flags
short wSRVIFlags; //As Integer 'SRVIF_ flags
short wRIPPID; //As Integer 'PID of process to apply RIP flags to (zero means all)
short wRIPError;// As Integer 'Error to break on (zero means all errors are treated equal)
long cHandleEntries;// As Long 'count of handle entries in array
}SERVERINFO;
enum HANDLE_TYPE{
TYPE_FREE = 0 ,//'must be zero!
TYPE_WINDOW = 1 ,//'in order of use for C code lookups
TYPE_MENU = 2,//
TYPE_CURSOR = 3,//
TYPE_SETWINDOWPOS = 4,//
TYPE_HOOK = 5,//
TYPE_CLIPDATA = 6 ,//'clipboard data
TYPE_CALLPROC = 7,//
TYPE_ACCELTABLE = 8,//
TYPE_DDEACCESS = 9,//
TYPE_DDECONV = 10,//
TYPE_DDEXACT = 11,// 'DDE transaction tracking info.
TYPE_MONITOR = 12,//
TYPE_KBDLAYOUT = 13,// 'Keyboard Layout handle (HKL) object.
TYPE_KBDFILE = 14,// 'Keyboard Layout file object.
TYPE_WINEVENTHOOK = 15,// 'WinEvent hook (EVENTHOOK)
TYPE_TIMER = 16,//
TYPE_INPUTCONTEXT = 17,// 'Input Context info structure
TYPE_CTYPES = 18,// 'Count of TYPEs; Must be LAST + 1
TYPE_GENERIC = 255// 'used for generic handle validation
};
typedef struct{
long hObject;
long cLockObj;
} HEAD;
typedef struct{
HEAD headinfo;
long pti; //PTHREADINFO
} THROBJHEAD ;
typedef struct{
long rpdesk; //PDESKTOP
long pSelf; //PBYTE
} DESKHEAD ;
typedef struct{
THROBJHEAD ThreadObjHead;
DESKHEAD DesktopHead;
} THRDESKHEAD;
typedef struct{ //hk
THRDESKHEAD tshead;
long phkNext;
short iHook; //// WH_xxx hook type
long offPfn;
short flags; //// HF_xxx flags
short ihmod;
long ptiHooked; ////PTHREADINFO - Thread hooked.
long rpdesk; //// Global hook pdesk. Only used when hook is locked and owner is destroyed
} HOOK ;
typedef struct{
long pEThread;
long RefCount;
long ptlW32;
long pgdiDcattr;
long pgdiBrushAttr;
long pUMPDObjs;
long pUMPDHeap;
long dwEngAcquireCount;
long pSemTable;
long pUMPDObj;
} W32THREAD ;
typedef struct {
long hHook;
short iHookType;
long pEThread;
long offPfn;
} MsgHookInfo ;
long pgSharedInfo=0;
void LocateSharedInfo();
short ReadMemoryToInt( long dwAddress);
long ReadMemoryToLong( long dwAddress);
BYTE ReadMemoryToByt( long dwAddress);
BOOL EnumMsgHook_Init();
MsgHookInfo* EnumMsgHook( long* num );
BOOL NT_SUCCESS( long Status )
{
return (Status >= 0);
}
int main(int argc, char* argv[])
{
return 0;
}
void LocateSharedInfo()
{
long pfnUserRegisterWowHandlers = (long)GetProcAddress(GetModuleHandle(_T("user32.dll")), "UserRegisterWowHandlers");
long I=0;
for( I = pfnUserRegisterWowHandlers ; I<pfnUserRegisterWowHandlers+0x1000;I++){
if( (ReadMemoryToInt(I)== 0x40C7 )&&
(ReadMemoryToInt(I + 1 * 7)== 0x40C7 )&&
(ReadMemoryToInt(I + 2 * 7)== 0x40C7 )&&
(ReadMemoryToInt(I + 3 * 7)== 0x40C7 )&&
(ReadMemoryToInt(I + 4 * 7)== 0x40C7 )&&
(ReadMemoryToInt(I + 5 * 7)== 0x40C7 ) ){
if( ReadMemoryToInt(I + 6*7 )== 0xB8 ){
pgSharedInfo = ReadMemoryToLong(I + 6 * 7 + 1);
}
}
}
}
short ReadMemoryToInt( long dwAddress)
{
short ret=0;
long nReadBytes=0;
long st = NtReadVirtualMemory(NtGetCurrentProcess,dwAddress,&ret,sizeof(ret), &nReadBytes );
return ret;
}
long ReadMemoryToLong( long dwAddress)
{
long ret=0;
long nReadBytes=0;
long st = NtReadVirtualMemory(NtGetCurrentProcess,dwAddress,&ret,sizeof(ret), &nReadBytes );
return ret;
}
BYTE ReadMemoryToByt( long dwAddress)
{
BYTE ret=0;
long nReadBytes=0;
long st = NtReadVirtualMemory(NtGetCurrentProcess,dwAddress,&ret,sizeof(ret), &nReadBytes );
return ret;
}
BOOL EnumMsgHook_Init()
{
LocateSharedInfo();
return (pgSharedInfo!=0);
}
MsgHookInfo* EnumMsgHook(long* num)
{
long hProcess = NtGetCurrentProcess;
SHAREDINFO gSharedInfo={0};
HANDLEENTRY* gHandleEntries=0;
SERVERINFO gsi={0};
MsgHookInfo* retArray=0;
long nReadBytes=0,I=0;
HOOK hHookInfo={0};
W32THREAD w32thd={0};
*num = 0;
if( !NT_SUCCESS(NtReadVirtualMemory(hProcess, pgSharedInfo, &gSharedInfo, sizeof(gSharedInfo), &nReadBytes)) )
goto ExitFunc__;
if( !NT_SUCCESS(NtReadVirtualMemory(hProcess, gSharedInfo.psi, &gsi, sizeof(gsi), &nReadBytes)) )
goto ExitFunc__;
gHandleEntries = malloc( sizeof(HANDLEENTRY)*gsi.cHandleEntries );
if( !NT_SUCCESS(
NtReadVirtualMemory(hProcess, gSharedInfo.aheList, gHandleEntries, sizeof(HANDLEENTRY)*gsi.cHandleEntries ,&nReadBytes)
) )
goto ExitFunc__;
for( I = 0 ; I < gsi.cHandleEntries ; I++){
if(gHandleEntries[I].bType == TYPE_HOOK ){
if( DumpKernelMemory(gHandleEntries[I].phead, sizeof(HOOK), &hHookInfo ) ){
*num = *num + 1;
retArray = realloc( retArray , *num );
retArray[ *num ].hHook = hHookInfo.tshead.ThreadObjHead.headinfo.hObject;
retArray[ *num ].iHookType = hHookInfo.iHook;
retArray[ *num ].offPfn = hHookInfo.offPfn ;
if( DumpKernelMemory(hHookInfo.tshead.ThreadObjHead.pti, sizeof(w32thd),&w32thd ) ){
retArray[ *num ].pEThread = w32thd.pEThread;
}
}
}
}
ExitFunc__:
return retArray;
}