рд╣реЙрдЯрдкреИрдЪ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рджреМрд░рд╛рди рдЙрдЪрд┐рдд рд╕реНрдкреНрд▓рд┐рд╕рд┐рдВрдЧ

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрдирдХреЗ рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рд╕рд╣рд┐рдд рдЕрд╡рд░реЛрдзрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рдБрдЪ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреАред

рд╕рдЪ рд╣реИ, рдЗрд╕рдореЗрдВ рдореИрдВрдиреЗ рдЙрди рджреЛ рдЕрдкреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ рдЬрд┐рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
1. рдЬрдм рдЬрд╛рд▓ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕ рд╕рдордп рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
2. рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рд╛рде рдХреЙрд▓ред

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЙрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
рджреВрд╕рд░рд╛ рдорд╛рдорд▓рд╛ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдзрдордХреА рджреЗрддрд╛ рд╣реИ, рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрддрди рддрдХ рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред

рдпреЗ рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рддрднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрдм рд╕реНрдкрд╛рдЗрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдЖрдпрд╛рдд / рдирд┐рд░реНрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдЖрджрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╡рд░реЛрдзрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдмреЙрдбреА рдореЙрдбрд┐рдлрд┐рдХреЗрд╢рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЗ рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдмреЙрдбреА рдореВрд╡рдореЗрдВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдпрд╣ рдЖрд▓реЗрдЦ рд╣реЙрдкрдкреИрдЪ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рд╕реНрдкреНрд▓рд┐рдВрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпреЗ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

JMP NEAR OFFSET рдпрд╛ PUSH ADDR + RET рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рднрд╛рдЬрди (рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдХрдордЬреЛрд░) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдПрдХ рд▓рдВрдмрд╛рдИ disassembler рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдП рдмрд┐рдирд╛, рдпрд╣ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред



1. рд╣рдо CreateWindowExW рдХреЛ рдХреЙрд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рддреЗ рд╣реБрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддреИрдпрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдПрдкреАрдЖрдИ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рддреЗ рд╕рдордп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдЙрд╕ рд╕рдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдЗрд╕реЗ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рддреАрди рддрддреНрд╡реЛрдВ рдХреЛ рд░рдЦреЗрдВ: рдЯреАрдореЗрдореЛ, рдЯреВрдкреЗрдирдбрд┐рдпрд▓реЙрдЧ рдФрд░ рдЯреАрдмреВрдЯрдиред

рдЖрд╡реЗрджрди рдХрд╛ рд╕рд╛рд░: рдЬрдм рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрд╡рд░реЛрдзрди CreateWindowExW рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рд╕рдВрд╡рд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрд╡рд╛рдж рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, TMemo рд╕рдВрд╡рд╛рдж рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╕рднреА рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдХреЛрдб рдХреЗ рдПрдХ рднрд╛рдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:

1. рдЕрд╡рд░реЛрдзрди рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдШреЛрд╖рдгрд╛:

const LOCK_JMP_OPKODE: Word = $F9EB; JMP_OPKODE: Word = $E9; type //      JMP NEAR OFFSET TNearJmpSpliceRec = packed record JmpOpcode: Byte; Offset: DWORD; end; THotPachSpliceData = packed record FuncAddr: FARPROC; SpliceRec: TNearJmpSpliceRec; LockJmp: Word; end; const NearJmpSpliceRecSize = SizeOf(TNearJmpSpliceRec); LockJmpOpcodeSize = SizeOf(Word); 


2. NEAR JMP рдФрд░ рдкрд░рдорд╛рдгреБ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ SHMP JMP рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛

 //         procedure SpliceNearJmp(FuncAddr: Pointer; NewData: TNearJmpSpliceRec); var OldProtect: DWORD; begin VirtualProtect(FuncAddr, NearJmpSpliceRecSize, PAGE_EXECUTE_READWRITE, OldProtect); try Move(NewData, FuncAddr^, NearJmpSpliceRecSize); finally VirtualProtect(FuncAddr, NearJmpSpliceRecSize, OldProtect, OldProtect); end; end; //         procedure SpliceLockJmp(FuncAddr: Pointer; NewData: Word); var OldProtect: DWORD; begin VirtualProtect(FuncAddr, LockJmpOpcodeSize, PAGE_EXECUTE_READWRITE, OldProtect); try asm mov ax, NewData mov ecx, FuncAddr lock xchg word ptr [ecx], ax end; finally VirtualProtect(FuncAddr, LockJmpOpcodeSize, OldProtect, OldProtect); end; end; 


3. рдереЛрдерд╛рдкрд╛рд╕реНрдХрдкреНрд▓рд┐рд╕рдбрд╛рдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдкреНрд░рд╛рд░рдВрдн

 //       procedure InitHotPatchSpliceRec(const LibraryName, FunctionName: string; InterceptHandler: Pointer; out HotPathSpliceRec: THotPachSpliceData); begin //      HotPathSpliceRec.FuncAddr := GetProcAddress(GetModuleHandle(PChar(LibraryName)), PChar(FunctionName)); //      ,     Move(HotPathSpliceRec.FuncAddr^, HotPathSpliceRec.LockJmp, LockJmpOpcodeSize); //   JMP NEAR HotPathSpliceRec.SpliceRec.JmpOpcode := JMP_OPKODE; //    (  NearJmpSpliceRecSize  , // ..     ) HotPathSpliceRec.SpliceRec.Offset := PAnsiChar(InterceptHandler) - PAnsiChar(HotPathSpliceRec.FuncAddr); end; 


рдпрд╣ рд╕рдм рдХреЛрдб рдПрдХ рдЕрд▓рдЧ SpliceHelper рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдзреНрдпрд╛рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдЕрдм рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рджреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдЪрд╛рд╣рд┐рдП:

 var HotPathSpliceRec: THotPachSpliceData; WindowList: TStringList; 


HotPathSpliceRec рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред рджреВрд╕рд░реЗ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдЧреАред

рдкреНрд░рдкрддреНрд░ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ, THotPachSpliceData рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред

 procedure TForm1.FormCreate(Sender: TObject); begin //     InitHotPatchSpliceRec(user32, 'CreateWindowExW', @InterceptedCreateWindowExW, HotPathSpliceRec); //     NOP- SpliceNearJmp(PAnsiChar(HotPathSpliceRec.FuncAddr) - NearJmpSpliceRecSize, HotPathSpliceRec.SpliceRec); end; 


рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВред

 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 //   SpliceLockJmp(HotPathSpliceRec.FuncAddr, HotPathSpliceRec.LockJmp); try //      Index := -1; if not IsBadReadPtr(lpClassName, 1) then begin S := 'ClassName: ' + string(lpClassName); S := IntToStr(WindowList.Count + 1) + ': ' + S; Index := WindowList.Add(S); end; //    Result := CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); //       if Index >= 0 then begin S := S + ', handle: ' + IntToStr(Result); WindowList[Index] := S; end; finally //   SpliceLockJmp(HotPathSpliceRec.FuncAddr, LOCK_JMP_OPKODE); end; end; 


рдФрд░ рдпрд╣ рдмрдЯрди рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред

 procedure TForm1.Button1Click(Sender: TObject); begin //  CreateWindowExW SpliceLockJmp(HotPathSpliceRec.FuncAddr, LOCK_JMP_OPKODE); try //           WindowList := TStringList.Create; try //   OpenDialog1.Execute; //      Memo1.Lines.Text := WindowList.Text; finally WindowList.Free; end; finally //   SpliceLockJmp(HotPathSpliceRec.FuncAddr, HotPathSpliceRec.LockJmp); end; end; 


рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдпрд╣ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ, рджреВрд╕рд░реА рдмрд╛рд░ рдкреЗрдВрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВ, рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ "рд░рджреНрдж рдХрд░реЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╕рдВрд╡рд╛рдж рдмрдВрдж рдХрд░реЗрдВ, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЬрдм рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ TOpenDialog рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреА 14 рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред

рдЕрдм рдкрддрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реИред

2. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдХреЗ рдкреЗрдбрд╝ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдирд╛рдПрдВред


рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд╕рд╛рде рдмреАрдорд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдорд┐рд▓реА рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрдкрд╛рдИ ++ рдЬреИрд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╕рд╕реНрддрд╛ рд╣реИред

рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ 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 //      while AHandle <> 0 do begin //    GetClassName(AHandle, szClassName, MAXCHAR); //  ( Caption)  GetWindowText(AHandle, szCaption, MAXCHAR); //    if GetWindowModuleFilename(AHandle, szFileName, SizeOf(szFileName)) = 0 then FillChar(szFileName, 256, #0); TID := GetWindowThreadProcessId(AHandle, PID); //   AttachThreadInput(GetCurrentThreadId, TID, True); VerLanguageName(GetKeyboardLayout(TID) and $FFFF, szLayoutName, MAXCHAR); AttachThreadInput(GetCurrentThreadId, TID, False); //  Result := Format('%s [%s] Caption = %s, Handle = %d, Layout = %s', [String(szClassName), String(szFileName), String(szCaption), AHandle, String(szLayoutName)]); //       if ALevel in [0..1] then begin IsNew := True; for I := 0 to Length(RootItems) - 1 do if RootItems[I].PID = PID then begin Node := RootItems[I].Node; IsNew := False; Break; end; if IsNew then begin SetLength(RootItems, Length(RootItems) + 1); RootItems[Length(RootItems) - 1].PID := PID; RootItems[Length(RootItems) - 1].Node := WindowTreeView.Items.AddChild(nil, 'PID: ' + IntToStr(PID)); Node := RootItems[Length(RootItems) - 1].Node; end; end; //   Sys_Windows_Tree(WindowTreeView.Items.AddChild(Node, Result), GetWindow(AHandle, GW_CHILD), ALevel + 1); //   ( )  AHandle := GetNextWindow(AHandle, GW_HWNDNEXT); end; end; 


рджрд░рдЕрд╕рд▓, рд╕рдм рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдЫрд╡рд┐

3. рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ


рдЕрдм рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рд╣рдо рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
1. рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВ рдФрд░ рдЙрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдЬреЛ рд╕рдВрд╡рд╛рдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
2. рджреВрд╕рд░реЗ рдЕрдзреНрдпрд╛рдп рд╕реЗ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдЪрд▓рд╛рдПрдВ
3. рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рд╡рд┐рдВрдбреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рдВрд╡рд╛рдж рдХреЛ рдмрдВрдж рдХрд░реЗрдВред

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдСрдЯреЛ-рд╕реБрдЭрд╛рд╡ рдбреНрд░реЙрдкрдбрд╛рдЙрди рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛ рдХреЛ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ:

рдЫрд╡рд┐

рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ 4 рдФрд░ рд╡рд┐рдВрдбреЛ, рджреЛ рд╕реНрдХреНрд░реЛрд▓рдмрд╛рд░, рд▓рд┐рд╕реНрдЯ рд╡реНрдпреВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ SysHeader32 рдмрдЪреНрдЪрд╛ рднреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рджреЛрдиреЛрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рдВрдбреЛ рд╣реИрдВрдбрд▓ рдПрдХ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рди рддреЛ рд╕реВрдЪреА рджреГрд╢реНрдп, рдФрд░ рди рд╣реА SysHeader32, рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди рдореЗрдВ рджреЛ рд╕реНрдХреНрд░реЙрд▓ рднреА рдирд╣реАрдВ рд╣реИрдВред

рд▓реЗрдХрд┐рди, рдпрд╣ рддрдереНрдп рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реА рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЗрди рд╡рд┐рдВрдбреЛ рдХреЛ рдЙрд╕ рд╕рдордп рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░рдг рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдХреНрдпреЛрдВрдХрд┐ CreateWindowExW рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЦреБрдж рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред

рддреЛ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЕрд╡рд░реЛрдзрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

4. рдЕрд╡рд░реЛрдзрди рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдП рдмрд┐рдирд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред


рдЖрдЗрдП рдЗрд╕ рддрд╕реНрд╡реАрд░ рдХреЛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рджреЗрдЦреЗрдВред

рдЫрд╡рд┐

рдпрд╣ MessageBoxW рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд╛рдВрдЪ рдПрдирдУрдкреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдП рдЧрдП рдПрдордУрд╡реА рдИрдбреАрдЖрдИ, рдИрдбреАрдЖрдИ, рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ HotPatch рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реЛрдзрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ CreateWindowExW рд╢рд╛рдорд┐рд▓ рд╣реИред

рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рдХреЛрдб рдХреБрдЫ рднреА рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдд рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛:

рдЫрд╡рд┐

рджрд░рдЕрд╕рд▓, рдпрд╣ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИред
MOV EDI, EDI рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрдЬрд╛рдп, JMP -7 рдХреЛрдб рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдкрд┐рдЫрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдкрд╛рдВрдЪ рдПрдирдУрдкреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдХреВрдж рд╣реИред

рдпрджрд┐ рд╣рдо 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 //      Index := -1; if not IsBadReadPtr(lpClassName, 1) then begin S := 'ClassName: ' + string(lpClassName); S := IntToStr(WindowList.Count + 1) + ': ' + S; Index := WindowList.Add(S); end; //    @ACreateWindowExW := PAnsiChar(HotPathSpliceRec.FuncAddr) + LockJmpOpcodeSize; Result := ACreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); //       if Index >= 0 then begin S := S + ', handle: ' + IntToStr(Result); WindowList[Index] := S; end; end; 


рджреЛ рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧреА рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ ACreateWindowExW рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдФрд░ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рджреА рдЧрдИ рд╕реВрдЪреА рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдЕрдкрдиреЗ "рдиреБрдХрд╕рд╛рди" рдХреЛ рдкрд╛рдпрд╛, рд╕рднреА 26 рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ рдЬрдм TOpenDialog рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ 14 рдирд╣реАрдВред

рдпрд╣ рд╕рднреА рдХреБрдЦреНрдпрд╛рдд рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХрд╛ рдорд╛рдорд▓рд╛ рдерд╛, рдЬрд┐рд╕реЗ рдпрджрд┐ рдЖрдк рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдХреНрд░рд┐рдПрдЯрд╡рд┐рдВрдбреЛрдПрдХреНрд╕рдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЫрд╡рд┐

5. рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рд╕реЗ рд╣реБрдХ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИред


рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде, рд╡рд╣реА рд╕рд░рд▓ рд╣реИред рдпрджрд┐ рдЖрдк рд▓рдЧрд╛рддрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рд╣рдореЗрдВ "рд▓реЙрдХ xchg рд╢рдмреНрдж ptr [ecx], рдХреБрд▓реНрд╣рд╛рдбрд╝реА" рдирд┐рд░реНрджреЗрд╢ рдкрд░ SpliceLockJmp рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдордп рдкреГрд╖реНрда рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рдкрддреЗ рдкрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рдорд╛рд░реЗ рдереНрд░реЗрдб рдореЗрдВ рд╣рдордиреЗ рдЗрд╕ рдкрддреЗ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреГрд╖реНрда рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдВрдЧреАред

рдпрд╣ рдареАрдХ рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рд╛рдордирд╛ рдЗрд╕ рд╢рд╛рдЦрд╛ рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдХрд┐рдпрд╛ рдерд╛: рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд┐рдВрдЧ рд░рд┐рдХрд╡ ред

рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЙрд╕реА рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕рдЪ рд╣реИ, рдХрд┐рд╕реА рдХреЛ рдЕрд╡рд░реЛрдзрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдереНрд░реЗрдбрд╕реЗрдлрд╝ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред

6. рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП?


рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╡рд╛рд▓ рдФрд░ рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рд╣реИред
рдЬрдм HotPatch рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╡рд░реЛрдзрди рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ Microsoft рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдЙрдирдХреЗ рд╕рд╛рдордиреЗ рдкрд╛рдВрдЪ рдПрдирдУрдкреА рдирд┐рд░реНрджреЗрд╢ рд╣реЛрдВрдЧреЗ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдПрдХ рдбрдмрд▓-рдмрд╛рдЗрдЯ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк MessageBoxW рдпрд╛ CreateWindowExW рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдкрд╣рд▓рд╛ рдЙрдкрдпреЛрдЧреА PUSH EBP рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдмрд╛рдЗрдЯ рд▓реЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЪреВрдВрдХрд┐ рдпрд╣ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╢рд░реАрд░ рдЦрд╛рд▓реА рдХреЙрд▓ MOV EDI, EDI рд╕реЗ рдкрд╣рд▓реЗ рд╣реИред рд▓рдВрдмрд╛рдИ рдореЗрдВ рддреАрди рдпрд╛ рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рджреЛ-рдмрд╛рдЗрдЯ рдЕрдиреБрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЦрд╛рд▓реА рд╕реНрдЯрдм рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╢рд░реАрд░ рдХреЛ рдлреБрд▓рд╛рдП рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣реЙрдЯрдкреИрдЪ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛрддреА рд╣реИрдВ (рдкрд╛рдВрдЪ рдПрдирдУрдкреА рдФрд░ 2 рдмрд╛рдЗрдЯреНрд╕)ред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рд╣рдо рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗред

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг RtlCreateUnicodeString рд╣реИред
рдпрд╣ рд╕рд╣рд╛рдпрдХ PUSH $ 0C рдЕрдиреБрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рдЫрд╡рд┐

рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╕рдорд╛рдзрд╛рди рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореВрд▓ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдХрд╣рд╛, рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднрд░рд╛ рд╣реБрдЖ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ - рдПрдХ рдЬрд╛рдо рдХрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдФрд░ рдЕрд╡рд░реЛрдзрди рдХреЛрдб рдХреЗ рд╕рд╛рде рднреА рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдЫрд╡рд┐

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрд╛рдо рдХрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдорд╢реАрди рдХреЛрдб рд╣реИ рдФрд░ рдЗрд╕реЗ HotPathSpliceRec.LockJmp рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рд╕реАрдзреЗ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗред

рдЦреИрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдвреЗрд░ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ (рдареАрдХ рд╣реИ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдвреЗрд░ рдкрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрд▓реНрдлреА рд╕реАрдзреЗ рд╣реАрдк рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдирд┐рд╖реНрдкрд╛рджрди рдЧреБрдг рдирд╣реАрдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ CAL рдХреЛ рдПрдбреНрд░реЗрд╕рдкрд╛рдЯрдкрд╛рдЗрд╕iceRec.LockJmp рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред

рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рдкреГрд╖реНрда рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╣реА рднрджреНрджрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЛ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рджреВрд╕рд░реЗ, рднрд▓реЗ рд╣реА рд╣рдо рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ JMP рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рдж рд╕рд╣реА рдкрддреЗ рдкрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ $ 77B062FB рд╣реЛрдЧрд╛, рдкрд┐рдЫрд▓реА рддрд╕реНрд╡реАрд░ рджреЗрдЦреЗрдВ), рдЬреЛ рдХрд┐ рдмреБрд▓рд╛рдП рдЧрдП рдЕрдиреБрджреЗрд╢ рдХреА рднрд░рдкрд╛рдИ рдХрд░рддрд╛ рд╣реИред

рддреАрд╕рд░рд╛, рдХреЙрд▓ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╣рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдЬрдЧрд╣ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдлрдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо рд╣рдореЗрдВ рдПрд╕рдо рдЖрд╡реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред

рдЪрд▓реЛ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

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 рдмрд╛рдЗрдЯреНрд╕ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ-рдмрд╛рдЗрдЯ рдЬрд╛рдо рдЕрдиреБрджреЗрд╢ рдФрд░ рдкрд╛рдВрдЪ-рдмрд╛рдЗрдЯ NEAR JMP рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рдХреЛрдб рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЖрд╣реНрд╡рд╛рди рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рдЕрдм рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рд░реАрдХрд┐рдпреЛрдВред
рдпрджрд┐ рд╣рдо рдЖрд░рдХреНрд╖рд┐рдд рдмреНрд▓реЙрдХ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЗрди 7 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдбреЗрд▓реНрдлреА рдХреА рдПрдХ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЖрдПрдВрдЧреЗред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрд▓реНрдлреА рд╕рдВрдХрд▓рдХ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рдВрд╣рд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдкреИрдЪ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрд╛:

 function TrampolineRtlCreateUnicodeString(DestinationString: PUNICODE_STRING; SourceString: PWideChar): Integer; stdcall; begin asm push $0C //    jmp $77B062FB //      end; end; 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:

рдЫрд╡рд┐

рдпрд╛рдиреА рд╕реНрдЯреИрдХ рдкрд░, рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рдирд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рд╕реЛрд░реНрд╕рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдИрдмреАрдкреА рдФрд░ рдИрд╕реАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрд┐рд▓реНрдХреБрд▓ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реЛрдВрдЧреЗред

рд╣рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЕрдзрд┐рдХ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд░рдВрдн рд╕реЗ рд╣реА рд╕реНрдкреНрд░рд┐рдВрдЧрдмреЛрд░реНрдб рдХреЛрдб рд╕рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░реЛрд▓реЙрдЧ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд┐рдЦ рджреЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдХреВрджрдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж, рдирд┐рдпрдВрддреНрд░рдг рдЙрд╕ рд╕реНрдкреНрд░рд┐рдВрдЧрдмреЛрд░реНрдб рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдирд╣реАрдВ рд▓реМрдЯреЗрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд╡рд┐рдХреГрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАрдзреЗ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреНред рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реЛрдзрди рд╣реИрдВрдбрд▓рд░ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

 //            procedure InitHotPatchSpliceRecEx(const LibraryName, FunctionName: string; InterceptHandler, Trampoline: Pointer; out HotPathSpliceRec: THotPachSpliceData); var OldProtect: DWORD; TrampolineSplice: TNearJmpSpliceRec; begin //      HotPathSpliceRec.FuncAddr := GetProcAddress(GetModuleHandle(PChar(LibraryName)), PChar(FunctionName)); //      ,     Move(HotPathSpliceRec.FuncAddr^, HotPathSpliceRec.LockJmp, LockJmpOpcodeSize); //   VirtualProtect(Trampoline, LockJmpOpcodeSize + NearJmpSpliceRecSize, PAGE_EXECUTE_READWRITE, OldProtect); try Move(HotPathSpliceRec.LockJmp, Trampoline^, LockJmpOpcodeSize); TrampolineSplice.JmpOpcode := JMP_OPKODE; TrampolineSplice.Offset := PAnsiChar(HotPathSpliceRec.FuncAddr) - PAnsiChar(Trampoline) - NearJmpSpliceRecSize; Trampoline := PAnsiChar(Trampoline) + LockJmpOpcodeSize; Move(TrampolineSplice, Trampoline^, SizeOf(TNearJmpSpliceRec)); finally VirtualProtect(Trampoline, LockJmpOpcodeSize + NearJmpSpliceRecSize, OldProtect, OldProtect); end; //   JMP NEAR HotPathSpliceRec.SpliceRec.JmpOpcode := JMP_OPKODE; //    (  NearJmpSpliceRecSize  , // ..     ) HotPathSpliceRec.SpliceRec.Offset := PAnsiChar(InterceptHandler) - PAnsiChar(HotPathSpliceRec.FuncAddr); end; 


рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯреЗрдб рдлрдВрдХреНрд╢рди рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг рдФрд░ рдордВрдЧрд▓рд╛рдЪрд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 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 //       InitHotPatchSpliceRecEx('ntdll.dll', 'RtlCreateUnicodeString', @InterceptedRtlCreateUnicodeString, @TrampolineRtlCreateUnicodeString, HotPathSpliceRec); //     NOP- SpliceNearJmp(PAnsiChar(HotPathSpliceRec.FuncAddr) - NearJmpSpliceRecSize, HotPathSpliceRec.SpliceRec); end; procedure TForm2.Button1Click(Sender: TObject); var US: UNICODE_STRING; begin //  RtlCreateUnicodeString SpliceLockJmp(HotPathSpliceRec.FuncAddr, LOCK_JMP_OPKODE); try RtlCreateUnicodeString(@US, 'Test UNICODE String'); finally //   SpliceLockJmp(HotPathSpliceRec.FuncAddr, HotPathSpliceRec.LockJmp); end; end; 


рдЕрдм рдЖрдк рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╡рд░реЛрдзрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЫрдареЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╕реНрдкреНрд▓рд┐рд╕рд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк, рд╣реЙрдЯрдкреИрдЪ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд╡рд░реЛрдзрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИред рдпрд╣ рдПрдордУрд╡реА рдИрдбреАрдЖрдИ, рдИрдбреАрдЖрдИ рд╕реНрдЯрдм рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрд╡рд░реЛрдзрди рд╣реЛрдиреЗ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдЕрдзреАрди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░реЛрдХрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ ред

рдореИрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдХреЛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рдереА, рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЫреЛрдЯреЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рджреЗрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдкрдЪрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛ :)

рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЖрдк рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ рдвреЗрд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рд▓рдЧреЗрдЧрд╛, рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЕрдкрдардиреАрдп рд╣реЛрдЧрд╛ (рдкреВрд░реНрд╡ рдЙрджрд╛рд╣рд░рдг рдереЗ)ред
рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рд░рд╛рд╕реНрддрд╛ред

рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЗрд╕ рд▓рд┐рдВрдХ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

┬й рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ (Rouse_) Bagel
рдордИ 2013

Source: https://habr.com/ru/post/In181157/


All Articles