motronline.com
Модератор: 4epT
гг пирожок гратс.
Да и на мотре запуск 2х окошек оказался не таким уж и сложным делом как казалось вначале.
У меня вот вопрос возник. я решил попробовать и по пути мышки пройти, т.е. убрать внешние вызовы на свои.
ex: GetVolumeInformation("c:\\",NULL,0,&sernumber,0,0,NULL,0);
ессно меня интересует возврат sernumber я хочу на другие числа позаменять . Вопрос есть ли способ перехватить вызовы GetVolumeInformation не модифицируя экзешник? почитал ловушки но там в таблицу вызовов лезут и трамплин делают( ну 5 байт под калл меняют и етс) некрасиво меняем екзешник. Есть ли способ не меняя экзешник в памяти исполнить свою GVIA?
Все таки имхо самый красивый способ обойти защиту не модифицируя сам исполняемый файл:)
Да и на мотре запуск 2х окошек оказался не таким уж и сложным делом как казалось вначале.
У меня вот вопрос возник. я решил попробовать и по пути мышки пройти, т.е. убрать внешние вызовы на свои.
ex: GetVolumeInformation("c:\\",NULL,0,&sernumber,0,0,NULL,0);
ессно меня интересует возврат sernumber я хочу на другие числа позаменять . Вопрос есть ли способ перехватить вызовы GetVolumeInformation не модифицируя экзешник? почитал ловушки но там в таблицу вызовов лезут и трамплин делают( ну 5 байт под калл меняют и етс) некрасиво меняем екзешник. Есть ли способ не меняя экзешник в памяти исполнить свою GVIA?
Все таки имхо самый красивый способ обойти защиту не модифицируя сам исполняемый файл:)
Красивое - не значит хорошее. Вот например красивый свособ сбить яблочко с головы - метко выстрелить со ста метров из макарова. А простой и действенный способ - подойти и дать в репу
Вон например пирожок там раньше говорил - можно заменить системную Kernel32 своей, в которой GetVolumeInformation будет модифицирована так как тебе надо. Можно запускать руро опять таки через такой же дебаггер и править что тебе надо.. варианты есть
Вон например пирожок там раньше говорил - можно заменить системную Kernel32 своей, в которой GetVolumeInformation будет модифицирована так как тебе надо. Можно запускать руро опять таки через такой же дебаггер и править что тебе надо.. варианты есть
Универсальный обход кустарных антибот-защит:
xKore 1 -- $20
xKore 1 -- $20
хм а как подправить дллку? копатся внутри ее что-ли(кернела)?
написал свою дллку назвал кернел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;
}
написал свою дллку назвал кернел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;
}
ну во-первых, из кернела импортится не одна функция, а тонна, во вторых системные длли могут грузиться сначала из винды, в третьих в длле наверно должен быть какой-то инит и вообще может ты ее скомпилил криво, в четвертых ты ее из под отладчика запускал ?:) Попробуй обозвать MyFunc и ссотв-но My.Dll для начала и проверь, работает или нет.
Универсальный обход кустарных антибот-защит:
xKore 1 -- $20
xKore 1 -- $20
И в последних - нет импорта GetVolumeInformation, есть импорт GetVolumeInformationA
Универсальный обход кустарных антибот-защит:
xKore 1 -- $20
xKore 1 -- $20
кароч сейчас импорт попробую.
проблема вот в чем. я скопировал 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?
значит они сначала из винды грузятся? есть ли какой нить способ обхода?
проблема вот в чем. я скопировал 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?
значит они сначала из винды грузятся? есть ли какой нить способ обхода?
http://research.microsoft.com/sn/detours/Inik писал(а): Вопрос есть ли способ перехватить вызовы GetVolumeInformation не модифицируя экзешник?
Есть ли способ не меняя экзешник в памяти исполнить свою GVIA?
Все таки имхо самый красивый способ обойти защиту не модифицируя сам исполняемый файл:)
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.
блин. ну я же написал что трамплины не катят потому что в любой момент как пятка почештся у руро и он проверит байтики
вот у меня возникла идея, так как нтдлл и кернел вроде как в фиксированное адресное пространство грузятся думаю может быть написать патчер на этот адрес и тем самым будет моя функция запускаться, вопрос в том что проверяет ли руро то что ему не кернел32 загружена а наша кернел32(модифицируемая после загрузки).
вот у меня возникла идея, так как нтдлл и кернел вроде как в фиксированное адресное пространство грузятся думаю может быть написать патчер на этот адрес и тем самым будет моя функция запускаться, вопрос в том что проверяет ли руро то что ему не кернел32 загружена а наша кернел32(модифицируемая после загрузки).
Сорри =)Inik писал(а):блин. ну я же написал что трамплины не катят потому что в любой момент как пятка почештся у руро и он проверит байтики
вот у меня возникла идея, так как нтдлл и кернел вроде как в фиксированное адресное пространство грузятся думаю может быть написать патчер на этот адрес и тем самым будет моя функция запускаться, вопрос в том что проверяет ли руро то что ему не кернел32 загружена а наша кернел32(модифицируемая после загрузки).
ммм, параноя? имхо проше пропатчить его и не думать о том что у него что-то там зачещется и он проверит байтики или кернел32длл =)
А кстати пробовали kerberos 1.07 by Рустем Фасихов ? Который вроде как позволяет перехватывать и модифицировать вызовы API?
Решил таки хуками сделать
написал сделющее (dll)
// залепа
ну и соответсвенно (сам екзешник)
Косяк в чем zwQ функция хукится(ну вин лог он реал исчезает из памяти) а GetVolumeInformation нет =\ не понимаю в чем косяк.
ЗЫ проверял на сишной проге(getvolumeinf)
так вот она не 12345 выводит а настоящее значение. Блин я тупой уже 2й час не могу понять в чем косяк.
Сори за дельфи. Ахтунг да знаю, просто изначальные сорсы с wasm взяты не стал переписывать на си.
написал сделющее (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.
ЗЫ проверял на сишной проге(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;
}
Сори за дельфи. Ахтунг да знаю, просто изначальные сорсы с wasm взяты не стал переписывать на си.
Табы скушал форум. а паскаль не паскаль в данном случае отличия минимальны, хотя да паскаль зло =\
Вот объясни мне почему когда пишет по INVALID_HANDLE_VALUE для zwQuery и для GetVolumeInf первая срабатывает а вторая нет =\ ппц не понимаю.
По идее kernel32 тоже в фиксированное адресное пространство грузится.
На пасе пример взял от безысходности
пробовал на сях писал прогу которая createprocess делает suspendTherad его пишет по INV_HND_VALUE на GVI пишет нужные байты. читает их - те самые что записал, ResumeThread делаю и выдает стандартный ответ а не 12345 =\ вообще не понимаю в чем прикол.
не быть мне кулхацкером - тупой
Я конечно могу взять мегасупер библиотеку Васи Пупкина и подставить туда нужную функцию, но это же не тру, хочется понять что у меня не так написано и где копать, где ошибка.
Вот объясни мне почему когда пишет по INVALID_HANDLE_VALUE для zwQuery и для GetVolumeInf первая срабатывает а вторая нет =\ ппц не понимаю.
По идее kernel32 тоже в фиксированное адресное пространство грузится.
На пасе пример взял от безысходности
пробовал на сях писал прогу которая createprocess делает suspendTherad его пишет по INV_HND_VALUE на GVI пишет нужные байты. читает их - те самые что записал, ResumeThread делаю и выдает стандартный ответ а не 12345 =\ вообще не понимаю в чем прикол.
не быть мне кулхацкером - тупой
Я конечно могу взять мегасупер библиотеку Васи Пупкина и подставить туда нужную функцию, но это же не тру, хочется понять что у меня не так написано и где копать, где ошибка.
Вот прямо на это програме и проверял? А где в ней хуки устанавливаются?ЗЫ проверял на сишной проге(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;
}Код: Выделить всё
П.С.
А, ты не в программе меняешь вызовы функций, а в длл свой код пишешь...