
ããã¯ã¯ãä»ã®äººã®ããã»ã¹ã§é¢æ°åŒã³åºããååããããã®æè¡ã§ãã ããã¯ã¯ãååã«åŒ·åãªãã¯ãããžãŒãšåæ§ã«ãé©åãªç®çïŒã¹ããã¡ãŒããªãŒãã£ãª/ãããªã°ã©ããŒãã¯ããŒãºããšã³ããœãããŠã§ã¢æ©èœã®æ¡åŒµããã®ã³ã°ããã°ä¿®æ£ïŒãšæªæïŒããã€ã®æšéŠ¬ãã¯ã©ãã¯ãããŒãã¬ãŒïŒã®äž¡æ¹ã«äœ¿çšã§ããŸãã ããã¯ã«ã€ããŠ
ã¯ãHabrã§ã¯ãªã Habrã®äž¡æ¹ã§2å以äžæžã
ãŠããŸã ã ããããããã«åé¡ããããŸã-äœããã®çç±ã§ãããã¯ã«é¢ãããã¹ãŠã®èšäºã¯ããä»®æ³é¢æ°ããŒãã«ãããã¡ã¢ãªã¢ãŒããã¯ãã£ãã«é¢ãã2çªç®ã®æ®µèœããå§ãŸããã¢ã»ã³ãã©ã³ãŒãã®å·šå€§ãªãããã¯ãç 究ããããšãææ¡ããŸãã ããã¹ãå
ã®ååŒã«ãã£ãŠèªè
ã®æ°ãååã«æžãããšãç¥ãããŠããããã®ãããªããšã¯å®å
šã«4åã§ãã ãããã£ãŠãããã¯ã«ã€ããŠç°¡åã«èª¬æããèšäºãå¿
èŠã§ãã catã®äžã«ã¯ãã¢ã»ã³ãã©ãŒãè€éãªçšèªãæåéã2ããŒã¹ã®éåžžã«åçŽãªC ++ã³ãŒãã¯ãããŸããã é·ãéããã¯ãåŠã³ãããšæã£ãŠããããã©ãããå§ããã°ãããããããªãå Žåã¯ããã®èšäºããå§ããŠãã ããã
æ¬åœã®ææŠ
ç§ãã¡ãäœãããŠããã®ããããããç解ããããã«ãå®éã®ã¿ã¹ã¯ãèšå®ããŸãã äŸãã°ãFirefoxãã©ãŠã¶ãŒã«ã
ãHelloãHabrïŒããšæžããŠããããŸããã
ãèŠåºãã§ã¯ãªãã
ã*** / Habrahabr-Mozilla Firefoxãã®ããã«ãªããŸããããã§*** -ã»ã¯ã·ã§ã³ã«ãã£ãŠç°ãªããŸãïŒã ã¯ããFirefoxã®ãœãŒã¹ããã©ãŠã¶ãã©ã°ã€ã³ããŠãŒã¶ãŒã¹ã¯ãªããããã®ä»å€æ°ã®æ¹æ³ãç·šéããããšã§ãããå®çŸã§ããããšãç¥ã£ãŠããŸãã ããããæè²ç®çã®ããã«ããã¯ã䜿çšããŸãã
ã¡ãã£ãšããçè«
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã®ããã»ã¹ãäœæããŸãã 倧ãŸãã«èšããšãexeãã¡ã€ã«ã¯ã¡ã¢ãªã«ã³ããŒãããåäœããå¿
èŠã®ããã©ã€ãã©ãªïŒdllãã¡ã€ã«ïŒã決å®ããïŒãã®æ
å ±ã¯åexeãã¡ã€ã«ã®å
é ã«èšé²ãããŸãïŒããããã®ã©ã€ãã©ãªãïŒããã°ã©ã ãã©ã«ããŒããã³ã·ã¹ãã ãã©ã«ããŒã§ïŒæ€çŽ¢ãããŸãããã»ã¹ã¡ã¢ãªã«ããŒããããŸãã 次ã«ãããã°ã©ã ã䜿çšããã©ã€ãã©ãªãŒé¢æ°ãšãããã®å ŽæïŒã©ã®ã©ã€ãã©ãªãŒããã³ãã®ã©ã€ãã©ãªãŒã®æ£ç¢ºãªå ŽæïŒãæ£ç¢ºã«å€å¥ããŸãã ãã¬ãŒãã¯ããSomeFunction1ïŒïŒfunction-SomeLibrary1.dll library-ïŒ
function_address_SomeFunction1ïŒïŒïŒ
ããšãã圢åŒã§æ§ç¯ãããŸãã ããã°ã©ã ããã®é¢æ°ãåŒã³åºãå¿
èŠãããå Žåãã¡ã¢ãªå
ã§å¿
èŠãªã©ã€ãã©ãªãèŠã€ããç®çã®ã¢ãã¬ã¹ãã«ãŠã³ãããããã§å¶åŸ¡ã転éããŸãã

ããã¯ã®æ¬è³ªã¯ãããã°ã©ã ã«ãå¿
èŠãªæ©èœãå¥ã®å Žæã«ãããšä¿¡ããããããšã§ãã

ããã¯ãã®ããã«ããŠè¡ãããŸã-ç§ãã¡ã¯ã©ã€ãã©ãªSomeLibrary2.dllãæžããŸãããã®ã©ã€ãã©ãªã«ã¯é¢æ°SomeFunction2ïŒïŒãé
眮ãããŸãã 次ã«ããã®ã©ã€ãã©ãªãå¥ã®ããã»ã¹ã®ã¡ã¢ãªã«ããŒããïŒWindowsã«ã¯ãã®ããã®ç¹å¥ãªé¢æ°ããããŸãïŒãäžèšã§èšè¿°ããã©ãã«ãå€æŽããŠããšã³ããªãSomeFunction1ïŒïŒfunction-SomeLibrary2.dll library- ïŒ
address_of our_function_SomeFunction2ïŒïŒïŒ
"ã ãã®æ®µèœã§èª¬æãããŠãããã¹ãŠãæåã§è¡ãæ¹æ³ãç解ããã«ã¯ãWindowsã§ã¡ã¢ãªãã©ã®ããã«é
眮ãããŠããããé¢æ°ãã©ã®ããã«åŒã³åºãããããåŒæ°ãã©ã®ããã«æž¡ãããããªã©ããã¹ãŠãååã«ç¥ãå¿
èŠããããŸãã ããã«ã¯æ³šæãå¿
èŠã§ãã ãŸããå®éã«ã¯ããã§ã¯ãããŸãããããªãã¯ãããªãã§è¡ãããšãã§ããŸãã å¿
èŠãªå Žåã¯ãé«åºŠãªèšäºïŒãŸãã¯å°ãªããšãåé ã«ç€ºããèšäºã®1ã€ïŒããèªã¿ãã ããã ç§ãã¡ã¯å¥ã®æ¹æ³ã§è¡ããŸã-æ¢è£œã®Microsoft Detoursã©ã€ãã©ãªã䜿çšããŸããããã«ããããã¹ãŠã®æ±ãäœæ¥ãè¡ãããŸãã
Microsoft Detoursã«ã€ããŠäžèš

åŠã³ããã䜿ããããã

éåžžã«å¹æç

è¯ãããã¥ã¡ã³ã

ãœãŒã¹ã«å€ãã®äŸãå«ã

Microsoftã«ãã£ãŠéçºããã-OSã®ãåéãã§ã¯ãªã

ç 究ããã³éå¶å©ãããžã§ã¯ãã¯ç¡æ

ã¢ã»ã³ããªã®ç¥èã¯å¿
èŠãããŸãã

éåº

åçšå©çšãŸãã¯x64ã¢ãŒããã¯ãã£ã«èŠåããŸãšããªãé
äžè¬ã«ãããã¯ã®ç 究ã¯ç¹ã«Detoursããå§ããããšããå§ãããŸããããã1åéãã®ãšã³ã¿ãŒãã€ã¡ã³ãã§ããå Žåãããã§ååã§ããããã«æåãã奜ãã«ãªãã§ãããã æ·±å»ãªãããžã§ã¯ãã§ããã¯ãå¿
èŠãªå Žåã¯ã
mhook ãDetoursã®è³Œå
¥ããŸãã¯ç¬èªã®èªè»¢è»ãäœæãããªã©ãç¡æã§ãªãŒãã³ãªïŒãã ãããè€éãªïŒã©ã€ãã©ãªã«ç°¡åã«åãæ¿ããããšãã§ããŸãïŒæåŸã®2ã€ã®ãœãªã¥ãŒã·ã§ã³ã«ã¯ãéåžžã«è¯ãçç±ãå¿
èŠã§ãïŒã
ã©ãã§å
¥æã§ããã©ã®ããã«è¿åè·¯ãçµã¿ç«ãŠããã«ã€ããŠãç§ã¯
ããã«æžã
ã ã
ããªãããŒãªèšç»
- ããã¯ãèšå®ããæ©èœãç解ããŸãã
- å
ã®ã©ã€ãã©ãªã眮ãæããå¿
èŠãªããšãè¡ãé¢æ°ã䜿çšããŠç¬èªã®ã©ã€ãã©ãªãäœæããŸãã
- ããã¯ãèšå®ããŸãïŒç®çã®ããã»ã¹ã®ã¡ã¢ãªã«ã©ã€ãã©ãªãããŒãããå¿
èŠãªé¢æ°ãžã®ãã€ã³ã¿ãåé
眮ããŸãïŒã
- å©çïŒ
ããã¯ã眮ãå Žæ
MSDNã¯ããŠã£ã³ããŠã¿ã€ãã«ã
SendMessageé¢æ°ã§èšå®ã§ããããšãéåžžã«æ確ã«ç€ºåããŠããŸãããã®
å Žå ã
WM_SETTEXTã2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ããããã¹ãèªäœãæåŸã«ããå¿
èŠããããŸãã ãã ãã埮åŠãªéããããå ŽåããããŸãã
- SendMessageã®ä»£ããã«ãPostMessageãªã©ã䜿çšã§ããŸãã
- SendMessageã¯é¢æ°ã§ã¯ãªããããããŸããããå¥ã®é¢æ°ãåç
§ãããã¯ãã§ãïŒåŸã§ãããããã«ãªããŸãïŒ
- Firefoxã¯ãäžéšã®ã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ãšåæ§ã«ãWindowsé¢æ°ã䜿çšããŠæšæºã®ãŠã£ã³ããŠèŠçŽ ãæç»ããã代ããã«äœããã®çš®é¡ã®ã¯ãã¹ãã©ãããã©ãŒã GUIèŠçŽ ã䜿çšããå ŽåããããŸãïŒæ®å¿µãªãããããã§ã¯ãããŸããããçªç¶ã§ãïŒïŒ
ãããã£ãŠããã¹ãŠã培åºçã«ãã§ãã¯ããå¿
èŠããããŸãã ãã°ãããç¡æã®
API Monitorããã°ã©ã ã圹ç«ã¡ãŸãã ç¹å®ã®ããã»ã¹ã«åå ããŠããããåŒã³åºãé¢æ°ãšãã©ã¡ãŒã¿ãŒãã¹ãã€ããããšãã§ããŸãã ããªãã¯ãã§ã«æšæž¬ããŠãããããããŸãã-圌女ãããã¯ã®å©ããåããŠãããè¡ããŸãã ãã®ãããFirefoxãšMonitor APIãèµ·åããŸãã ãŸããAPIã¢ãã¿ãŒã§ãã£ã«ã¿ãŒãæå®ããå¿
èŠããããŸã-ã¢ãã¿ãŒããç¹å®ã®æ©èœã°ã«ãŒãã ãã¹ãŠãéžæããå Žå-調æ»äžã®ããã°ã©ã ã®åäœãéåžžã«é
ããªãïŒãŸãã¯ããªãŒãºããå¯èœæ§ããããŸãïŒãããéžæããæ°ãå°ãªãããŸã-å¿
èŠãªããã°ã©ã ãéããŸã ãããã£ãŠãWindows GUIèŠçŽ ãæäœããããã®æ©èœãæœåšçã«èŠã€ããã°ã«ãŒãã®ã¿ãèããŠéžæããå¿
èŠããããŸãã Graphicsããã³Windows Application UI Developmentã°ã«ãŒããéžæããRunning Processesããã«ã§Firefoxãããã«ã¯ãªãã¯ããŸãããã ãã®ç¬éãããå³åŽã®ããã«ã®APIã¢ãã¿ãŒã«ã¯ããã¹ãŠã®APIé¢æ°ãšãã®ãã©ã¡ãŒã¿ãŒã®åŒã³åºãã衚瀺ãããŸãã
Firefoxã«ç§»åããŠHabrãéããããããŒãç®çã®ããããŒã«å€ããã®ãåŸ
ã£ãŠãããApi Monitorã«æ»ã£ãŠç£èŠãåæ¢ããŸãã ã»ãšãã©ã®å ŽåãåŒã³åºãããé¢æ°ã®æ°ã«é©ãã§ããã-ã»ãã®æ°ç§ã®ç£èŠã§æ°åäžã®é¢æ°ãååšããå¯èœæ§ããããŸãã ããããç§ãã¡ã¯ãŸã ãã¹ãŠã«åŸã£ãŠããŸããã ã¯ããã¯ããããã¯ãã¹ãŠãã©ãŠã¶ã§ãã£ã1ã€ã®ãµã€ããç¡å®³ã«éããç¶æ
ã§æ¬åœã«èµ·ãããŸãïŒ ãããŠãããªãã¯ãŸã ãã®æ°ç§ãé·ããããšäžå¹³ãèšã£ãŠããŸãã :)

å¿
èŠãªæ©èœãèŠã€ãããšãç£èŠçµæã§ã¿ããæ€çŽ¢ããã®ã«åœ¹ç«ã¡ãŸãã â WM_SETTEXTâãæ€çŽ¢ã«çµã¿èŸŒã¿ããã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠSendMessageWé¢æ°ãå®éã«åŒã³åºããŠããããšã確èªããŸããããã¯ããŠã£ã³ããŠã¿ã€ãã«ã®èšå®ã§ããå¯èœæ§ãé«ãã§ãã é¢æ°åã®æåŸã«ãããWãã«æ³šæããŠãã ãããããã¯ãUnicodeããŒãžã§ã³ã䜿çšãããŠããããšãæå³ããŸãã ããã¯ãèšå®ããã«ã¯ã眮ãæããããé¢æ°ã®æ£ç¢ºãªååãç¥ãããšãéèŠã§ãããä»ã§ã¯ãããç¥ã£ãŠããŸãã
ç§ãã¡ã¯å³æžé€šãäœããŸã
1. Visual Studioãèµ·åã
ãŸã ã
2.æ°ãããããžã§ã¯ããäœæããŸãïŒãã¡ã€ã«->æ°èŠ->ãããžã§ã¯ãã Visual C ++-> Win32-> Win32 Projectãšå
¥åããŸãã ãããžã§ã¯ããäœæããããã®ãã€ã¢ãã°ã§ãã¿ã€ããDllããæå®ããŸãã
3. dllmain.cppãã¡ã€ã«ãéãã次ã®ã³ãŒããããã«èšè¿°ããŸãã
#include <windows.h> #include "C:\Program Files\Microsoft Research\Detours Express 3.0\src\detours.h" LRESULT (WINAPI * TrueSendMessageW)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) = SendMessageW; __declspec(dllexport) LRESULT WINAPI MySendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { if (Msg == WM_SETTEXT && wcsstr((LPCTSTR)lParam, L"/ - Mozilla Firefox") != NULL) return TrueSendMessageW(hWnd, Msg, wParam, (LPARAM)L", !"); return TrueSendMessageW(hWnd, Msg, wParam, lParam); } BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved) { if (dwReason == DLL_PROCESS_ATTACH) { DetourRestoreAfterWith(); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)TrueSendMessageW, MySendMessageW); DetourTransactionCommit(); } else if (dwReason == DLL_PROCESS_DETACH) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)TrueSendMessageW, MySendMessageW); DetourTransactionCommit(); } return TRUE; }
4.ãããžã§ã¯ãã®ããããã£ãéããå€ãCïŒ\ Program Files \ Microsoft Research \ Detours Express 3.0 \ lib.X86 \ detours.libãããªã³ã«ãŒèšå®ã¿ãã®è¿œå ã®äŸåé¢ä¿ãã£ãŒã«ãã«è¿œå ããŸãã 泚æããã¹ã¯ç°ãªãå ŽåããããŸã-Detoursã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå Žæã«ãã£ãŠç°ãªããŸãã
5.ãããžã§ã¯ã
ãã³ã³ãã€ã«ããŸãïŒBuild-> Build Solutionã åºåã¯dll-kuïŒhooktest.dllãšããååã«ããŸãïŒ
ãœãŒã¹ãåæããŸãããã æåã«ãWindowsããããŒãã¡ã€ã«ïŒSendMessageWé¢æ°ã䜿çšããããïŒããã³DetoursïŒããã¯ãèšå®/åé€ã§ããããã«ããããïŒãå«ããŸãã
äžèŠè€éãªïŒ3è¡ç®ã§ã¯ãTrueSendMessageWå€æ°ã«SendMessageWé¢æ°ãžã®å®éã®ãã€ã³ã¿ãŒãä¿åããã ãã§ãã ããã¯2ã€ã®ç®çã§å¿
èŠã§ãã
- ããã§ã€ã¯ãããå®éã®é¢æ°SendMessageWãåŒã³åºãã«ã¯ã
- ããã¯ãåé€ãããæç¹ã§å®éã®é¢æ°ãžã®ãã€ã³ã¿ãŒã埩å
ããŸãã
次ã¯ãåœã®MySendMessageWé¢æ°ã§ãã 圌女ã¯ãšãŠãã·ã³ãã«ã§ãã ã¡ãã»ãŒãžWM_SETTEXTãåºãŠããŠããã®ããã¹ãã«Habrã®èšåãããå Žåã¯ããããèªåã®ãã®ã«çœ®ãæããŠãã ããã ãã以å€ã®å Žåãééãããã·ãšããŠåäœããŸãã
__declspecïŒdllexportïŒãã¬ãã£ãã¯ã¹ã«æ³šæããŠãã ãã-ä»ã®ããã»ã¹ããã®é¢æ°ã䜿çšã§ããããã«ããããã«å¿
èŠã§ãã
DllMainé¢æ°ã¯ãç¹å®ã®å Žåã«ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠåŒã³åºãããŸã-ããšãã°ãããã»ã¹ãžã®ã©ã€ãã©ãªã®ã¢ã¿ãã/ãã¿ããã®ç¬éã«ã ããã§ãããã¹ãŠãç°¡åã§ãã æ¥ç¶æã«ããã¯ãèšå®ããå¿
èŠããããåé¢æã«ã¯ããã¯ãåé€ããå¿
èŠããããŸãã Detourã©ã€ãã©ãªã§ã¯ãããããã©ã³ã¶ã¯ã·ã§ã³ã§è¡ãå¿
èŠããããããã¯çã«ããªã£ãŠããŸã-è€æ°ã®äººãäžåºŠã«1ã€ã®ããã»ã¹ã«ããã¯ãå
¥ãããå Žåã«äœãèµ·ãããæ³åããŠãã ããã ãã®ã³ãŒãã§æãéèŠãªã®ã¯æ¬¡ã®è¡ã§ã
DetourAttach(&(PVOID&)TrueSendMessageW, MySendMessageW);
ããã»ã¹ããä¿¡ãããããã«ããã®ã¯åœŒå¥³ã§ãããå®éã®SendMessageWé¢æ°ã®ä»£ããã«ãMySendMessageWãåŒã³åºãå¿
èŠããããŸãã ãã®è¡ã®ããã«ããã¹ãŠãéå§ãããŸããã 誰ããèå³ãæã£ãŠãããªããç§ã¯ãã€ãŠãã®é¢æ°ã®é¡äŒŒç©ãæåã§æžããã é¢æ°ã®çš®é¡ãšã¢ãŒããã¯ãã£ã®ãã¹ãŠã®å¯èœãªçµã¿åãããèãããšãæ°é±éããããŸããã ãã ä¿åããŸãã-ããã§ãšãããããŸãã
ããã¯ãèšå®ãã
Microsoft Detoursã«ã¯ãããã¯ãã€ã³ã¹ããŒã«ããããã®ããŸããŸãªãªãã·ã§ã³ããããŸããæãç°¡åãªãã®ã䜿çšããŸãã ã©ã€ãã©ãªã«ä»å±ããäžé£ã®ãµã³ãã«ã«ã¯ãwithdll.exeããã°ã©ã ãå«ãŸããŠããŸãããã©ã¡ãŒã¿ãšããŠãã¢ããªã±ãŒã·ã§ã³ãžã®ãã¹ãšãèµ·ååŸã«ãã®ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªã«ããŒãããå¿
èŠã®ããã©ã€ãã©ãªãåãåããŸãã 次ã®ããã«ãã¹ãŠãéå§ããŸãã
withdll.exe -d:hooktest.dll "C:\Program Files\Mozilla Firefox\firefox.exe"
å©çïŒ
HabrãéããŸãïŒ

ããããïŒ
ããã¯ã®åŠç¿ã«æåã