Текущий архив: 2003.05.19;
Скачать: CL | DM;
ВнизЗащита от копирования... Найти похожие ветки
← →
NKiril (2003-03-18 01:18) [0]Как определить запущен ли процес (в частности virtualCd, SoftIce) через Делфи?
← →
Алексей Валерьевич (2003-03-18 02:12) [1]Удалено модератором
← →
Poirot (2003-03-18 07:26) [2]Что-то мне кажется, что SoftIce вам будет сложновато найти, но уж если наюдёте, то просветите при закрытие проги все болезненные места места...
← →
Мыш (2003-03-18 07:40) [3]НУ че заработал 30 баксов, придурок? Здесь по дельфи форум, вали нафиг.
← →
Sash! (2003-03-18 09:11) [4]Проверка на запущенный SoftIce:
//------------------------------------------------------------------------------
{ SoftIce in W9x OS }
function SFI95Loaded: Boolean;
var
hFile: THandle;
begin
Result := False;
hFile := CreateFileA("\.SICE", GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (hFile <> INVALID_HANDLE_VALUE) then
begin
CloseHandle(hFile);
Result := True;
end;
end;
//------------------------------------------------------------------------------
{ SoftIce in NT/2000 OS }
function SFINTLoaded: Boolean;
var
hFile: THandle;
begin
Result := False;
hFile := CreateFileA("\.NTICE", GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (hFile <> INVALID_HANDLE_VALUE) then
begin
CloseHandle(hFile);
Result := True;
end;
end;
← →
NKiril (2003-03-18 17:48) [5]Sash! Спасибо за код, но я хотел бы с ним разобраться... Документации по CreateFileA у меня нет потому, хотелось бы уточнить. В коде ты создаешь с помощью CreateFileA ищешь SoftIce, а потом если нашло (if ...) то закрываешь.. наверное SoftIce. Правильно?
Ну а если мне нужно проверять на наличие другого процеса то где я смогу достать "\.NICE" для другого процеса, (как я понимаю все следующие параметры в процедуре можно оставлять без изменения)?
Что это вообще такое "\.NICE"?
Огромное спасибо.
← →
Sash! (2003-03-20 09:22) [6]Честно говоря, я сам не разбирался с этим кодом, просто где-то нашел :)
← →
Александр Спелицин (2003-03-20 12:03) [7]Ну во-первых не "\.NTICE", а "\\.\NTICE"
> Документации по CreateFileA у меня нет
Т.е Вам трудно набрать CreateFile и нажать F1???
А также трудно сделать тоже самое с CloseHandle?
← →
NKiril (2003-03-21 16:59) [8]По F1 в хелпе ничего нет по CreateFileA, это процедура Windows.
← →
Umar (2003-03-21 18:18) [9]В коде функция возвращает дескриптор файла если он не равен
INVALID значит файл загружен в память.
← →
NightAngel (2003-03-21 23:54) [10]Сами оценивайте недостатки и преимущества.
Метод первый: Файловый.
а) FindFirst и FindNext-ом ищется loader32 или sivwid.386; Устраняется перехватом этих функций.
б) Через VWIN32.vxd читаются напрямую сектора с диска или кластеры и ищется строка "tIce" или "SIWVID" или "WINICE" или "NTICE". Разновидность этого способа - использование библиотек, реализующих прямой доступ к файлам через FAT. Устраняется так же, брейк на DeviceIOControl.
в) Поиск в реестре "подозрительных" записей, в частности:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\SoftICE
HKEY_LOCAL_MACHINE\Software\NuMega\SoftICE
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\Loader32.Exe. Устраняется ловушкой на операции с реестром.
г) Разновидность в). Работа с реестром через файловые операции или через сектора. Устраняется теми же способами.
Метод второй: Device-ный.
а) Только для Ring0:
//-------------------------------------------------------------
VMMCall Test_Debug_Installed
je not_installed
//-------------------------------------------------------------
или
//-------------------------------------------------------------
mov eax, Device_ID ;VxD ID->202h для SICE или 7a5Fh для SIWVID
mov edi, Device_Name ; можно указать символьное имя устройства,
;если же задан ID, то можно пустую строку.
VMMCall Get_DDB
mov [DDB], ecx ; ecx=DDB или 0 если VxD нет.
//-------------------------------------------------------------
VMMCall это макрос, а не "вызов" библиотечной функции. Он транслируется в INT 20H + маска адреса вызова. (См. DDK).
Устраняется так - bpx Get_DDB if ax==0202 || ax==7a5fh
б) MeltICE - это официальное название сл. Он и был приведён Sash!
CreateFileA("\\.\SICE",...) //для win32
или
_lopen("\\.\SICE",0) //для win16
Имя может быть либо SICE, либо SIVW, либо NTICE. Если открыть VXD удалось, то значит он в памяти. Фактически, после вызова CreateFileA мы попадаем в Kernel32!ORD_0001, эта "затычка" эмулирует VxDCall, она нас приводит к функции vxd-шки VWIN32 под названием _VWIN32_ReleaseWin32Mutex и затем мы получаем список DDB и ищем что задано. Она не грузит vxd, а просто посылает им DIOC_OPEN и DIOC_CLOSEHANDLE сообщения и находит как динамически так и не динамически загруженные VXD.
Устраняется так - bpx CreateFileA if *(esp->4+4)=="SICE" || *(esp->4+4)=="SIWV" || *(esp->4+4)=="NTIC" или bpx VMM_GetDDBList if eax->3=="SICE" || eax->3=="SIWV"
Метод третий: INT
а) Если вызвать INT 41H с функцией AX=4Fh, то в АХ запишется 0F386h в случае присутсвтия какого-нибудь системного отладчика.
б) аналогично а) INT 68H и тоже число в АХ=0F386h.
Работает только в Win9x. В NT/Win2k/XP - бесполезен.
Ну вот вроде и все известные методы "защит". SoftIce их легко обнаруживает и нейтрализует.
← →
Snap (2003-03-22 00:42) [11]Небольшое дополнение: чтобы найти менее развитые отладчики, просто достаточно проверить результат IsDebuggerPresent. Также эту информацию можно прочесть из заголовков программы в памяти, но эффект будет тот же, так что я думаю не зачем мучаться, а использовать IsDebuggerPresent.
Страницы: 1 вся ветка
Текущий архив: 2003.05.19;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.007 c