 |
|

13.09.2008, 20:21
|
|
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
С нами:
9702986
Репутация:
479
|
|
Сообщение от FrMn
поробуйте не в настройках, а явно, как у 0xc0de.
p.s. ваш перехват не годится для многопоточных приложений. также перехватчик intMessage или как он там, должен возвращать не 1, а то, что возвратит оригинальный MessageBox
Сделал, чтобы возвращал то что и оригинальный messageboxa;
явно, я так понял это так?
#pragma pack (push, 1);
struct jmp_far {
BYTE op_push;
DWORD arg;
BYTE op_ret;
};
#pragma pack (pop, 1);
лишнюю main() убрал.
Ничего не изменилось
|
|
|

13.09.2008, 20:35
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
С нами:
9981026
Репутация:
1564
|
|
2ntldr. Перед тем, как переписывать начало функции надо разрешить запись по адресу месадбокса с помощью функции VirtualProtect
http://msdn.microsoft.com/en-us/library/aa366898(VS.85).aspx
Установи защиту в PAGE_EXECUTE_READWRITE
не увидела с начала, что функи нет
И еще при выгрузке либы неплохо было бы байты восстанавливать в начале функции.
if (ul_reason_for_call == DLL_PROCESS_DETACH){
// код снятия перехвата
}
Последний раз редактировалось 0x0c0de; 13.09.2008 в 20:44..
|
|
|

13.09.2008, 21:18
|
|
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
С нами:
9702986
Репутация:
479
|
|
Добавил:
PHP код:
if(ul_reason_for_call == DLL_PROCESS_DETACH )
{
hookoff();
}
...
PHP код:
void hookoff(void) {
WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)&buf, 6, &written);
}
Изменил:
PHP код:
void intercept(void) {
DWORD oldf;
int prot;
adrmesbox = (DWORD)GetProcAddress(GetModuleHandleA("user32.dll"),"MessageBoxA");
if(adrmesbox == 0)
{
MessageBoxA(NULL, "MessageBoxA не найден", "ошибка", 0);
return;
}
prot = VirtualProtect((void*)adrmesbox,6,PAGE_EXECUTE_READWRITE,&oldf);
if (!prot) {
ExitProcess(0);
}
jump.op_push = 0x68;
jump.arg = (DWORD)&intMesbox;
jump.op_push = 0xC3;
ReadProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)buf, 6, &written);
WriteProcessMemory(GetCurrentProcess(), (void*)adrmesbox, (void*)&jump, 6, &written);
}
|
|
|

13.09.2008, 21:48
|
|
Познающий
Регистрация: 08.08.2008
Сообщений: 55
С нами:
9346084
Репутация:
54
|
|
проверь что возвращают Read(Write)ProcessMemory, можт исчо привилегею потипу SeDebugPrivilege получить?
|
|
|

13.09.2008, 22:07
|
|
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
С нами:
9981026
Репутация:
1564
|
|
2ntldr
Ненене. мего глючный код.
Надо так
Код:
jump.op_push = 0x68;
jump.arg = (DWORD)&intMesbox;
jump.op_ret = 0xC3;
А вы сначала написали
Код:
jump.op_push = 0x68;
jump.arg = (DWORD)&intMesbox;
jump.op_push = 0xC3;
Разница налицо. Теперь все пашет, проверила под отладчиком
|
|
|

13.09.2008, 22:35
|
|
Постоянный
Регистрация: 04.12.2007
Сообщений: 424
С нами:
9702986
Репутация:
479
|
|
Спасибо большое) ошибка оказалась глупее чем все думали. пока что проверить возможности нет, тк свет вырубили, но уверен, чтоьпроблема решена.
|
|
|

15.09.2008, 12:14
|
|
Постоянный
Регистрация: 05.05.2006
Сообщений: 743
С нами:
10535289
Репутация:
107
|
|
Есть обычное простенькое серверное приложение принимающее через сокет и выводящее в бесконечном цикле с определенным условием выхода текст.Со всеми пложенными bind,listen,accept.Оно расчитано на подключение одного клиента.Допустим если я захочу добавить в цикл условие выхода с возвратом ожидания на listen,допустим я туда буду возвращатся с помощью goto .Собственно вопрос куда ставить метку на listen?И что при этом надо в памяти очистить что бы можно было повторно подключится?
|
|
|

15.09.2008, 12:22
|
|
Познавший АНТИЧАТ
Регистрация: 05.03.2007
Сообщений: 1,985
С нами:
10097606
Репутация:
3349
|
|
если я правильно понял, то алгоритм таков тебе нужен:
accept - возвращает тебе сокет для работы с присоединившимся человеком.
затем ты запускаешь потом через CreateThread и передешь функции обработки этот самый дискриптор. И далее заново циклом на accept.
А функция которая работает в потоке - там делаешь свои дела юзая переданный в параметрах дискриптор.
|
|
|

15.09.2008, 13:36
|
|
Участник форума
Регистрация: 28.09.2005
Сообщений: 180
С нами:
10851302
Репутация:
34
|
|
эээ...вообще для первоклассников вопрос
есть int x,y поменять местами значение x,y. если возможно без ввода дополнительных переменных, если нельзя, то ввести новые переменные.
тут два слова ответ..но какой? 
|
|
|

15.09.2008, 14:37
|
|
Познавший АНТИЧАТ
Регистрация: 21.03.2007
Сообщений: 1,200
С нами:
10074686
Репутация:
1204
|
|
есть int x,y поменять местами значение x,y. если возможно без ввода дополнительных переменных, если нельзя, то ввести новые переменные.
x = x + y;
y = x - y;
x = y - x;
как-то так =\
__________
как-то не так =\
Последний раз редактировалось iv.; 15.09.2008 в 14:54..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|