Вернуться   CoderX :: Forums > Основные форумы > Полезности
Войти через OpenID

Полезности Исключительно для полезных тем из других разделов.
Темы тут не создаются!
Темы сюда перемещаются из других разделов, и на их старых местах остаются постоянные перенаправления.

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 21.01.2012, 00:10   #1
Пользователь
 
Аватар для Silent
 
Регистрация: 07.02.2011
Сообщений: 32
Сказал Спасибо: 8
Имеет 4 спасибок в 4 сообщенях
Silent пока неопределено
По умолчанию Need help

Доброго времени суток. Прошу подсказать неучу где я накосячил и как нужно правильно делать.
Почитал статьи Ms-Rem-а на wasm.ru по перехвату API функций, написал небольшой тестовый пример по перехвату функций из библиотеки wtsapi32, опробовал на своем проекте все нормально отрабатывает.
Код:
library WTSSession;

uses
  Windows,
  NativeAPI, Dialogs;

type
 OldCode = packed record
  One: dword;
  Two: word;
 end;


far_jmp = packed record
  PuhsOp: byte;
  PushArg: pointer;
  RetOp: byte;
 end;

  _WTS_CONNECTSTATE_CLASS = (
    WTSActive,              // User logged on to WinStation
    WTSConnected,           // WinStation connected to client
    WTSConnectQuery,        // In the process of connecting to client
    WTSShadow,              // Shadowing another WinStation
    WTSDisconnected,        // WinStation logged on without client
    WTSIdle,                // Waiting for client to connect
    WTSListen,              // WinStation is listening for connection
    WTSReset,               // WinStation is being reset
    WTSDown,                // WinStation is down due to error
    WTSInit);               // WinStation in initialization
  {$EXTERNALSYM _WTS_CONNECTSTATE_CLASS}
  WTS_CONNECTSTATE_CLASS = _WTS_CONNECTSTATE_CLASS;
  {$EXTERNALSYM WTS_CONNECTSTATE_CLASS}
  TWtsConnectStateClass = WTS_CONNECTSTATE_CLASS;

  PWTS_SESSION_INFOW = ^WTS_SESSION_INFOW;
  {$EXTERNALSYM PWTS_SESSION_INFOW}
  _WTS_SESSION_INFOW = record
    SessionId: DWORD;              // session id
    pWinStationName: LPWSTR;       // name of WinStation this session is connected to
    State: WTS_CONNECTSTATE_CLASS; // connection state (see enum)
  end;
  {$EXTERNALSYM _WTS_SESSION_INFOW}
  WTS_SESSION_INFOW = _WTS_SESSION_INFOW;
  {$EXTERNALSYM WTS_SESSION_INFOW}
  TWtsSessionInfoW = WTS_SESSION_INFOW;
  PWtsSessionInfoW = PWTS_SESSION_INFOW;

var
 JmpWTS: far_jmp;
 OldWTS: OldCode;
 PtrWTS: pointer;

function WTSEnumerateSessionsW(hServer: THandle; Reserved: DWORD; Version: DWORD;
  var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall; external 'wtsapi32.dll';

{$R *.res}

function TrueWTSEnumerateSessionsW(hServer: THandle; Reserved: DWORD; Version: DWORD;
  var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall;
var Written: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Written);
Result := WTSEnumerateSessionsW(hServer, Reserved, Version, ppSessionInfo,pCount);
WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @JmpWTS, SizeOf(far_jmp), Written);
end;

function NewWTSEnumerateSessionsW(hServer: THandle; Reserved: DWORD; Version: DWORD;
  var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL; stdcall;
var i:Integer;
    SI: PWTS_SESSION_INFOW;
begin
Result := TrueWTSEnumerateSessionsW(hServer, Reserved, Version, ppSessionInfo, pCount);
SI := ppSessionInfo;
if Result then
  begin
    for i:= 0 to Pred(pCount) do
      begin
        ShowMessage(SI.pWinStationName);
        inc(SI);
      end;
  end
else
  ShowMessage('False');
end;

Procedure SetHook();
var
 Bytes: dword;
begin
  PtrWTS  := GetProcAddress(GetModuleHandle('wtsapi32.dll'), 'WTSEnumerateSessionsW');
  ReadProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Bytes);
  JmpWTS.PuhsOp  := $68;
  JmpWTS.PushArg := @NewWTSEnumerateSessionsW;
  JmpWTS.RetOp   := $C3;
  WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @JmpWTS, SizeOf(far_jmp), Bytes);
end;

Procedure Unhook();
var
 Bytes: dword;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Bytes);
end;

Function MessageProc(code : integer; wParam : word;
                    lParam : longint) : longint; stdcall;
begin
 CallNextHookEx(0, Code, wParam, lparam);
 Result := 0;
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: begin SetHook(); end;
    DLL_PROCESS_DETACH: begin Unhook(); end;
  end;
end;

begin
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Решил попробовать на примере Л2 перехватить функции и зашел в тупик, клиент постоянно валится в крит, причем перехват происходит т.к. валится уже при вызове оригинальной функции. Возможно кто-то сможет растолковать неучу где я накосячил.
Код:
library Red;

uses
  Windows,
  NativeAPI, Dialogs;

type
 OldCode = packed record
  One: dword;
  Two: word;
 end;


far_jmp = packed record
  PuhsOp: byte;
  PushArg: pointer;
  RetOp: byte;
 end;

var
 JmpWTS: far_jmp;
 OldWTS: OldCode;
 PtrWTS: pointer;
 OriginalF: procedure(i:Integer); stdcall;

{$R *.res}

procedure CallF(i: Integer); stdcall;
asm
    mov     ecx, PtrWTS
    mov     esp, ebp
    pop     ebp
    jmp     [OriginalF]
end;

procedure NewF(i: Integer); stdcall;
begin
  CallF(i);
end;

procedure HookF(i: Integer); stdcall;
asm
  push    ecx
  push    [ebp+8]
  push    ecx
  call    NewF
  pop     ecx
end;

Procedure SetHook();
var
 Bytes: dword;
begin
  PtrWTS  := GetProcAddress(GetModuleHandle('engine.dll'), '?OnAcceptGameStart@UGameEngine@@UAEXH@Z');
  OriginalF := GetProcAddress(GetModuleHandle('engine.dll'), '?OnAcceptGameStart@UGameEngine@@UAEXH@Z');
  ReadProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Bytes);
  JmpWTS.PuhsOp  := $68;
  JmpWTS.PushArg := @HookF;
  JmpWTS.RetOp   := $C3;
  WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @JmpWTS, SizeOf(far_jmp), Bytes);
end;

Procedure Unhook();
var
 Bytes: dword;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE, PtrWTS, @OldWTS, SizeOf(OldCode), Bytes);
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: begin SetHook(); end;
    DLL_PROCESS_DETACH: begin Unhook(); end;
  end;
end;

begin
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Буду признателен за любую помощь.
Silent вне форума   Ответить с цитированием
Старый 21.01.2012, 00:41   #2
Местный
 
Аватар для Sherman
 
Регистрация: 24.04.2008
Сообщений: 364
Сказал Спасибо: 15
Имеет 116 спасибок в 83 сообщенях
Sherman пока неопределено
По умолчанию

Надеюсь пробуешь на клиенте отвязанном от GG на какой нибудь фришке?
Sherman вне форума   Ответить с цитированием
Старый 21.01.2012, 00:44   #3
Пользователь
 
Аватар для Silent
 
Регистрация: 07.02.2011
Сообщений: 32
Сказал Спасибо: 8
Имеет 4 спасибок в 4 сообщенях
Silent пока неопределено
По умолчанию

На астериосе
P.S. Кроме евроофа, руофа и астериоса больше нету клиентов, так что самый безобидный получается последний.
Silent вне форума   Ответить с цитированием
Старый 21.01.2012, 06:08   #4
Местный
 
Аватар для Sherman
 
Регистрация: 24.04.2008
Сообщений: 364
Сказал Спасибо: 15
Имеет 116 спасибок в 83 сообщенях
Sherman пока неопределено
По умолчанию

Цитата:
Сообщение от Silent Посмотреть сообщение
На астериосе
P.S. Кроме евроофа, руофа и астериоса больше нету клиентов, так что самый безобидный получается последний.
OllyDbg, безсонные ночи тебе в помощь ) Скорее всего там стоит аналогичный хук. Хук на хук получаешь AV клиента. Отладка-отладка и еще раз отладка.
Sherman вне форума   Ответить с цитированием
За это сообщение Sherman нажился спасибкой от:
Старый 21.01.2012, 07:36   #5
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
maxilam пока неопределено
По умолчанию

Silent, найди фришку на которой работает L2ph (если нужна годовская фриха, велком ко мне в личку). И на ней уже отрабатывай свои хуки. На астериосе, если я не ошибаюсь, стоит защита.
По отладке могу дать один совет:
Когда получаешь адресс функции
delphi Код:
PtrWTS  := GetProcAddress(GetModuleHandle('engine.dll'), '?OnAcceptGameStart@UGameEngine@@UAEXH@Z');
сохрани память по этому адресу, размером к примеру 1024кб в текстовый файл. Потом открой этот файл через HEX Editor Neo. В нем есть встроеный дизасемблер (только в полной версии, и триальной). Через дизасемблер посмотри код функции.
Потом тоже самое сделай после хука функции. То есть сохрани участок памяти по адресу PtrWTS размером 1024 и посмотри как ложится твой хук на функцию.
С одной стороны гиморно, а с другой стороны, этот метод мне очень помогает в отладке хуков.
maxilam вне форума   Ответить с цитированием
За это сообщение maxilam нажился 3 спасибками от:
Старый 21.01.2012, 14:26   #6
Рыцарь
 
Аватар для Morfik
 
Регистрация: 13.10.2009
Сообщений: 665
Сказал Спасибо: 38
Имеет 172 спасибок в 108 сообщенях
Morfik пока неопределено
По умолчанию

maxilam, гораздо проще сразу в памяти дизасамблить отладчиком и смотреть как стал твой хук, делаю это спомощью IDA
__________________
каждый раз, когда ты пишешь int i вместо short i, сотни пользователей вынуждены докупать планку памяти

служба поддержки 4gay - ICQ 642274822
Morfik вне форума   Ответить с цитированием
За это сообщение Morfik нажился спасибкой от:
Старый 21.01.2012, 15:04   #7
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 44
Сказал Спасибо: 57
Имеет 3 спасибок в 2 сообщенях
vahes пока неопределено
По умолчанию

вопрос по теме, можно хукнуть фун-ю сплайсингом если engine.dll запакована фимой(или другой дрянью)?
vahes вне форума   Ответить с цитированием
Старый 21.01.2012, 16:52   #8
Местный
 
Аватар для Sherman
 
Регистрация: 24.04.2008
Сообщений: 364
Сказал Спасибо: 15
Имеет 116 спасибок в 83 сообщенях
Sherman пока неопределено
По умолчанию

Если дополнительно нет crc контролей в параллельных потоках, то вполне.
Sherman вне форума   Ответить с цитированием
За это сообщение Sherman нажился спасибкой от:
Старый 24.01.2012, 17:45   #9
Пользователь
 
Регистрация: 19.07.2010
Сообщений: 45
Сказал Спасибо: 10
Имеет 23 спасибок в 12 сообщенях
Guzh пока неопределено
По умолчанию

Вопросик:
Есть пакет -
$7B:ShowBoard:c(show)s(bbshome)s(bbsgetfav)s(bbslo c)s(bbsclan)s(bbsmemo)s(bbsmail)s(bbsfriends)s(bbs _add_fav)s(curPage)
Есть в engine.dll экспортируемая функция OnShowboardPacket,принимающая параметры int и L2ParamStack
И я никак не могу понять что и скока нуно передавать через L2ParamStack. МОжет ктонибуть пользовался этой функцией и подскажет что именно передавать(а то передавал и все строковые значения поотдельности и все вместе, и только curPage,но постоянно получал только пустое окошко Community).
Guzh вне форума   Ответить с цитированием
Старый 19.02.2012, 14:14   #10
Пользователь
 
Регистрация: 03.09.2009
Сообщений: 63
Сказал Спасибо: 19
Имеет 5 спасибок в 3 сообщенях
tiranosaur пока неопределено
По умолчанию

Господа подскажите пжл. Ставлю брекпоинт на AddNetworkQueue где там сруктура NetworkPacket? где именно она там?в стеке или в регистрах? и в каких или по какому адресу esp. запарился уже(
tiranosaur вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Полезности



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 17:31.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!