SHARE
TWEET

fixpopen

finalpatch Aug 31st, 2014 322 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. library fixpopen;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. uses
  6.   Classes, lua, lauxlib, lualib, windows;
  7.  
  8. type
  9.   {$PACKRECORDS 1}
  10.   TThunk = record
  11.     jmp   : byte;
  12.     offset: longword;
  13.   end;
  14.   {$PACKRECORDS DEFAULT}
  15.   TCreateProcess = function (lpApplicationName:LPCSTR; lpCommandLine:LPSTR;
  16.                          lpProcessAttributes:LPSECURITY_ATTRIBUTES;
  17.                          lpThreadAttributes:LPSECURITY_ATTRIBUTES;
  18.                          bInheritHandles:WINBOOL;dwCreationFlags:DWORD;
  19.                          lpEnvironment:LPVOID;lpCurrentDirectory:LPCSTR;
  20.                          lpStartupInfo:LPSTARTUPINFO;
  21.                          lpProcessInformation:LPPROCESS_INFORMATION):WINBOOL;stdcall;
  22.  
  23. var
  24.   thunk : TThunk = (jmp:$e9; offset:$0);
  25.   save  : TThunk = (jmp:$0;  offset:$0);
  26.   w32CreateProcess : TCreateProcess = nil;
  27.   protect : DWORD = 0;
  28.  
  29. function patch(L:Plua_State):integer;cdecl;
  30. var
  31.   bret: BOOL;
  32. begin
  33.   //OutputDebugString('patching');
  34.   bret:=VirtualProtect(w32CreateProcess, sizeof(TThunk), PAGE_EXECUTE_READWRITE, @protect);
  35.   CopyMemory(w32CreateProcess, @thunk, sizeof(TThunk));
  36.   VirtualProtect(w32CreateProcess, sizeof(TThunk), protect, nil);
  37.   //OutputDebugString('done');
  38.   result:=1;
  39. end;
  40.  
  41. function unpatch(L:Plua_State):integer;cdecl;
  42. var
  43.   bret: BOOL;
  44. begin
  45.   //OutputDebugString('unpatching');
  46.   VirtualProtect(w32CreateProcess, sizeof(TThunk), PAGE_EXECUTE_READWRITE, @protect);
  47.   CopyMemory(w32CreateProcess, @save, sizeof(TThunk));
  48.   VirtualProtect(w32CreateProcess, sizeof(TThunk), protect, nil);
  49.   //OutputDebugString('done');
  50.   result:=1;
  51. end;
  52.  
  53. function libinit(L:Plua_State):integer;cdecl;export;
  54. begin
  55.   lua_register(L, 'fix_popen_patch', @patch);
  56.   lua_register(L, 'fix_popen_unpatch', @unpatch);
  57.   //OutputDebugString('registered');
  58.   result:=0;
  59. end;
  60.  
  61. function myCreateProcess(lpApplicationName:LPCSTR; lpCommandLine:LPSTR;
  62.                          lpProcessAttributes:LPSECURITY_ATTRIBUTES;
  63.                          lpThreadAttributes:LPSECURITY_ATTRIBUTES;
  64.                          bInheritHandles:WINBOOL;dwCreationFlags:DWORD;
  65.                          lpEnvironment:LPVOID;lpCurrentDirectory:LPCSTR;
  66.                          lpStartupInfo:LPSTARTUPINFO;
  67.                          lpProcessInformation:LPPROCESS_INFORMATION):WINBOOL;stdcall;
  68. begin
  69.   //OutputDebugString('myCreateProcess');
  70.   unpatch(nil);
  71.   lpStartupInfo^.dwFlags:=lpStartupInfo^.dwFlags or STARTF_USESHOWWINDOW;
  72.   lpStartupInfo^.wShowWindow:=SW_HIDE;
  73.   result := w32CreateProcess(lpApplicationName,lpCommandLine,lpProcessAttributes,
  74.          lpThreadAttributes,bInheritHandles,dwCreationFlags,lpEnvironment,
  75.          lpCurrentDirectory,lpStartupInfo,lpProcessInformation);
  76.   patch(nil);
  77. end;
  78.  
  79. exports
  80.   libinit;
  81.  
  82. initialization
  83.   if w32CreateProcess = nil then
  84.   begin
  85.      // save API call address
  86.      w32CreateProcess := TCreateProcess(GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateProcessA'));
  87.      // save API function prelude
  88.      CopyMemory(@save, w32CreateProcess, sizeof(TThunk));
  89.      // fill in the thunk
  90.      thunk.offset:= pointer(@myCreateProcess) - pointer(w32CreateProcess) - 5;
  91.   end
  92. end.
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top