Сейчас на форуме: zds (+6 невидимых) |
eXeL@B —› Программирование —› Сплайсинг.Вероятно плутаю с арифметикой адресов а может и нет.Подскажите. |
Посл.ответ | Сообщение |
|
Создано: 12 апреля 2014 21:31 · Личное сообщение · #1 Кидает походу в начало затычки,а не на оригинальный код за затычкой.Мозги уже кипят с этой адресной арифметикой. [С] typedef int (WINAPI *MessageBoxADYn)(_In_opt_ HWND hWnd,_In_opt_ LPCSTR lpText,_In_opt_ LPCSTR lpCaption,_In_ UINT uType); typedef void (WINAPI *WINAPIBackRoutine)(); BYTE *orig; BYTE jmp[5]; #pragma pack(push,1) struct JmpShell { unsigned char op; DWORD adr; }; #pragma pack(pop) void SetHOOK(DWORD adr,DWORD GateAdr) { SetLastError(0); DWORD prev=0; VirtualProtect((void*)adr,5,PAGE_EXECUTE_READWRITE,&prev); orig=(BYTE*)VirtualAlloc(0,10,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE); memcpy(orig,(void*)adr,5); DWORD BackShell=((DWORD)orig)+5; JmpShell *jback=(JmpShell *)BackShell; jback->op=0xe9; jback->adr=(adr-5) - ((DWORD)orig+5); JmpShell *jsh=(JmpShell*)adr; jsh->op=0xe9; jsh->adr=GateAdr-adr-5; VirtualProtect((void*)adr,5,prev,&prev); } void Back() { WINAPIBackRoutine BB=(WINAPIBackRoutine)orig; BB(); } void /*WINAPI*/ Gate(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType) { printf("!"); Back(); } int _tmain(int argc, _TCHAR* argv[]) { HMODULE u32=LoadLibrary(L"user32.dll"); MessageBoxADYn MB=(MessageBoxADYn)GetProcAddress(u32,"MessageBoxA"); SetHOOK((DWORD)MB,(DWORD)&Gate); //MB(0,"","",MB_OK); printf("func adr: %X\n",MB); MessageBoxA(0,"","",MB_OK); //printf("%d",GetLen((BYTE*)MB)); /*int sum=0,curlen=0; BYTE *seek=(BYTE*)MB; for(;;) { curlen=GetLen(seek); sum=sum+curlen; seek=(BYTE*)( ((DWORD)seek)+curlen ); printf("%d SUMlen: %d \n",curlen,sum); _getch(); }*/ _getch(); return 0; } [/С] |
|
Создано: 12 апреля 2014 21:44 · Поправил: Vovan666 · Личное сообщение · #2 |
|
Создано: 12 апреля 2014 21:48 · Личное сообщение · #3 |
|
Создано: 12 апреля 2014 23:06 · Личное сообщение · #4 |
|
Создано: 12 апреля 2014 23:23 · Поправил: kruasancheg · Личное сообщение · #5 Vovan666 пишет: Давай уж скомпилированный вариант, глаза болят от кривоскопиррованного копи-паста. Code:
81b5_12.04.2014_EXELAB.rU.tgz - splaice.exe |
|
Создано: 13 апреля 2014 12:58 · Личное сообщение · #6 Code:
|
|
Создано: 13 апреля 2014 14:33 · Личное сообщение · #7 |
|
Создано: 13 апреля 2014 16:15 · Личное сообщение · #8 |
|
Создано: 13 апреля 2014 16:19 · Личное сообщение · #9 вместо MessageBoxA(0,"test2","test2",MB_OK) вызывается Gate->MessageBoxExA(hWnd,"NewMessageBoxA", lpCaption, uType, 0) просто как пример работы хука. MessageBoxExA можно убрать. если нужно вызывать оригинальную функу MessageBoxA, то в SetHOOK нужно сохранять оригинальные байты перед их изменением, а перед вызовом MessageBoxA восстанавливать их, после вызова опять ставить хук. |
|
Создано: 13 апреля 2014 17:23 · Личное сообщение · #10 |
|
Создано: 13 апреля 2014 22:09 · Личное сообщение · #11 |
|
Создано: 13 апреля 2014 23:42 · Поправил: kruasancheg · Личное сообщение · #12 Code:
Поясните странность плз - в иде начало мессаджбокса начинаеться так: Code:
А в ольке за бряком вижу такое вот: Code:
|
|
Создано: 14 апреля 2014 02:50 · Личное сообщение · #13 soft пишет: *(DWORD*)(dwOrigFunc+1) = dwNewFunc - (dwOrigFunc+5); Неправильное выражение,так будет работать в случае если код подменной функции будет ниже хученого кода, если выше то вы обломитесь, в арифметеке Code:
----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 14 апреля 2014 03:13 · Личное сообщение · #14 |
|
Создано: 14 апреля 2014 08:31 · Личное сообщение · #15 |
|
Создано: 14 апреля 2014 09:17 · Личное сообщение · #16 ajax пишет: совсем не так часто такое бывает Ну да, периодические краши-это так мило. Особенно когда происходят не особо часто и непредсказуемо. ClockMan пишет: Неправильное выражение,так будет работать в случае если код подменной функции будет ниже хученого кода А не смущает, что код идентичный? Имеется в виду для х86, конечно. Для х64 дальше 2 гб в любом случае таким переходом не дотянется. |
|
Создано: 14 апреля 2014 10:16 · Поправил: kruasancheg · Личное сообщение · #17 |
|
Создано: 14 апреля 2014 11:43 · Личное сообщение · #18 Мой велосипед на базе дизассемблера mediana Code:
|
|
Создано: 14 апреля 2014 11:43 · Поправил: ajax · Личное сообщение · #19 kruasancheg троллят. ибо кг/ам Veliant под PC-архитектуру флашить смысла нет. так же, как GCP вернет -1 для текущего всегда. но, с точки зрения хорошего кодерства - все верно Archer lock exchange или типа того - давно видел забавный вариантик для многопотока. обычно бывают конкретные случаи, в них делать крит секции и тп - смысла нет. с точки зрения не писателя аверов, или мудреного софта пофлудю. ресурс превращается в "дайте здесь и щаз же, гугль забанен" ----- От многой мудрости много скорби, и умножающий знание умножает печаль |
|
Создано: 14 апреля 2014 12:00 · Личное сообщение · #20 kruasancheg пишет: Я его поставил.Разве не видно??? Раз 10 перечитал ваше сообщение и так не уловил сути вопроса. Так что каков вопрос - таков ответ. soft пишет: вместо MessageBoxA(0,"test2","test2",MB_OK) вызывается Gate->MessageBoxExA(hWnd,"NewMessageBoxA", lpCaption, uType, 0) просто как пример работы хука. MessageBoxExA можно убрать. если нужно вызывать оригинальную функу MessageBoxA, то в SetHOOK нужно сохранять оригинальные байты перед их изменением, а перед вызовом MessageBoxA восстанавливать их, после вызова опять ставить хук. Выделяем память, копируем в неё первые байты программы и после них лепим прыжок на оставшуюся часть функции. В начале похученной функции ставим переход на свой обработчик, а в его конце переход на выделенную память. Как-то красивее и надёжнее ----- Research For Food |
|
Создано: 14 апреля 2014 13:19 · Поправил: kruasancheg · Личное сообщение · #21 daFix пишет: Выделяем память, копируем в неё первые байты программы и после них лепим прыжок на оставшуюся часть функции. В начале похученной функции ставим переход на свой обработчик, а в его конце переход на выделенную память. Как-то красивее и надёжнее А у меня как по вашему?Суть вопроса - ПОЧЕМУ ОНО ТАК НЕ РАБОТАЕТ. |
|
Создано: 14 апреля 2014 13:33 · Личное сообщение · #22 |
|
Создано: 14 апреля 2014 14:54 · Личное сообщение · #23 |
|
Создано: 14 апреля 2014 15:35 · Поправил: Veliant · Личное сообщение · #24 |
|
Создано: 14 апреля 2014 15:42 · Личное сообщение · #25 |
|
Создано: 14 апреля 2014 22:51 · Личное сообщение · #26 |
|
Создано: 15 апреля 2014 00:35 · Поправил: Модератор · Личное сообщение · #27 |
|
Создано: 15 апреля 2014 01:34 · Поправил: Модератор · Личное сообщение · #28 kruasancheg Чтобы не заморачиваться, можешь использовать конструкцию: Code:
Тогда не будет проблем вычислением длины прыжка. А вообще, сейчас у тебя тут ошибка kruasancheg пишет: jback->op=0xe9; jback->adr=(FuncAdr+5) - ( ((DWORD)orig) +5);//возврат на тело оригинальной ф-ции Надо : jback->op=0xe9; jback->adr=FuncAdr - ( ((DWORD)orig) +5); ----- Research For Food |
|
Создано: 15 апреля 2014 02:28 · Личное сообщение · #29 |
|
Создано: 17 апреля 2014 09:16 · Личное сообщение · #30 |
eXeL@B —› Программирование —› Сплайсинг.Вероятно плутаю с арифметикой адресов а может и нет.Подскажите. |