åã®èšäºã§ã颿°ãã€ã³ã¿ãŒã»ããããããã®5ã€ã®ãªãã·ã§ã³ãšãã®ããªãšãŒã·ã§ã³ã調ã¹ãŸããã
確ãã«ããã®äžã«èæ
®ãããŠããªã2ã€ã®äžå¿«ãªç¶æ³ãæ®ããŸããã
1.ãã©ãããåé€ãããæç¹ã§ãã€ã³ã¿ãŒã»ããããã颿°ãåŒã³åºããŸãã
2. 2ã€ã®ç°ãªãã¹ã¬ããããã®ã€ã³ã¿ãŒã»ããããã颿°ã®åæåŒã³åºãã
æåã®ã±ãŒã¹ã§ã¯ãã€ã³ã¿ãŒã»ãã¿ãŒãã€ã³ã¹ããŒã«ããããã°ã©ããŒã¯å
šäœåãèŠãããšãã§ããŸããã äžéšã®ããŒã¿ã¯åœŒãééããŸãã
2çªç®ã®ã±ãŒã¹ã¯ãã€ã³ã¿ãŒã»ãã¿ãŒãã€ã³ã¹ããŒã«ãããŠããã¢ããªã±ãŒã·ã§ã³ãèœã¡ããŸã§ãããæ·±å»ãªçµæãããããæãããããŸãã
ãããã®ç¶æ³ã¯äž¡æ¹ãšããã¹ãã©ã€ã·ã³ã°ã䜿çšãããŠããå Žåã«ã®ã¿çºçããŸãã ã€ã³ããŒã/ãšã¯ã¹ããŒãããŒãã«ãªã©ãéããŠã€ã³ã¿ãŒã»ãããããå Žå ã€ã³ã¿ãŒã»ããããã颿°ã®ããã£ã®å€æŽã¯çºçããªããããã€ã³ã¿ãŒã»ããã®ãããã®ãªãã·ã§ã³ã¯é床ã®ããã£ã®åããå¿
èŠãšããŸããã
ãã®èšäºã§ã¯ãHopPatchçšã«æºåããã颿°ã®ãšã³ããªãã€ã³ãã®ã¹ãã©ã€ã·ã³ã°ã«ã€ããŠãããã«è©³ãã調ã¹ãŸãã ãããã®é¢æ°ã¯ãäžèšã®ãšã©ãŒãåé¿ããæ¹æ³ãæäŸããŸãã
JMP NEAR OFFSETãŸãã¯PUSH ADDR + RETïŒãããã®ãšã©ãŒã«å¯ŸããŠæãè匱ãªïŒã«ããã¹ãã©ã€ã·ã³ã°ã¯èæ
®ãããŸããã è¯ãæ¹æ³ã§ã¯ãé·ãã®éã¢ã»ã³ãã©ãŒãå®è£
ããã«ããã®ãªãã·ã§ã³ãå¿
èŠã«å¿ããŠã€ã³ã¿ãŒã»ããããããšã¯ã§ããŸããã
1. CreateWindowExWãžã®åŒã³åºããã€ã³ã¿ãŒã»ããããã¢ããªã±ãŒã·ã§ã³ãå®è£
ããŸã
ãŸããã€ã³ã¿ãŒã»ãããè§£é€ãããæç¹ã§ã€ã³ã¿ãŒã»ããããã颿°ã®åŒã³åºããçºçããå¯èœæ§ããããããAPIãã€ã³ã¿ãŒã»ãããããšãã«ããŒã¿ã®æå€±ãæç¢ºã«ç€ºãã¢ããªã±ãŒã·ã§ã³ãæºåããŸãã
æ°ãããããžã§ã¯ããäœæããTMemoãTOpenDialogãTButtonã®3ã€ã®èŠçŽ ãã¡ã€ã³ãã©ãŒã ã«é
眮ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®æ¬è³ªïŒãã¿ã³ãã¯ãªãã¯ããããšãã€ã³ã¿ãŒã»ãããCreateWindowExW颿°ã«èšå®ããããã€ã¢ãã°ã衚瀺ãããŸãã ãã€ã¢ãã°ãéããåŸãTMemoã¯ãã€ã¢ãã°ã«ãã£ãŠäœæããããã¹ãŠã®ãŠã£ã³ããŠã«é¢ããæ
å ±ã衚瀺ããŸãã
ãããè¡ãã«ã¯ã
åã®èšäºã®ã³ãŒãã®äžéšãã€ãŸã次ã®ãã®ãå¿
èŠã§ãã
1.ååã®ããã®åãšå®æ°ã®å®£èšïŒ
const LOCK_JMP_OPKODE: Word = $F9EB; JMP_OPKODE: Word = $E9; type
2. NEAR JMPããã³ã¢ãããã¯ã¬ã³ãŒãã£ã³ã°SHORT JMPãèšé²ããæé
3. THotPachSpliceDataæ§é äœã®åæåããããã«å€æŽ
ãã®ã³ãŒãã¯ãã¹ãŠå¥åã®SpliceHelperã¢ãžã¥ãŒã«ã«é
眮ãããŸããæ¬¡ã®ç« ã§å¿
èŠã«ãªããŸãã
ã¡ã€ã³ãã©ãŒã ã«ç§»ããŸãããã2ã€ã®ã°ããŒãã«å€æ°ãå¿
èŠã§ãã
var HotPathSpliceRec: THotPachSpliceData; WindowList: TStringList;
HotPathSpliceRec倿°ã«ã¯ãã€ã³ã¿ãŒã»ãã¿ãŒã«é¢ããæ
å ±ãå«ãŸããŸãã 2çªç®ã«ã¯ãäœæããããŠã£ã³ããŠã®ãªã¹ããå«ãŸããŸãã
ãã©ãŒã ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãTHotPachSpliceDataæ§é äœãåæåããŸãã
procedure TForm1.FormCreate(Sender: TObject); begin
å
ã®é¢æ°ã®ä»£ããã«åŒã³åºãããã€ã³ã¿ãŒã»ãã¿ãŒé¢æ°ãäœæããŸãã
function InterceptedCreateWindowExW(dwExStyle: DWORD; lpClassName: PWideChar; lpWindowName: PWideChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; var S: string; Index: Integer; begin
ãããŠããã¿ã³ãã³ãã©ãå®è£
ããããã«æåŸã«æ®ããŸãã
procedure TForm1.Button1Click(Sender: TObject); begin
ãã¹ãŠã®æºåãæŽã£ãããããã°ã©ã ãå®è¡ããããšãã§ããŸãã
ãã®ç« ã§å®è£
ãããŠããã³ãŒãã«ã€ããŠã¯è©³ãã説æããŸããã
åã®èšäºã§è©³ãã説æãã以äžã®ãã®ã§ãããããäžåºŠãã€ã³ãããŠãæå³ããããŸããã
ããã°ã©ã ãå®è¡ãããã¿ã³ãã¯ãªãã¯ããŠãããã£ã³ã»ã«ããã¿ã³ãã¯ãªãã¯ããŠãã€ã¢ãã°ãéããŸããæ¬¡ã®ããã«ãªããŸãã

ãããã£ãŠãéåžžã®TOpenDialogãéããšãããŸããŸãªã¯ã©ã¹ã®14ã®ãŠã£ã³ããŠãäœæãããããšãããããŸããã
ããã§ã¯ãå®éã«ããã§ãããã©ããã確èªããŸãããã
2.ã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠã®ããªãŒã衚瀺ããããã®è£å©ãŠãŒãã£ãªãã£ãäœæããŸãã
ã€ã³ã¿ãŒã»ãã¿ãŒã®åäœã確èªããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãŠã£ã³ããŠã®çŸåšã®ãªã¹ãã衚瀺ã§ãããµãŒãããŒãã£ã®ãŠãŒãã£ãªãã£ã䜿çšããŠãã€ã³ã¿ãŒã»ãã¿ãŒã§åä¿¡ãããã¹ãŠã®æ
å ±ã確èªããå¿
èŠããããŸãã
ãã¡ãããSpy ++ãªã©ã®ãµãŒãããŒãã£ããã°ã©ã ã䜿çšã§ããŸãããç§ãã¡ã¯ããã°ã©ããªã®ã§ãç¹ã«å®è£
ããæéãå®ãã®ã§ãèªåã§å®è£
ããå¿
èŠããããŸãã
æ°ãããããžã§ã¯ããäœæããTTreeViewãã¡ã€ã³ãã©ãŒã ã«é
眮ããŠãããæ¬¡ã®ã³ãŒããå®è£
ããŸãã
type TdlgWindowTree = class(TForm) WindowTreeView: TTreeView; procedure FormCreate(Sender: TObject); private procedure Sys_Windows_Tree(Node: TTreeNode; AHandle: HWND; ALevel: Integer); end; ... procedure TdlgWindowTree.FormCreate(Sender: TObject); begin Sys_Windows_Tree(nil, GetDesktopWindow, 0); end; procedure TdlgWindowTree.Sys_Windows_Tree(Node: TTreeNode; AHandle: HWND; ALevel: Integer); type TRootNodeData = record Node: TTreeNode; PID: Cardinal; end; var szClassName, szCaption, szLayoutName: array[0..MAXCHAR - 1] of Char; szFileName : array[0..MAX_PATH - 1] of Char; Result: String; PID, TID: Cardinal; I: Integer; RootItems: array of TRootNodeData; IsNew: Boolean; begin
å®éã«ã¯ãå®è¡ã®ããã«ãã¹ãŠãå®è¡ã§ããŸãã

3.çµæãåæãã
次ã«ãäž¡æ¹ã®ããã°ã©ã ã®çµæãæ¯èŒããŸãã æ¬¡ã®ããã«ããŸãã
1.ã€ã³ã¿ãŒã»ãã¿ãŒã§ããã°ã©ã ãå®è¡ãããã€ã¢ãã°ã衚瀺ãããã¿ã³ãã¯ãªãã¯ããŸãã
2. 2çªç®ã®ç« ãããŠãŒãã£ãªãã£ãå®è¡ããŸã
3.æåã®ããã°ã©ã ã®ãã€ã¢ãã°ãéããŠãã€ã³ã¿ãŒã»ããããããŠã£ã³ããŠã«é¢ããçµæãååŸããŸãã
ç§ãã¡ã¯èŠãŸãïŒ

Auto-Suggest DropDownã¯ã©ã¹ã®ãŠã£ã³ããŠã¯èµ€ã§åŒ·èª¿è¡šç€ºãããŠããŸãããããäœã§ããããèŠãŠã¿ãŸãããã

ããããããã«4ã€ã®ãŠã£ã³ããŠã2ã€ã®ã¹ã¯ããŒã«ããŒãListViewãå«ãŸããŠãããSysHeader32ã®åãä¿æããŠããŸãã ããããããã¯ãã§ã«è峿·±ãã§ãã äž¡æ¹ã®ã¢ããªã±ãŒã·ã§ã³ã®ãŠã£ã³ããŠãã³ãã«ã¯åãã§ãããListViewãSysHeader32ããæåã®ã¢ããªã±ãŒã·ã§ã³ã®2ã€ã®ã¹ã¯ããŒã«ãåãã§ã¯ãããŸããã
ããããæåã®ãªã¹ãã«ãããã衚瀺ãããªããšããäºå®ã¯äœã®æå³ããããŸããã ãããã®ãŠã£ã³ããŠã¯ãã€ã³ã¿ãŒã»ãã¿ãŒãåé€ããããšãã«äœæãããŸãããããã¯ã1ã€ã®çç±ã§ã®ã¿çºçããå¯èœæ§ããããŸããCreateWindowExWãžã®åŒã³åºãã¯ãããèªäœãžã®ååž°åŒã³åºãã«ã€ãªããå¯èœæ§ãããããã§ãã
ãã®ãããã€ã³ã¿ãŒã»ãã¿ãŒã®åé€ãšåŸ©å
ãäžèŠãªæ¹æ³ã§ã€ã³ã¿ãŒã»ãã¿ãŒã³ãŒããå®è£
ããå¿
èŠããããŸãã
4.ååã³ãŒããåé€ããã«ãååãã颿°ãåŒã³åºããŸãã
æåŸã®èšäºã®ãã®åçãèŠãŠã¿ãŸãããã

ãããMessageBoxW颿°ã®å§ãŸãã§ãã æåã®åœä»€ã¯ã5ã€ã®NOPåœä»€ãå
è¡ããäœãããªãåœä»€MOV EDIãEDIã§ãã
ããã¯ãHotPatchã«ããã€ã³ã¿ãŒã»ããã®ããã«æºåããã颿°ã®ã»ãšãã©ããç§ãã¡ãã€ã³ã¿ãŒã»ããããCreateWindowExWãå«ããŠã»ãšãã©åãããã«èŠããŸãã
颿°ãã€ã³ã¿ãŒã»ããããããšãäœãããªãåœä»€ã«ãã£ãŠå æãããå²ãåœãŠããã7ãã€ãã®ä»£ããã«ã次ã®ã³ãŒããé
眮ãããŸãã

å®éãããã¯ã€ã³ã¹ããŒã«ããã€ã³ã¿ãŒã»ãã¿ãŒã§ãã
MOV EDIãEDIåœä»€ã®ä»£ããã«ãJMP -7ã³ãŒããé
眮ãããåã®åœä»€ã«å¶åŸ¡ãç§»ãããŸãã
5ã€ã®NOPåœä»€ã®ä»£ããã«ãã€ã³ã¿ãŒã»ãã¿ãŒé¢æ°ã®å
é ã«ãžã£ã³ãããŸãã
CreateWindowExW颿°ã®éå§ã¢ãã¬ã¹ããã§ã¯ãªãããã®æåã®æçšãªPUSH EBPåœä»€ã®ã¢ãã¬ã¹ããå®è¡ãéå§ããå Žåãã€ã³ã¹ããŒã«ããã€ã³ã¿ãŒã»ãã¿ãŒã«åœ±é¿ãäžããŸãããããã§ããã°ããããåé€ããŠãæå³ããããŸããã
ã³ãŒã圢åŒã§ã¯ã次ã®ããã«ãªããŸãã
type TCreateWindowExW = function(dwExStyle: DWORD; lpClassName: PWideChar; lpWindowName: PWideChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; AMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; function InterceptedCreateWindowExW(dwExStyle: DWORD; lpClassName: PWideChar; lpWindowName: PWideChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall; var S: string; Index: Integer; ACreateWindowExW: TCreateWindowExW; begin
颿°ã®å
é ãã2ãã€ãã®ãªãã»ããã«çããæåã®æçšãªåœä»€ã®ã¢ãã¬ã¹ãèšç®ããåŸãäžæå€æ°ACreateWindowExWã«æ ŒçŽãããã®åŸãéåžžã®æ¹æ³ã§é¢æ°ãåŒã³åºããŸãã
ãã®å Žåã«äœãèµ·ãããèŠãŠã¿ãŸããããããã¯ç§ãã¡ãæåŸ
ãããã®ã§ãïŒ

ãããŠãããã¯ç§ãã¡ã«äžãããããªã¹ãã§èŠã€ãããã®ã§ãã

ããŠããæå€±ããèŠã€ããŸããã14åã§ã¯ãªããTOpenDialogãåŒã³åºããããšãåã26åã®ãŠã£ã³ããŠããã¹ãŠäœæãããŸãã
ããã¯ãã¹ãŠæªåé«ãååž°åŒã³åºãã®åé¡ã§ãããInterceptedCreateWindowExW颿°ã®å
é ã«ãã¬ãŒã¯ãã€ã³ããèšå®ãããšãããã·ãŒãžã£ã³ãŒã«ã¹ã¿ãã¯ã«è¡šç€ºãããŸãã

5.ç°ãªãã¹ã¬ããããããã¯é¢æ°ãåŒã³åºããŠãããšãã«ãšã©ãŒãçºçããŸããã
ãã®ãšã©ãŒã§ã¯ãåãããšãç°¡åã§ãã 颿°ã€ã³ã¿ãŒã»ãã¿ãŒãçµ¶ããåé€ããŠåŸ©å
ãããšãããæç¹ã§ããlock xchg word ptr [ecx]ãaxããšããåœä»€ã®SpliceLockJmp颿°ã§ãšã©ãŒãçºçããŸãã äºå®ããã®æç¹ã§å¥ã®ã¹ã¬ããããã€ã³ã¿ãŒã»ãã¿ãŒã®ã¢ãã¬ã¹ã«ããŒãžå±æ§ãè¿ãæäœãå®äºããããšãã§ããã¹ã¬ããã§ãã®ã¢ãã¬ã¹ãžã®æžã蟌ã¿ãèš±å¯ãããšããäºå®ã«ãããããããå®éã®ããŒãžå±æ§ã¯å®å
šã«ç°ãªããŸãã
ããã¯ãŸãã«ããã®ãã©ã³ãã®äœæè
ãééããåäœã§ãïŒ
recvãã€ã³ã¿ãŒã»ããããŸãã
ãã®ãšã©ãŒã¯ãäžèšãšåãæ¹æ³ã§è§£æ±ºããå¿
èŠããããŸãã
確ãã«ãã€ã³ã¿ãŒã»ãããã³ãã©ãŒãå¿ããŠã¯ãªããŸãããã¹ã¬ããã»ãŒãã§ããããŸããããã³ãã©ãŒã®å®è£
ã¯ãŠãŒã¶ãŒæ¬¡ç¬¬ã§ãã
6.ã€ã³ã¿ãŒã»ããããã颿°ã®æåã®2ãã€ããã¹ãããããããšã¯åžžã«å¯èœã§ããïŒ
è峿·±ã質åãšããã«å¯Ÿããçãã¯ãå¿
ããããããšã¯éããŸããã
HotPatchã¡ãœããã䜿çšããã€ã³ã¿ãŒã»ããã®æ©èœãæºåãããŠããå ŽåãMicrosoftã¯ããã®åã«åžžã«5ã€ã®NOPåœä»€ãããããã®ãããªåæ©èœã¯2ãã€ãåœä»€ã§å§ãŸãããšã®ã¿ãä¿èšŒããŸãã ãã以äžã®ä¿èšŒã¯ãããŸããã
MessageBoxWãŸãã¯CreateWindowExWã³ãŒããèŠããšãæåã®æçšãªPUSH EBPåœä»€ã1ãã€ããå ããããšãããããŸãã ãããã£ãŠãæ¡ä»¶ãæºãããªãããããã®é¢æ°ã®æ¬äœã®åã«ã¯ç©ºã®åŒã³åºãMOV EDIãEDIããããŸãã åãããšã¯ãé·ãã3ãã€ã以äžã®åœä»€ã§å§ãŸã颿°ã«ãåœãŠã¯ãŸããŸãã ãã ãã颿°ã2ãã€ãã®åœä»€ã§å§ãŸãå ŽåãHotPatchã®ãã¹ãŠã®æ¡ä»¶ïŒ5ã€ã®NOPãš2ãã€ãïŒãæºããããããã空ã®ã¹ã¿ãã§æ¬äœãèšããŸããããšã¯æå³ããããŸããã
ãã®å Žåãäžèšã®æ¹æ³ãé©çšãããšããšã©ãŒä»¥å€ã¯è¡šç€ºãããŸããã
ãã®ãããªé¢æ°ã®äŸã¯ãRtlCreateUnicodeStringã§ãã
圹ç«ã€PUSH $ 0Cåœä»€ã§å§ãŸããŸãã

æãç°¡åãªè§£æ±ºçã¯ãå
ã®é¢æ°ãåŒã³åºãåã«å
ã®åœä»€ã埩å
ããããšã§ãããæåããèšã£ãããã«ãããã«ã¯ãšã©ãŒããããããããŸãã
ãããã£ãŠãç§ãã¡ã¯ä»äºã«çŽé¢ããŸãã-劚害ãããåœä»€ãžã®åŒã³åºããæäŸããã€ã³ã¿ãŒã»ããã³ãŒãã»ããããã£ãŠã颿°ã®æ©èœãä¿èšŒããïŒ

ååãšããŠãè©°ãŸã£ãåœä»€ã®ãã·ã³ã³ãŒãããããããã¯HotPathSpliceRec.LockJmpæ§é ã«æ ŒçŽãããŠããŸãããããã€ãã®çç±ã§çŽæ¥åŒã³åºãããšã¯ã§ããŸããã
ãŸããæåã«ããã®æ§é ã¯ããŒãäžã«ãããŸãïŒããæ£ç¢ºã«ã¯ãããŒãäžã§ã¯ãªããå²ãåœãŠãããã¡ã¢ãªå
ã«ãããŸããããã¯ãDelphiãããŒãã¡ã«ããºã ãšçŽæ¥é£æºããªãããã§ãïŒã ã¢ãã¬ã¹HotPathSpliceRec.LockJmpã§CALLãäœããã®æ¹æ³ã§å®è¡ãããšããšã©ãŒãçºçããŸãã
ãã¡ãããæ£ããããŒãžå±æ§ãèšå®ã§ããŸãããããã¯é¢åã§ããããããå®è¡å¯èœã³ãŒããããŒã¿é åãšæ··åããªãã§ãã ããã
第äºã«ãå®è¡ããã®åœä»€ã«è»¢éããå Žåã§ããåŒã³åºãããåœä»€ã®ãªãã»ãããèæ
®ããŠãJMPåœä»€ããã®åŸã®æ£ããã¢ãã¬ã¹ã«åŒ·å¶ããå¿
èŠããããŸãïŒãã®å Žåã$ 77B062FBã«ãªããŸããåã®å³ãåç
§ïŒã
第äžã«ãåŒã³åºãã«å ããŠãåŒã³åºããã颿°ã«æž¡ããããã©ã¡ãŒã¿ãŒãæ£ããé åºã§ã¹ã¿ãã¯ã«é
眮ããå¿
èŠããããŸããããã«ãããå°ãªããšãasmæ¿å
¥ã䜿çšããå¿
èŠãçããŸãã
ãã¹ãŠãé çªã«è§£æ±ºããŠã¿ãŸããããASMæ¿å
¥ããã®ãã©ã¡ãŒã¿ãŒã®åãæž¡ãã«é¢äžããªãããã«ããã®ã¿ã¹ã¯ãã³ã³ãã€ã©ãŒã«å²ãåœãŠãããšã«ãããäœããã®çš®é¡ã®ã¹ããªã³ã°ããŒãæ©èœãå®è£
ã§ããŸãã
ã€ãŸã ããããæ¬¡ã®ãããªã€ã³ã¿ãŒã»ãã¿ãŒãäœæããŸãã
function TrampolineRtlCreateUnicodeString(DestinationString: PUNICODE_STRING; SourceString: PWideChar): Integer; stdcall; begin asm db $90, $90, $90, $90, $90, $90, $90 end; end; function InterceptedRtlCreateUnicodeString(DestinationString: PUNICODE_STRING; SourceString: PWideChar): Integer; stdcall; begin Result := TrampolineRtlCreateUnicodeString(DestinationString, SourceString); ShowMessage(DestinationString^.Buffer); end;
ãã®å Žåãã€ã³ã¿ãŒã»ãã¿ãŒã¯ã¹ããªã³ã°ããŒãåŒã³åºããšãã®ã³ã°ãåŠçããŸãã
ã¹ããªã³ã°ããŒã颿°å
ã§ã¯ã7ãã€ããäºçŽãããŠããŸããããã¯ã2ãã€ãã®è©°ãŸã£ãåœä»€ãš5ãã€ãã®NEAR JMPãæžãã®ã«ååãªéã§ãã
颿°èªäœã¯ã³ãŒãé åã«ããããã®åŒã³åºãã§åé¡ãåŒãèµ·ããããšã¯ãããŸããã
ãããŠä»ãéèŠãªãã¥ã¢ã³ã¹ã
äºçŽæžã¿ãããã¯ã®ä»£ããã«ãããã®7ãã€ããæžã蟌ããšãDelphiã®1ã€ã®äžå¿«ãªæ©èœã«ééããŸãã å®éãDelphiã³ã³ãã€ã©ã¯ã»ãšãã©ã®å Žåã颿°ã®ããããŒã°ãšãšãããŒã°ãçæããŸãã
ããšãã°ããããã®åŸã颿°ã®ã³ãŒããæ¬¡ã®ããã«ãªã£ããšããŸãã
function TrampolineRtlCreateUnicodeString(DestinationString: PUNICODE_STRING; SourceString: PWideChar): Integer; stdcall; begin asm push $0C
å®éãæ¬¡ã®ããã«ãªããŸãã

ã€ãŸã ã¹ã¿ãã¯ã«ã¯ã2ã€ã®ãã©ã¡ãŒã¿ãŒDestinationStringããã³SourceStringã®ä»£ããã«ãEBPããã³ECXã¬ãžã¹ã¿ãŒã®å€ãé
眮ãããŸããããã«ããããŸã£ããäºæž¬ã§ããªãçµæãçããŸãã
ããã¯çµ¶å¯Ÿã«å¿
èŠã§ã¯ãªãã®ã§ãç°¡åã«è¡ããŸããã€ãŸããã¹ããªã³ã°ããŒãã³ãŒãã¯ãã®é¢æ°ã®æåããçŽæ¥èšè¿°ããã颿°ããããŒã°ã®æç€ºãäžæžãããŸãã
ããããå®éã«ã¯ããããã®æç€ºã¯çµ¶å¯Ÿã«å¿
èŠãããŸããã ã€ã³ã¿ãŒã»ããããã颿°ã®æ¬äœãšãã®å®è¡ã«ãžã£ã³ãããåŸãã³ã³ãããŒã«ã¯ãã¢ã¯ã·ã§ã³ã«ãã£ãŠæªããããã¹ããªã³ã°ããŒã颿°ã§ã¯ãªããåŒã³åºãããå Žæã«çŽæ¥æ»ããŸãã 颿°ã®ååã¯ãã³ãã©ãŒã§ãã
ãããã£ãŠãã€ã³ã¿ãŒã»ãã¿ãŒã®åæåã¯æ¬¡ã®æ¹æ³ã§å®è£
ããŸãã
ã€ã³ã¿ãŒã»ããããã颿°èªäœã®åæåãšåŒã³åºãã¯æ¬¡ã®ãšããã§ãã
type UNICODE_STRING = record Length: WORD; MaximumLength: WORD; Buffer: PWideChar; end; PUNICODE_STRING = ^UNICODE_STRING; function RtlCreateUnicodeString(DestinationString: PUNICODE_STRING; SourceString: PWideChar): BOOLEAN; stdcall; external 'ntdll.dll'; ... procedure TForm2.FormCreate(Sender: TObject); begin
ããã§ããã¿ã³ãã¯ãªãã¯ããŠãååã®çµæãã¡ãã»ãŒãžã®åœ¢ã§èŠãããšãã§ããŸãã
çµè«ãšããŠ
ãã®çµæã第6ç« ã«ç€ºãããŠããã¹ãã©ã€ã·ã³ã°å®è£
ãªãã·ã§ã³ã¯ãHotPatchçšã«æºåããã颿°ã®ã€ã³ã¿ãŒã»ããã®å Žåã«æãäžè¬çã§ãã ããã¯ãMOV EDIãEDIã¹ã¿ãã®å Žåãããã³ã€ã³ã¿ãŒã»ããããã颿°ã®å
é ã«ããæçšãªåœä»€ã®å Žåã«æ£ããæ©èœããŸãã èšäºã®åé ã§èª¬æãããšã©ãŒã®åœ±é¿ã¯åããŸãããããã®ã¢ã«ãŽãªãºã ã䜿çšããŠéåžžã®æ©èœãååããããšã¯ã§ããŸãã
ã ãããã«ã€ããŠã¯
以åã«
æžããŸã
ã ã
æ
å ±ãæçã«åå²ããŠäžåºŠã«ãã¹ãŠãæäŸããå¿
èŠããªãããšããaã³ããŸããã1幎åã«ã¢ããã€ã¹ãããããã«ãå
å®¹ãæ¶åããæéãããããã«è³æãå°ããã€æäŸããããšããå§ãããŸã:)
äžæ¹ããã¹ãŠã®çŽ æãããŒãã«å
¥ãããšããŸãæéãããããŸãããããã¯ç§ã«ã¯ãããŸãããæ¬¡ã«ã倧éã®ããã«å€èªã§ããŸããïŒåäŸããããŸããïŒã
ãããã£ãŠããã®æ¹ãè¯ãã§ãã
ãã®ãªã³ã¯ãããµã³ãã«ã®ãœãŒã¹ã³ãŒããååŸã§ããŸãã
©AlexanderïŒRouse_ïŒããŒã°ã«
2013幎5æ