Ошибка с инжектом

Тема в разделе "WASM.WIN32", создана пользователем seiko, 24 авг 2008.

  1. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    Идея такая: нужно заблокировать игру, но сделать все так, чтобы это выглядело ошибкой игры типа "Приложению не удалось запуститься поскольку bink32.dll не был найден"
    Чтобы это выглядело натурально сам MessageBox с текстом ошибки должен выполнятся в контексте самого процесса игры
    Но в момент создания потока в ее процессе вылетает ошибка блокируемой игры типа "неизвестная ошибка, отправлять отчет или нет", а если и не вылетает то сам процесс завершается, при этом MessageBox не появляется
    Инжект производится с помощью MS-Remовского AdvApiHook и nativeApi,
    плюс в коде используется мой модуль blocking, содержащий функции получения всякого рода хэндлов по id, именам и т.п.

    Вот код Delphi модуля, где описана функция такого рода блокирования -
    BlockApps

    Код (Text):
    1. unit BlockEx;
    2.  
    3. interface
    4.  
    5. uses windows,blocking,AdvApiHook;
    6.  
    7. type
    8.  
    9. TBlockItem = record
    10.  NameOfWindow,TextOfError:string;
    11. end;
    12.  
    13. TBlockItems = array of TBlockItem;
    14.  
    15. procedure BlockApps(m:TBlockItems; ShowErrors:boolean);
    16.  
    17. implementation
    18. const
    19.  
    20. Kerdll:Pchar='kernel32.dll';
    21. userdll:Pchar='user32.dll';
    22. MesBox:Pchar='MessageBoxA';
    23. ExPr:Pchar='ExitProcess';
    24. err:PChar='Îøèáêà';
    25.  
    26. type
    27. TThreadInfo=record
    28. LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall;
    29. GetProcAddress: function(hModule: HMODULE;
    30.                              lpProcName: LPCSTR): FARPROC; stdcall;
    31. Kernel32    : array[0..16] of Char;
    32. User32      : array[0..16] of Char;
    33. MessageBoxA : array[0..16] of Char;
    34. nExitProcess: array[0..16] of Char;
    35. Text        : array[0..255] of Char;
    36. Title       : array[0..16] of Char;
    37. end;
    38.  
    39. Var CurInfo:TThreadInfo;
    40.  
    41.  
    42. procedure RemThread(struct:pointer); stdcall;
    43. var
    44.  MessageBox: function(hWnd: HWND; lpText,
    45.                       lpCaption: PChar; uType: UINT): Integer; stdcall;
    46.  ExitProcess: procedure (uExitCode: UINT); stdcall;
    47. begin
    48. with TThreadInfo(struct^) do
    49.  begin
    50.   @MessageBox := GetProcAddress(LoadLibrary(User32), MessageBoxA);
    51.   @ExitProcess := GetProcAddress(LoadLibrary(Kernel32), nExitProcess);
    52.   MessageBox(0, Text, Title, 0);
    53.   ExitProcess(0);
    54.  end;
    55. end;
    56.  
    57. procedure ThreadEnd; begin end;
    58.  
    59. procedure BlockApps(m:TBlockItems; ShowErrors:boolean);
    60. Var i,len:integer; time,h,pr:cardinal;
    61. begin
    62. len:=length(m);
    63. case len of
    64. 1..5:time:=200;
    65. 6..10:time:=100;
    66. 11..15:time:=50;
    67. end;
    68. if ShowErrors then
    69. begin
    70. with CurInfo do
    71. begin
    72.  lstrcpy(User32, userdll);
    73.  lstrcpy(Kernel32, kerdll);
    74.  lstrcpy(MessageBoxA, MesBox);
    75.  lstrcpy(nExitProcess, ExPr);
    76.  lstrcpy(Title,err);
    77. end;
    78. len:=high(m);
    79. repeat
    80. for i:=0 to len do
    81.  begin
    82.   h:=FindWindow(nil,PChar(m[i].NameOfWindow));
    83.   If (h<>0) and IsWindowVisible(h) then begin
    84.                 ShowWindow(h,SW_HIDE);
    85.                 lstrcpy(CurInfo.Text,Pchar(m[i].TextOfError));
    86.                 InjectThread(FindProcessHandleByWindowId(h),@RemThread,
    87.                   @CurInfo,sizeof(CurInfo),false);
    88.                     ///функции с Find из blocking
    89.                end;
    90.   delay(time);
    91.  end;
    92. until false;
    93. end
    94. else
    95. begin
    96. len:=high(m);
    97. repeat
    98.  for i:=0 to len do
    99.  begin
    100.   h:=FindWindow(nil,PChar(m[i].NameOfWindow));
    101.   If h<>0 then begin
    102.                 pr:=FindProcessHandleByWindowID(h);
    103.                 SendMessage(h,$10,0,0);
    104.                 terminateprocess(pr,0);
    105.                end;
    106.   delay(time);
    107.  end;
    108. until false
    109. end;
    110. end;
    111. end.
    Почему могут вылетать ошибки и не вылетать MessageBox?
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    ИМХО, можно просто пропатчить екзешник игры. Внутри наверняка содержатся проверки на всевозможные нестандартные ситуации. Штука в том что надо отследить несколько из них, и при необходимости менять в одном из них (выбирать рандомным образом) условный переход на безусловный. ъ?