Окна в проге

Тема в разделе "WASM.WIN32", создана пользователем AntiB, 1 апр 2010.

  1. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Доброе время суток!

    Есть программа (чужая) и есть dll которая при старте программы подгружается в АП этой программы. Вопрос в том, как можно как получить hWnd всех окон (которые будут создаваться) от этой программы? Думал просплайсить CreateWindowExA/CreateWindowExW потом восстановить код функций и их просто вызвать. Но мне нужны все окна, а в теории можно во время снятие сплайса другой поток создаст окно и я об этом не узнаю.

    Заранее всем спасибо!
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    AntiB
    достаточно перехватить только CreateWindowExW, или чтонить уровнем ниже
    сплайсинг убирать не обязательно, достаточно скопировать куданить убитые сплайсингом инструкции, и вызывать их

    также от других потоков спасает критическая секция
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    перечислить потоки процесса и для каждого потока сделать EnumThreadWindows...
     
  4. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    А это нельзя?
    SetWindowsHookEx
     
  5. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    qwe8013
    Большое спасибо - то что нужно

    GoldFinch
    Критические секции в сплайсинге - как только я сниму перехват нету что синхронизировать.

    Rel
    Не то что нужно, но спасибо!
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. bool SpliceBridge(__in DWORD addr,__in DWORD new_addr,__out DWORD& true_addr)
    2. {
    3.     DWORD Protects=     NULL;
    4.     DWORD JA=           NULL;
    5.     BYTE* rbridg=       NULL;
    6.     if(addr && new_addr)
    7.     {
    8.  
    9.         rbridg=(BYTE*)VirtualAlloc(NULL,10,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    10.         VirtualProtect((LPVOID)addr, 5, PAGE_EXECUTE_READWRITE, &Protects);  
    11.         ReadProcessMemory(GetCurrentProcess(), (LPVOID)addr, rbridg, 5, 0);
    12.         rbridg[5]=0xE9;
    13.         JA=addr-(DWORD)rbridg-5;
    14.         memcpy(&rbridg[6],&JA,4);
    15.         true_addr=(DWORD)rbridg;       
    16.         BYTE jmp[5]={0xe9,0x00,0x00,0x00,0x00};
    17.         JA=(DWORD)new_addr - addr - 5;
    18.         memcpy(&jmp[1],&JA,4);
    19.         if(WriteProcessMemory(GetCurrentProcess(),(LPVOID)addr,jmp, 5, 0))
    20.         {
    21.             VirtualProtect((LPVOID)addr, 5, Protects, &Protects);
    22.             return true;
    23.         }
    24.     }
    25. return false;
    26. }
     
  7. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    punxer
    А нафига в своем процессе использовать WriteProcessMemory?
    Да и вообще почему бы не использовать свободный участок в уже имеющейся области памяти с аттр. ERW, а выделять ее? И вообще что-то напоминает мой код 100летней выдержки.
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    RET
    Код ms-rema
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    точнее оригинал на делфи его
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    punxer
    Вы ведь понимаете насколько это плохое решение ?
    apfn достаточно для решения большинства задач связанных с нотификацией.
     
  11. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Clerk
    Что за apfn?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    punxer
    KernelCallbackTable.