Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› Сплайсинг API от MS-Rem в переложении на Си
Посл.ответ Сообщение

Ранг: 4.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 января 2008 00:04 · Поправил: RET
· Личное сообщение · #1

Вот переложил самый продвинутый метод сплайсинга от MS-Rem (с применением мостов) на Си (здесь конкретно как пример в применении к перехвату recv и send из ws2_32), может кому пригодиться, т.к. реально ничего не импортируется из сокетов, то и засечь что мы работаем с сетью и слушаем порты трудно.
////////////////////////////////
//Coded by RET(c)2007//
//////////////////////////////
#pragma once
#define _WIN32_WINNT 0x501
#include <windows.h>
//Примитивы моста
int (PASCAL FAR *tsend )(SOCKET s, const char FAR * buf,int len,int flags);
int (PASCAL FAR *trecv )(SOCKET s,char FAR * buf,int len,int flags);

//Перехваченный send
int PASCAL FAR sends (SOCKET s, const char FAR * buf,int len,int flags)
{
//<-processing
return tsend(s,buf,len,flags);
}

//Перехваченный recv
int PASCAL FAR recvs (SOCKET s,char FAR * buf,int len,int flags)
{
int rl=trecv(s,buf,len,flags);
//<-processing
return rl;
}

//Splicing with bridge (autor MS-Rem)
//**********************************************
bool SPLIS(void)
{
HMODULE WS_H=NULL;
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_PIN,"ws2_32.dll",&WS_H);

if(WS_H==NULL) return false;;
DWORD sendA=(DWORD)GetProcAddress(WS_H,"send");
DWORD recvA=(DWORD)GetProcAddress(WS_H,"recv");
if(sendA && recvA)
{
//тут фишка, которой в исходнике MS-Rem'a не было, а применялась ф-ция
//GetMem, без определения флага PAGE_EXECUTE, здесь такое не пройдет, поэтому:
BYTE* rbridg=(BYTE*)VirtualAlloc(NULL,10,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
BYTE* sbridg=(BYTE*)VirtualAlloc(NULL,10,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
DWORD Protects;
DWORD Protectr;
VirtualProtect((LPVOID)sendA, 5, PAGE_EXECUTE_READWRITE, &Protects);
VirtualProtect((LPVOID)recvA, 5, PAGE_EXECUTE_READWRITE, &Protectr);
ReadProcessMemory(GetCurrentProcess(), (LPVOID)sendA, sbridg, 5, 0);
ReadProcessMemory(GetCurrentProcess(), (LPVOID)recvA, rbridg, 5, 0);
if(!memcmp(sbridg,rbridg,5))
{
sbridg[5]=0xE9;
rbridg[5]=0xE9;
DWORD JA=sendA-(DWORD)sbridg-5;
memcpy(&sbridg[6],&JA,4);
JA=recvA-(DWORD)rbridg-5;
memcpy(&rbridg[6],&JA,4);
tsend=(int (PASCAL*)(SOCKET,const char*,int,int))(DWORD)sbridg;
trecv=(int (PASCAL*)(SOCKET,char*,int,int))(DWORD)rbridg;
BYTE jmp[5]={0xe9,0x00,0x00,0x00,0x00};
JA=(DWORD)recvs - recvA - 5;
memcpy(&jmp[1],&JA,4);
if(WriteProcessMemory(GetCurrentProcess(),(LPVOID)recvA,jmp, 5, 0))
{
JA=(DWORD)sends - sendA - 5;
memcpy(&jmp[1],&JA,4);
if(WriteProcessMemory(GetCurrentProcess(),(LPVOID)sendA,jmp, 5, 0))
{
VirtualProtect((LPVOID)sendA, 5, Protects, &Protects);
VirtualProtect((LPVOID)recvA, 5, Protectr, &Protectr);
return true;
} }}}
return false;
}

Не забываем получить привелегии отладчика пред вызовом SPLIS() и отключать защиту системных файлов
void WFPKill(char *lpFileName)
{
wchar_t lpFileNameW[MAX_PATH];
PVOID fname = &lpFileNameW;
MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, lpFileNameW, sizeof(lpFileNameW));
HMODULE hLib =GetModuleHandle("sfc_os.dll");
if(hLib==NULL) hLib = LoadLibrary("sfc_os.dll");
PVOID func = GetProcAddress(hLib, MAKEINTRESOURCE(5));
if (func == 0) return;
__asm
{
push -1
push fname
push 0
call func
}
}




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 05 января 2008 00:41
· Личное сообщение · #2

Юзайте microsoft detours. Там все более грамотно реализовано.

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 155.4 (ветеран)
Активность: 0.140
Статус: Участник
Робо-Алкаш

Создано: 05 января 2008 00:46
· Личное сообщение · #3

RET, класс! Но луччэ б наверно в виде статьи оформить... с ходу новичкам (таким как я) но сорс налететь трудно.
ntldr, хорошее слово... легкогуглируемое... на РСДН есть стотейка - спасибо.

-----
Researcher




Ранг: 4.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 января 2008 00:49 · Поправил: RET
· Личное сообщение · #4

Если Вас не устраивает "грамотность" напишите лучше и сами. Как отмечалось выше - это конкретный полностью рабочий пример специализированного применения технологии весьма грамотного человека с минимальной функциональностью, соответствующей своему непосредственному назначению. Detours... вы еще с участием .NET напишите.
overwriter Статью готовлю, там полный код будет, правда не знаю как к этому отнесуться, т.к. это будет путеводитель по написанию шпиона для пиринговых сетей (проще объяснять на примерах применения).




Ранг: 155.4 (ветеран)
Активность: 0.140
Статус: Участник
Робо-Алкаш

Создано: 05 января 2008 01:14
· Личное сообщение · #5

RET, а как могут отнестись? Пометочку в стиле : статья обучающая, автор не несет ответственности...это не руководство к действию и все. будем ждать

-----
Researcher





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 05 января 2008 01:17
· Личное сообщение · #6

А на чём было в оригинале?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 4.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 января 2008 01:21 · Поправил: RET
· Личное сообщение · #7

В оригинале у MS-Rem было на делфи.
To ntldr - Про дизассемблер длин: - см. в словаре слово "пример", заодно нормальному русскому языку обучишься без мата. И запомни 5 байт - это пока стандарт API, тем более для сокетов где все функи друг на друга похожи.



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 05 января 2008 01:24
· Личное сообщение · #8

RET
Может быть научишся слушать конструкривные аргументы вместо того чтобы удалять комментарии по теме?

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 4.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 января 2008 01:26 · Поправил: RET
· Личное сообщение · #9

Темы больше нет. Так как она пока в виде примера исчерпана.
Лично меня не интересуют отзывы как таковые, меня интересует код, который работает для моих нужд.
Я здесь бываю под разными никами и давно заметил, что новичков (по рангу) здесь некоторые готовы сожрать заживо, несмотря ни на какие идеи (которые потом можно запросто выдать за свои). Хочется сказать таким товарисщам, что они мне не товарищи и самоутверждаться на этом глупо, тупо и т.д. Проблемы с мотивацией - это проблемы со здоровьем, а это клиника. Не будем дальше чесать яйца, а займемся делом.


 eXeL@B —› Программирование —› Сплайсинг API от MS-Rem в переложении на Си
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати