Возможно ли отследить ее работу используя API шпион ? Если да то какой лучше использовать ? kerberos или API Monitor 1.5 (Beta) by Rohitab ?
asmlamo Во-первых он не работает с диском через DeviceIoControl, а просто отдает команды определённому девайсу. Во-вторых чтобы отследить какие команды он дает, какие инпут\оутпут буферы передает, можно перехватить, как в ринг3 (NtDeviceIoControlFile) так и в ринг0 ( похукав обработчики драйвера, который создает девайс). Ты подробнее опиши, что тебе надо, может быть мы придумаем лучший вариант.
Сделать программу загрузчик защищенной программы. Она будет создавать процесс в тормознутом состоянии (CREATE_SUSPENDED), брать контекст процесса и запоминать точку входа, она вроде в eax там. Потом создавать область памяти и сувать туда свой код, менять eax на точку входа своего кода. В коде: Перехватывать DeviceIoControl сплайсингом. создавать окошки/открывать файлы для вывода информации/whatever. прыгать на оригинальную точку входа. Типа того что FreeCap и иже с ними делает.
boobl Процесс не может быть в заторможенном или другом состоянии. При его создании в нём нет потоков. Win32StartAddress меняется с помощью ZwSetInformationThread, поток не с нёё начинает своё исполнение. Вообщем понятно - надо выполнить наш код до того, как первая инструкция программы получит управление. И вообще загрузчик здесь не нужен(а если нужен - их множество, мне нравится оля), можно присоеденить к программе модуль или выполнить патчь её модуля, если нет самозащиты.
Как вариант, можно перехватить работу на самом низком уровне -- с портами. Если известно, на каком порте сидит винчестер, то его можно перехватить. Возможность установки точек останова на пространство ввода/вывода появилась еще в P6, так что сейчас на всех процессорах есть. Наличие этой возможности определяется по cpuid. Далее надо установить точку входа на командный регистр и ждать команды IDENTIFY_DEVICE/IDENTIDY_ATAPI_DEVICE. Далее будет идти считывание из регистра данных в котором вернется серийник и номер модели -- самое время подменить его. Беда в том, что способ не простой -- надо знать как идет считывание данных, по прерыванию, или нет, инструкциями rep insw/insd, или просто чтение из регистра в цикле. Ну и к сожалению это только в ring0.
Clerk У меня вот это довольно неплохо работало в свое время Код (Text): int main(int argc, char *argv[]) { PROCESS_INFORMATION pInfo; STARTUPINFO sInfo; CONTEXT tContext; char iCode[0xFB]; ZeroMemory(&sInfo, sizeof(sInfo)); sInfo.cb = sizeof(sInfo); CreateProcess("portal.exe", NULL, NULL, NULL, 0, CREATE_SUSPENDED, NULL, NULL, &sInfo, &pInfo); tContext.ContextFlags = CONTEXT_FULL; GetThreadContext(pInfo.hThread ,&tContext); VOID *iAddr = VirtualAllocEx(pInfo.hProcess, NULL, 0xFB, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE); Compile(iCode, (DWORD)iAddr, tContext.Eax); WriteProcessMemory(pInfo.hProcess, iAddr, (LPCVOID)iCode, 0xFB, NULL); tContext.Eax = (DWORD)iAddr; SetThreadContext (pInfo.hThread, &tContext); ResumeThread(pInfo.hThread); return EXIT_SUCCESS; }
boobl Clerk имел в виду что "объект" процесс, вообще не работает, это всего лишь контейнер для потоков. Код (Text): CreateProcess("portal.exe", NULL, NULL, NULL, 0, CREATE_SUSPENDED, NULL, NULL, &sInfo, &pInfo); Тут самый первый рабочий поток, создается засупсенденным.
WIN32 +1 CreateProcess - не только процесс создаёт, но и поток в нём, 6-й параметр в CreateProcess определяет в каком состоянии будет поток. Этот параметр и передаётся в ZwCreateThread.