飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4118|回复: 4

[转贴] 一段HOOK API 实现patch HWID 程序框架

[复制链接]
  • TA的每日心情

    2021-3-15 02:34
  • 签到天数: 347 天

    [LV.8]以坛为家I

    发表于 2010-12-3 10:32:15 | 显示全部楼层 |阅读模式
    采用模拟API函数拦截,进行HOOK
    typedef struct _NTHook{
            FARPROC hAddr;
            BYTE dwOldValue[5];
            BYTE dwNewValue[5];
    } NTHook,*PNTHook;

    DWORD   dwProtect,dwWriteByte,dwReadByte;
    NTHook  hNt;
    BOOL  IsHook;
    BYTE HWID[]={0x6E, 0x74, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x49, 0x00, 0x08,
    0x02, 0x00, 0x7A, 0x06, 0x01, 0x00, 0x00, 0x26, 0x55, 0x3F,
    0xDB, 0x1A};  自定的HWID

    void RWHOOK(PNTHook hNt,DWORD hProc)
    {

           //记录原指令指向
          ReadProcessMemory(GetCurrentProcess(), (LPVOID)hNt->hAddr, (LPVOID)hNt->dwOldValue, 5, &dwReadByte);
          VirtualProtect ( (LPVOID)hNt->hAddr, 5, PAGE_READWRITE, &dwProtect );
          hNt->dwNewValue[0]=0xE9;
           //计算patch函数的地址指令,计算方法:指向地址-EIP-5
         *((PDWORD)(&(hNt->dwNewValue[1])))=hProc-DWORD(hNt->hAddr)-5;  
           //修改JMP指向到patch代码
          WriteProcessMemory( GetCurrentProcess(), (LPVOID)hNt->hAddr, (LPVOID)hNt->dwNewValue, 5, &dwWriteByte ) ;

    }

    //patch HWID过程函数
    __declspec(naked) void NewProc()
    {

            _asm
            {
                    pushad           //保留现场
                    mov edi,edx    //让EDI指向到HWID(  取得OD分析中的HWID数据地址)
                    lea esi,HWID    // 让ESI指向到我们的自定的HWID
                    mov ecx,16H     //定义要patch的字节数
                   rep movsb         //patch HWID
            }
            //恢复原指令修正指向
            WriteProcessMemory( GetCurrentProcess(), (LPVOID)hNt.hAddr, (LPVOID)hNt.dwOldValue, 5, &dwWriteByte ) ;   
           IsHook=FALSE;
            _asm
            {
                    popad         //恢复现场
                    jmp hNt.hAddr
            }
    }

    void Hook()
    {
        //OD分析中关键地址,在这修改指向到patch代码
       hNt.hAddr=(FARPROC)0x004C44E8;     
       if (IsHook==FALSE)
       {
               RWHOOK(&hNt,(DWORD)NewProc);
               IsHook=TRUE;
       }
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////
    // 要HOOK的函数
    ALCDECL AheadLib_GetAdaptersInfo(void)
    {
            
            Hook();   调用HOOK过程
            GetAddress("GetAdaptersInfo");  获取原来API的地址,返回到EAX
            __asm JMP EAX;   
    }
    /////////////////////////////////////////////////////////////////////////////////////////////
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2012-9-1 17:02:54 | 显示全部楼层
    很好的框架,学习了
    PYG19周年生日快乐!
  • TA的每日心情

    2022-10-14 10:31
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    发表于 2015-1-30 11:55:30 | 显示全部楼层
    Np1.7的替换机器码?
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2015-2-8 16:38:48 | 显示全部楼层
    不错看看 楼主幸苦了
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2015-7-29 17:43
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-7-29 18:17:32 | 显示全部楼层
    嗯看看怎么样,
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表