国产成人毛片毛片久久网_国产午夜激无码av毛片不_国产乱对白精彩在线播放_av资源站中文字幕_亚洲男人的天堂网站_国产成 人 综合 亚洲网_中国国产激情一区_少妇一级淫片免费放_亚洲一本大道av久在线播放_免费观看美女裸体网站

行業(yè)動(dòng)態(tài)

防御吧作為15年知名老牌域名服務(wù)商,CNNIC和CANN雙認(rèn)證域名注冊(cè)商,已經(jīng)
持續(xù)為500多萬個(gè)域名提供服務(wù),包括智能DNS/自由轉(zhuǎn)移/隱私保護(hù)等服務(wù)!
反外掛揭秘:hook技術(shù)
2021-09-23 14:25:35 【

hook 介紹

hook英文意思是鉤子,hook可以在程序已經(jīng)編譯成bin文件,甚至執(zhí)行時(shí),修改函數(shù)流程。先上一段簡(jiǎn)單代碼,讓大家對(duì)hook有個(gè)簡(jiǎn)單認(rèn)識(shí)。

#define XX_JMP_OPCODE  0xE9#pragma pack(push, 1)struct xxhook_jmp32 {  uint8_t opcode ;  int32_t offset;};#pragma pack(pop)// 設(shè)置鉤子static bool xx_setjmp(void* src, void* dst) {  xxhook_jmp32* jmp = (xxhook_jmp32*)src;  jmp->opcode = 0xE9;    jmp->offset = (char*)dst - ((char*)src + sizeof(xxhook_jmp32)) ;  return true;}

例子1:hook 用戶函數(shù)

void func1() {  printf("func1\n");}void func2() {  printf("func2\n");}void test_hook_my_func() {  func1();  // 使代碼區(qū)可寫  DWORD old_pro = 0;  BOOL ret = VirtualProtect(&func1, 4096, PAGE_EXECUTE_READWRITE, &old_pro);  // hook!  xx_setjmp(&func1, &func2);  func1();}

執(zhí)行后輸出

func1func2


例子2:hook C函數(shù)

static __inline time_t __CRTDECL my_time(_Out_opt_ time_t* const _Time) {  return 1234;}void test_hook_cfunc() {  printf("time=%u\n",time(NULL));  DWORD old_pro = 0;  BOOL ret = VirtualProtect(&time, 4096, PAGE_EXECUTE_READWRITE, &old_pro);  xx_setjmp(&time, &my_time);  printf("time=%u\n", time(NULL));}

輸出

time=1632322864time=1234


可以看出,函數(shù)的執(zhí)行邏輯已經(jīng)改變了。


hook代碼解析

hook的本質(zhì),就是修改原代碼,在跳轉(zhuǎn)到我們的函數(shù),我們對(duì)比一下例子2中hook前后的time函數(shù)匯編代碼變化。

hook前

        static __inline time_t __CRTDECL time(            _Out_opt_ time_t* const _Time            )        {00007FF6DA4B1290 48 89 4C 24 08       mov         qword ptr [rsp+8],rcx  00007FF6DA4B1295 48 83 EC 28          sub         rsp,28h              return _time64(_Time);00007FF6DA4B1299 48 8B 4C 24 30       mov         rcx,qword ptr [_Time]  00007FF6DA4B129E FF 15 FC 1E 00 00    call        qword ptr [__imp__time64 (07FF6DA4B31A0h)]          }00007FF6DA4B12A4 48 83 C4 28          add         rsp,28h  00007FF6DA4B12A8 C3                   ret

hook后

        static __inline time_t __CRTDECL time(            _Out_opt_ time_t* const _Time            )        {00007FF6DA4B1290 E9 AB FD FF FF       jmp         my_time (07FF6DA4B1040h)  00007FF6DA4B1295 48 83 EC 28          sub         rsp,28h              return _time64(_Time);00007FF6DA4B1299 48 8B 4C 24 30       mov         rcx,qword ptr [_Time]  00007FF6DA4B129E FF 15 FC 1E 00 00    call        qword ptr [__imp__time64 (07FF6DA4B31A0h)]          }00007FF6DA4B12A4 48 83 C4 28          add         rsp,28h  00007FF6DA4B12A8 C3                   ret

可以看出,函數(shù)第一行就是跳轉(zhuǎn)到我們的函數(shù)的jump語(yǔ)句。

我們?cè)賮砘仡櫼幌滦薷牡拇a,12行就是賦值0xe9代表是跳轉(zhuǎn)語(yǔ)句,接下來4個(gè)字節(jié)就是跳轉(zhuǎn)的offset,公式為:dst-(src+5)。5是本條jmp語(yǔ)句的長(zhǎng)度。

#define XX_JMP_OPCODE  0xE9#pragma pack(push, 1)struct xxhook_jmp32 {  uint8_t opcode ;  int32_t offset;};#pragma pack(pop)static bool xx_setjmp(void* src, void* dst) {  xxhook_jmp32* jmp = (xxhook_jmp32*)src;  jmp->opcode = 0xE9;  jmp->offset = (char*)dst - ((char*)src + sizeof(xxhook_jmp32)) ;  return true;}


hook技術(shù)看這一篇為什么不夠

有一些問題我們還沒解決

  • 原函數(shù)已經(jīng)被破壞,第一句改成了jmp,如果還想調(diào)用原函數(shù)怎么辦?

  • 64bit操作系統(tǒng),如果原函數(shù)和目標(biāo)函數(shù)的offset超過uint32-max怎么辦?

  • hook時(shí),有線程正在執(zhí)行此函數(shù)怎么辦?

  • linux如何hook?

  • hook還有哪些用處?



】【打印關(guān)閉】 【返回頂部
分享到QQ空間
分享到: 
上一篇提升DNS安全 限制DDoS攻擊 下一篇如何設(shè)置 CC 防護(hù)?

立足首都,輻射全球,防御吧專注云防御及云計(jì)算服務(wù)15年!

聯(lián)系我們

服務(wù)熱線:13051179500 18910191973
企業(yè)QQ:1245940436
技術(shù)支持:010-56159998
E-Mail:xihedata.com
Copyright ? 2003-2016 fangyuba. 防御吧(完美解決防御與加速) 版權(quán)所有 增值許可:京B2-20140042號(hào)
售前咨詢
公司總機(jī):18910191973
24小時(shí)電話:010-56159998
投訴電話:18910191973
值班售后/技術(shù)支持
售后服務(wù)/財(cái)務(wù)
備案專員
緊急電話:18610088800