PDA

Просмотр полной версии : Предлагаю к реверсированию спамбот


sn0w
24.05.2007, 17:29
Отрыл на компе одной девки с офиса. нам кстати пров доступ отрубил изза этого бота. Решил исследовать зверюгу (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().

#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 потока в винлогон и копия тела. Вообщем предлагаю к реверсу! ж)

hidden
24.05.2007, 18:56
Ставь бряк на обработчик sysenter'ов, он может вообще функциями третьего кольца не пользуется

Xserg
24.05.2007, 21:44
Вряд ли его получится распаковать.

Из импорта использует только VertualProtect

Распаковывается частями, адреса АPI находит из экспорта системных библиотек, каждый раз при вызове любой функции. (торопится ему некуда)

У меня вообще не хочет работать.
После очередного вызова NtQueryInformationProcess, останавливается на исключении, не устанавливая SEН обработчик!

Запускал без отладчика, без антивиря и фаервола, Не работает.

Hellsp@wn
25.05.2007, 14:57
Вроде знакомый криптор висит...
Вечером, если будет время анпакну :)

добавлено:

короче глянул, да там то, что я думал.
Под криптором упх, дальше сам давай ;)

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)

Xserg
26.05.2007, 18:13
Прикольный глюк у этого бота.
Если prcc.dll грузится в память по адресу ниже 0х400000 , то не работает