motronline.com

Обсуждение особенностей разных пиратских серверов

Модератор: 4epT

Inik
Начинающий
Сообщения: 42
Зарегистрирован: Пн дек 18, 2006 1:38 am

Сообщение Inik » Чт дек 21, 2006 5:48 pm

гг пирожок гратс.
Да и на мотре запуск 2х окошек оказался не таким уж и сложным делом как казалось вначале.

У меня вот вопрос возник. я решил попробовать и по пути мышки пройти, т.е. убрать внешние вызовы на свои.
ex: GetVolumeInformation("c:\\",NULL,0,&sernumber,0,0,NULL,0);

ессно меня интересует возврат sernumber я хочу на другие числа позаменять :P . Вопрос есть ли способ перехватить вызовы GetVolumeInformation не модифицируя экзешник? почитал ловушки но там в таблицу вызовов лезут и трамплин делают( ну 5 байт под калл меняют и етс) некрасиво меняем екзешник. Есть ли способ не меняя экзешник в памяти исполнить свою GVIA?

:o Все таки имхо самый красивый способ обойти защиту не модифицируя сам исполняемый файл:)

Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry » Чт дек 21, 2006 6:04 pm

Красивое - не значит хорошее. :) Вот например красивый свособ сбить яблочко с головы - метко выстрелить со ста метров из макарова. А простой и действенный способ - подойти и дать в репу :)

Вон например пирожок там раньше говорил - можно заменить системную Kernel32 своей, в которой GetVolumeInformation будет модифицирована так как тебе надо. Можно запускать руро опять таки через такой же дебаггер и править что тебе надо.. варианты есть :)

Аватара пользователя
piroJOKE
Модератор
Сообщения: 8207
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE » Чт дек 21, 2006 6:53 pm

Это не я говорил. Это не известны мне епонцы такое говорили. А потом легендарный жук Аммак-Бой на этом принципе сделал режим xKore 3. Кстати... я даже ни разу не пробовал его запускать, этот режим.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download

Inik
Начинающий
Сообщения: 42
Зарегистрирован: Пн дек 18, 2006 1:38 am

Сообщение Inik » Чт дек 21, 2006 7:43 pm

хм а как подправить дллку? копатся внутри ее что-ли(кернела)?
написал свою дллку назвал кернел32 длл сую в директорию с прогой
и не ворк(т.е. старое значение показывает).

прога:
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
DWORD len = 20;
char* outVolName;
outVolName = (char*)malloc(sizeof(char)*3000);
DWORD sernumber;
DWORD maxcomplength;
DWORD sysflags;
char* outSysName;
outSysName = (char*)malloc(sizeof(char)*3000);
DWORD maxSysNameLen = 30;
GetVolumeInformation("c:\\", outVolName,len, &sernumber,
&maxcomplength, &sysflags, outSysName, maxSysNameLen);
printf("%x\n",sernumber);
return 0;
}

дллка:
#include <Windows.h>

extern "C" __declspec(dllexport) int WINAPI GetVolumeInformation(LPCTSTR,LPTSTR,DWORD,LPDWORD,LPDWORD,LPDWORD,LPTSTR,DWORD);

void ppp()
{
return;
}

int WINAPI GetVolumeInformation(
LPCTSTR lpRootPathName, // root directory
LPTSTR lpVolumeNameBuffer, // volume name buffer
DWORD nVolumeNameSize, // length of name buffer
LPDWORD lpVolumeSerialNumber, // volume serial number
LPDWORD lpMaximumComponentLength, // maximum file name length
LPDWORD lpFileSystemFlags, // file system options
LPTSTR lpFileSystemNameBuffer, // file system name buffer
DWORD nFileSystemNameSize // length of file system name buffer
)
{
*lpVolumeSerialNumber = (DWORD)(12345);
return 1;
}

Inik
Начинающий
Сообщения: 42
Зарегистрирован: Пн дек 18, 2006 1:38 am

Сообщение Inik » Чт дек 21, 2006 7:44 pm

дада не бейте меня я память не освобождаю в проге и прочие косяки (типа глюки с типами) на коленке написал и забыл.

Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry » Чт дек 21, 2006 7:54 pm

ну во-первых, из кернела импортится не одна функция, а тонна, во вторых системные длли могут грузиться сначала из винды, в третьих в длле наверно должен быть какой-то инит и вообще может ты ее скомпилил криво, в четвертых ты ее из под отладчика запускал ?:) Попробуй обозвать MyFunc и ссотв-но My.Dll для начала и проверь, работает или нет.

Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry » Чт дек 21, 2006 7:57 pm

И в последних - нет импорта GetVolumeInformation, есть импорт GetVolumeInformationA :)

Inik
Начинающий
Сообщения: 42
Зарегистрирован: Пн дек 18, 2006 1:38 am

Сообщение Inik » Чт дек 21, 2006 8:42 pm

кароч сейчас импорт попробую.
проблема вот в чем. я скопировал kernel32.dll(%windir/system32) в папку с прогой. и банально первые байты вызова GetVolumeInformation заменил на
pop edx
pop eax
pop eax
pop eax
pop eax ;// eax = VI
mov ecx, 12345
mov DWORD PTR SS:[eax],ecx
pop eax
pop eax
pop eax
pop eax
push edx
retn
( или в буквоциферках 5A 58 58 58 58 B9 45 23 01 00 36 89 08 58 58 58 58 52 C3)

и запустил прогу. и она не использует дллку из директории( если тупо дебаггером сделать по пямяти чендж то все ворк). wtf? :o
значит они сначала из винды грузятся? :( есть ли какой нить способ обхода?

DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid » Чт дек 21, 2006 8:59 pm

Inik писал(а): Вопрос есть ли способ перехватить вызовы GetVolumeInformation не модифицируя экзешник?
Есть ли способ не меняя экзешник в памяти исполнить свою GVIA?

:o Все таки имхо самый красивый способ обойти защиту не модифицируя сам исполняемый файл:)
http://research.microsoft.com/sn/detours/
Detours are inserted at execution time. The code of the target function is modified in memory, not on disk, thus facilitating interception of binary
functions at a very fine granularity. For example, the procedures in a DLL can be detoured in one execution of an application, while the original
procedures are not detoured in another execution.

Inik
Начинающий
Сообщения: 42
Зарегистрирован: Пн дек 18, 2006 1:38 am

Сообщение Inik » Чт дек 21, 2006 9:09 pm

блин. ну я же написал что трамплины не катят потому что в любой момент как пятка почештся у руро и он проверит байтики
вот у меня возникла идея, так как нтдлл и кернел вроде как в фиксированное адресное пространство грузятся думаю может быть написать патчер на этот адрес и тем самым будет моя функция запускаться, вопрос в том что проверяет ли руро то что ему не кернел32 загружена а наша кернел32(модифицируемая после загрузки).

DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid » Пт дек 22, 2006 10:37 am

Inik писал(а):блин. ну я же написал что трамплины не катят потому что в любой момент как пятка почештся у руро и он проверит байтики
вот у меня возникла идея, так как нтдлл и кернел вроде как в фиксированное адресное пространство грузятся думаю может быть написать патчер на этот адрес и тем самым будет моя функция запускаться, вопрос в том что проверяет ли руро то что ему не кернел32 загружена а наша кернел32(модифицируемая после загрузки).
Сорри =)
ммм, параноя? имхо проше пропатчить его и не думать о том что у него что-то там зачещется и он проверит байтики или кернел32длл =)
А кстати пробовали kerberos 1.07 by Рустем Фасихов ? Который вроде как позволяет перехватывать и модифицировать вызовы API?

Inik
Начинающий
Сообщения: 42
Зарегистрирован: Пн дек 18, 2006 1:38 am

Сообщение Inik » Сб дек 23, 2006 1:26 am

Решил таки хуками сделать
написал сделющее (dll)

Код: Выделить всё

library Hide;

uses
 Windows,{}
  JwaNative,
  JwaWindows;{}

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


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

var
 JmpZwq: far_jmp;
 OldZwq: OldCode;
 PtrZwq: pointer;

 JmpGVI: far_jmp;
 OldGVI: OldCode;
 PtrGVI: pointer;

Function TrueZwQuerySystemInformation(ASystemInformationClass: dword;
                                  ASystemInformation: Pointer;
                                  ASystemInformationLength: dword;
                                  AReturnLength: PCardinal): NTStatus; stdcall;
var
 Written: dword;{}
{  Written: Cardinal;{}
begin

  Windows.{}WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq,
                     @OldZwq, SizeOf(OldCode), Written);

  Result := ZwQuerySystemInformation(_SYSTEM_INFORMATION_CLASS(ASystemInformationClass),
                                     ASystemInformation,
                                     ASystemInformationLength,
                                     PULONG(System.Cardinal(AReturnLength)));

  Windows.WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq,
                     @JmpZwq, SizeOf(far_jmp), Written);
end;



Function NewZwQuerySystemInformation(ASystemInformationClass: dword;
                                  ASystemInformation: Pointer;
                                  ASystemInformationLength: dword;
                                  AReturnLength: PCardinal): NTStatus; stdcall;
var
 Info, Prev: PSYSTEM_PROCESSES;
 add: boolean;
// endl: boolean;
begin
 Result := TrueZwQuerySystemInformation(ASystemInformationClass,
                                        ASystemInformation,
                                        ASystemInformationLength,
                                        AReturnLength);

 if (_SYSTEM_INFORMATION_CLASS(ASystemInformationClass) = SystemProcessesAndThreadsInformation) and
    (Result = STATUS_SUCCESS) then
    begin
      Info := ASystemInformation;
      add:=false;
      while(Info^.NextEntryDelta > 0) do
      begin
        Prev:=Info;
        //skip add step if already added in while
        if (add = false) then Info := pointer(dword(Info) + Info^.NextEntryDelta);
        add:=false;
        //begin skipping hide list proccesses
        while (
               (lstrcmpiw(Info^.ProcessName.Buffer, 'winlogon.exe') = 0) AND
                (Info^.NextEntryDelta > 0)
              ) do
        begin
          Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta;
          Info := pointer(dword(Info) + Info^.NextEntryDelta);
          add := true;
        end;
        //in case when last process in hide list
        if (
                (lstrcmpiw(Info^.ProcessName.Buffer, 'winlogon.exe') = 0) AND
                (Info^.NextEntryDelta <= 0)
            ) then Prev^.NextEntryDelta := 0;
      end;
    end;
end;

function NewGVI( lpRootPathName: LPCTSTR ;
  lpVolumeNameBuffer:LPTSTR ;
  nVolumeNameSize:DWORD ;
  lpVolumeSerialNumber:LPDWORD ;
  lpMaximumComponentLength:LPDWORD ;
  lpFileSystemFlags:LPDWORD ;
  lpFileSystemNameBuffer:LPTSTR ;
  nFileSystemNameSize:DWORD 
): BOOL; stdcall;
begin
  lpVolumeSerialNumber^ := 12345;
  Result := True;
end;
{*
BOOL GetVolumeInformation(
  LPCTSTR lpRootPathName,
  LPTSTR lpVolumeNameBuffer,
  DWORD nVolumeNameSize,
  LPDWORD lpVolumeSerialNumber,
  LPDWORD lpMaximumComponentLength,
  LPDWORD lpFileSystemFlags,
  LPTSTR lpFileSystemNameBuffer,
  DWORD nFileSystemNameSize
);
*}
Procedure SetHook();
var
 Bytes: dword;
begin
  PtrZwq  := GetProcAddress(GetModuleHandle('ntdll.dll'),
                            'ZwQuerySystemInformation');
  Windows.ReadProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes);
  JmpZwq.PuhsOp  := $68;
  JmpZwq.PushArg := @NewZwQuerySystemInformation;
  JmpZwq.RetOp   := $C3;
  Windows.WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @JmpZwq, SizeOf(far_jmp), Bytes);

  PtrGVI := nil;
  PtrGVI := GetProcAddress(GetModuleHandle('kernel32.dll'),'GetVolumeInformationA');
  if (PtrGVI = Nil) then halt;
  Windows.ReadProcessMemory(INVALID_HANDLE_VALUE, PtrGVI, @OldGVI, SizeOf(OldCode),Bytes);
  JmpGVI.PuhsOp := $68;
  JmpGVI.PushArg:= @NewGVI;
  JmpGVI.RetOp  := $C3;
  Windows.WriteProcessMemory(INVALID_HANDLE_VALUE,PtrGVI,@JmpGVI,sizeof(far_jmp),bytes);
end;

Procedure Unhook();
var
 Bytes: dword;
begin
  Windows.WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes);
end;
// залепа

Код: Выделить всё

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

Procedure SetGlobalHookProc();
begin
 SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
 Sleep(INFINITE);
end;
//

Procedure SetGlobalHook();
var
 hMutex: dword;
 TrId: dword;
begin
 hMutex := CreateMutex(nil, false, 'ProcHideHook');
 if GetLastError = 0 then
 Windows.CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else
 CloseHandle(hMutex);
end;

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

begin
 DllProc := @DLLEntryPoint;
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
ну и соответсвенно (сам екзешник)

Код: Выделить всё

program AdwareBox;

uses
  Windows;

begin
 LoadLibrary('hide.dll');
 SLEEP(INFINITE);
end.
Косяк в чем zwQ функция хукится(ну вин лог он реал исчезает из памяти) а GetVolumeInformation нет =\ не понимаю в чем косяк.
ЗЫ проверял на сишной проге(getvolumeinf)

Код: Выделить всё

//#include <Winbase.h>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
   DWORD len = 20;
   char* outVolName;
   outVolName = (char*)malloc(sizeof(char)*3000);
   DWORD sernumber;
   DWORD maxcomplength;
   DWORD sysflags;
   char* outSysName;
   outSysName = (char*)malloc(sizeof(char)*3000);
   DWORD maxSysNameLen = 30;
 GetVolumeInformation("c:\\", outVolName,len, &sernumber, 
	 &maxcomplength, &sysflags, outSysName, maxSysNameLen);
	printf("%x\n",sernumber);
   return 0;
}
так вот она не 12345 выводит а настоящее значение. Блин я тупой уже 2й час не могу понять в чем косяк.
Сори за дельфи. Ахтунг да знаю, просто изначальные сорсы с wasm взяты не стал переписывать на си.

Inik
Начинающий
Сообщения: 42
Зарегистрирован: Пн дек 18, 2006 1:38 am

Сообщение Inik » Сб дек 23, 2006 2:08 am

Табы скушал форум. а паскаль не паскаль в данном случае отличия минимальны, хотя да паскаль зло =\
Вот объясни мне почему когда пишет по INVALID_HANDLE_VALUE для zwQuery и для GetVolumeInf первая срабатывает а вторая нет =\ ппц не понимаю.
По идее kernel32 тоже в фиксированное адресное пространство грузится.
На пасе пример взял от безысходности :(
пробовал на сях писал прогу которая createprocess делает suspendTherad его пишет по INV_HND_VALUE на GVI пишет нужные байты. читает их - те самые что записал, ResumeThread делаю и выдает стандартный ответ а не 12345 =\ вообще не понимаю в чем прикол.
не быть мне кулхацкером - тупой :(
Я конечно могу взять мегасупер библиотеку Васи Пупкина и подставить туда нужную функцию, но это же не тру, хочется понять что у меня не так написано и где копать, где ошибка.

DInvalid
Грамотный
Сообщения: 368
Зарегистрирован: Вт ноя 14, 2006 4:54 pm

Сообщение DInvalid » Сб дек 23, 2006 11:20 am

ЗЫ проверял на сишной проге(getvolumeinf)
//#include <Winbase.h>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
DWORD len = 20;
char* outVolName;
outVolName = (char*)malloc(sizeof(char)*3000);
DWORD sernumber;
DWORD maxcomplength;
DWORD sysflags;
char* outSysName;
outSysName = (char*)malloc(sizeof(char)*3000);
DWORD maxSysNameLen = 30;
GetVolumeInformation("c:\\", outVolName,len, &sernumber,
&maxcomplength, &sysflags, outSysName, maxSysNameLen);
printf("%x\n",sernumber);
return 0;
}
Вот прямо на это програме и проверял? А где в ней хуки устанавливаются?

П.С.
А, ты не в программе меняешь вызовы функций, а в длл свой код пишешь...

Inik
Начинающий
Сообщения: 42
Зарегистрирован: Пн дек 18, 2006 1:38 am

Сообщение Inik » Сб дек 23, 2006 1:59 pm

угу а эта программка чисто для теста.

Ответить