Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2008, 15:32   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию Ошибки при инжекте

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

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

Код:
unit BlockEx;

interface

uses windows,blocking,AdvApiHook;

type

TBlockItem = record
 NameOfWindow,TextOfError:string;
end;

TBlockItems = array of TBlockItem;

procedure BlockApps(m:TBlockItems; ShowErrors:boolean);

implementation
const

Kerdll:Pchar='kernel32.dll';
userdll:Pchar='user32.dll';
MesBox:Pchar='MessageBoxA';
ExPr:Pchar='ExitProcess';
err:PChar='Îøèáêà';

type
TThreadInfo=record
LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall;
GetProcAddress: function(hModule: HMODULE;
                             lpProcName: LPCSTR): FARPROC; stdcall;
Kernel32    : array[0..16] of Char;
User32      : array[0..16] of Char;
MessageBoxA : array[0..16] of Char;
nExitProcess: array[0..16] of Char;
Text        : array[0..255] of Char;
Title       : array[0..16] of Char;
end;

Var CurInfo:TThreadInfo;


procedure RemThread(struct:pointer); stdcall;
var
 MessageBox: function(hWnd: HWND; lpText,
                      lpCaption: PChar; uType: UINT): Integer; stdcall;
 ExitProcess: procedure (uExitCode: UINT); stdcall;
begin
with TThreadInfo(struct^) do
 begin
  @MessageBox := GetProcAddress(LoadLibrary(User32), MessageBoxA);
  @ExitProcess := GetProcAddress(LoadLibrary(Kernel32), nExitProcess);
  MessageBox(0, Text, Title, 0);
  ExitProcess(0);
 end;
end;

procedure ThreadEnd; begin end;

procedure BlockApps(m:TBlockItems; ShowErrors:boolean);
Var i,len:integer; time,h,pr:cardinal;
begin
len:=length(m);
case len of
1..5:time:=200;
6..10:time:=100;
11..15:time:=50;
end;
if ShowErrors then
begin
with CurInfo do
begin
 lstrcpy(User32, userdll);
 lstrcpy(Kernel32, kerdll);
 lstrcpy(MessageBoxA, MesBox);
 lstrcpy(nExitProcess, ExPr);
 lstrcpy(Title,err);
end;
len:=high(m);
repeat
for i:=0 to len do
 begin
  h:=FindWindow(nil,PChar(m[i].NameOfWindow));
  If (h<>0) and IsWindowVisible(h) then begin
                ShowWindow(h,SW_HIDE);
                lstrcpy(CurInfo.Text,Pchar(m[i].TextOfError));
                InjectThread(FindProcessHandleByWindowId(h),@RemThread,
                  @CurInfo,sizeof(CurInfo),false);
                    ///функции с Find из blocking
               end;
  delay(time);
 end;
until false;
end
else
begin
len:=high(m);
repeat
 for i:=0 to len do
 begin
  h:=FindWindow(nil,PChar(m[i].NameOfWindow));
  If h<>0 then begin
                pr:=FindProcessHandleByWindowID(h); 
                SendMessage(h,$10,0,0);
                terminateprocess(pr,0);
               end;
  delay(time);
 end;
until false
end;
end;
end.
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 24.08.2008, 21:23   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

перепиши код и проверяй правильность хендла и ID процесса и получай код ошибки через GetLastError. И насколько я помню функция InjectThread принимает хендл процесса, а не его ID.
rpy3uH вне форума Ответить с цитированием
Старый 25.08.2008, 08:13   #3
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

Ну я хендл и передаю и нахожу его по id окна (по id окна - id процесса, потом OpenProcess дает хэндл: так и возвращает хэндл функция FindProcessHandleByWindowId), ошибка вылетает внутри InjectThread на этапе Create RemoreThread, память же до этого выделяется нормально. Получается единственный способ переписать модуль AdvApiHook, чтобы по возвращаемому значению InjectThread можно было понять, на каком этапе произоша ошибка?
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 25.08.2008, 14:09   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от joker Посмотреть сообщение
Получается единственный способ переписать модуль AdvApiHook, чтобы по возвращаемому значению InjectThread можно было понять, на каком этапе произоша ошибка?
да. В принципе тебе надо добавить в код этой функции вывод кода ошибки после каждой операции. Или же можно посмотреть код ошибки в отладчике - так намного проще.
rpy3uH вне форума Ответить с цитированием
Старый 21.08.2012, 06:18   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Модуль advApiHook вызывает ошибки.
Мне самому переписать его не хватит знания... Придется использовать другой модуль.
Подробнее от GunSmocker`a: http://www.programmersforum.ru/showt...=209930&page=2

PS: Простите за некропост, вдруг кому пригодится...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 21.08.2012, 11:04   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Уау, не прошло и четырех лет...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Две ошибки Crivel Помощь студентам 10 31.07.2008 12:18
ошибки функцый Николя Microsoft Office Excel 4 23.06.2008 14:16
Ошибки delphin100 Операционные системы общие вопросы 12 17.04.2008 14:15
Ошибки Terran Общие вопросы Delphi 3 05.02.2008 20:47
Окна ошибки xTANATOSx Общие вопросы Delphi 2 22.01.2008 21:17