Chinaunix首页 | 论坛 | 博客
  • 博客访问: 212966
  • 博文数量: 70
  • 博客积分: 2050
  • 博客等级: 大尉
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-15 21:42
文章分类

全部博文(70)

文章存档

2013年(1)

2011年(5)

2010年(3)

2009年(9)

2008年(17)

2007年(6)

2006年(29)

我的朋友

分类: WINDOWS

2010-08-31 15:49:56

#include
#include

// libimagehlp.a

LPVOID SetModuleCallee(HMODULE hCaller, LPCSTR lpszCallee, LPCSTR lpszFunction, LPVOID lpfnCallee)
{
    ULONG size;
    PIMAGE_IMPORT_DESCRIPTOR pImportDesc;

    pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &size);
    if (pImportDesc)
    {
        while (pImportDesc->Name)
        {
            if (!lstrcmpiA((LPSTR)((PBYTE)hCaller + pImportDesc->Name), lpszCallee))
            {
                PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)((PBYTE)hCaller + pImportDesc->FirstThunk);
                LPVOID lpfnCaller = GetProcAddress(GetModuleHandle(lpszCallee), lpszFunction);

                while (pThunk->u1.Function)
                {
                    if (*(LPVOID *)&pThunk->u1.Function == lpfnCaller)
                    {
                        *(LPVOID *)&pThunk->u1.Function = lpfnCallee;
                        return lpfnCaller;
                    }
                    ++pThunk;
                }
                break;
            }
            ++pImportDesc;
        }
    }

    return NULL;
}

static HCURSOR (WINAPI *lpfnSetCursor)(HCURSOR);

HCURSOR WINAPI Test(HCURSOR hCursor)
{
    MessageBox(NULL, TEXT("ok"), TEXT("Hook"), MB_OK);
    return lpfnSetCursor(hCursor);
}

int main(void)
{
    lpfnSetCursor = (typeof(lpfnSetCursor))SetModuleCallee(GetModuleHandle(NULL), "user32.dll", "SetCursor", Test);
    SetCursor(NULL);

    return 0;
}

阅读(599) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~