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