Отрыл на компе одной девки с офиса. нам кстати пров доступ отрубил изза этого бота. Решил исследовать зверюгу (hччp://rapidshare.com/files/33118600/rpcc.dll.html). 1) Итак наша длль лежит по адресу system32/rpcc.dll. при этом доступ к файлу заблокирован. 2) Прописана в winlogon/notify. при удалении параметра он ессна появляется снова. 3) Итак, отрубаем его: открываем список потоков в контексте winlogon, и отправляем пару (те которые kernel32!CreateThread+0x24) в спячку. Затем убиваем. 4) Вытираем инит с winlogon/notify 5) Перегружаем тачку. 6) Берем терь живой бинарник с system32/rpcc.dll 7) Запакована либка хер знает чем - там при распаковке и ммх интсрукции используются. я так и не распаковал 8) Пишем простенький лоадер (я дамп хотел снять), который тока подгружает эту либу. Итак я написал следующее: MessageBox(0,"About to load rpcc.dll...",0,0); LoadLibrary("rpcc.dll"); MessageBox(0,"Now you can dump physical memory..."0,0); ...и не сработало. после запуска и первого мессаджа, процесс лоадера вылетал к чертям. причем также удалялся и экзешник лоадера, а его образ копировался в system32/rpcc.dll !)). Это ессно навело на мысль что после анпака, либа убивала свой процесс. Поставил сплайс на TerminateProcess(). Code: #include <windows.h> #pragma comment(linker,"/MERGE:.rdata=.text") #pragma comment(linker,"/SECTION:.text,EWRX") #pragma comment(linker, "/NODEFAULTLIB") #pragma comment(linker, "/ENTRY:startcode") #pragma pack(1) typedef struct mov_n_jmp{ BYTE movEAXaddr; BYTE func_addr[4]; BYTE jmpEAX[2]; }MOV_N_JMP; #pragma pack() BOOL __stdcall MyTerminateProcess(HANDLE,DWORD) { MessageBox(0,"TerminateProcess() called",0,0); return TRUE; } void startcode() { DWORD addr, myaddr, prot; MOV_N_JMP mj; MessageBox(0,"Splicing TerminateProcess()...",0,0); // prepare... addr = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "TerminateProcess"); myaddr = (DWORD)MyTerminateProcess; VirtualProtect((void*) addr, 512, PAGE_EXECUTE_READWRITE, &prot); // do a splice mj.movEAXaddr = 0xB8; mj.jmpEAX[0] = 0xFF; mj.jmpEAX[1] = 0xE0; CopyMemory(&mj.func_addr[0], &myaddr, 4); CopyMemory((void*)addr, &mj, sizeof(mj)); MessageBox(0,"Patch ok, trying to call it...",0,0); TerminateProcess(0,0); MessageBox(0,"Now attempting to load rpcc.dll...",0,0); LoadLibrary("rpcc.dll"); MessageBox(0,"Operation complete",0,0); } и опять таки ничего!! 2 потока в винлогон и копия тела. Вообщем предлагаю к реверсу! ж)
Вряд ли его получится распаковать. Из импорта использует только VertualProtect Распаковывается частями, адреса АPI находит из экспорта системных библиотек, каждый раз при вызове любой функции. (торопится ему некуда) У меня вообще не хочет работать. После очередного вызова NtQueryInformationProcess, останавливается на исключении, не устанавливая SEН обработчик! Запускал без отладчика, без антивиря и фаервола, Не работает.
Вроде знакомый криптор висит... Вечером, если будет время анпакну добавлено: короче глянул, да там то, что я думал. Под криптором упх, дальше сам давай Code: 00791000 60 PUSHAD 00791001 BE 00B07800 MOV ESI,rpcc.<ModuleEntryPoint> 00791006 8DBE 0060FFFF LEA EDI,DWORD PTR DS:[ESI+FFFF6000] 0079100C 57 PUSH EDI 0079100D 83CD FF OR EBP,FFFFFFFF 00791010 EB 10 JMP SHORT rpcc.00791022 для отладки юзал OllyDbg + PhantOm для скрытия не ставь обычные бряки на апи (int 3) юзай железные (hardware)
Прикольный глюк у этого бота. Если prcc.dll грузится в память по адресу ниже 0х400000 , то не работает