Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] Działanie programu "w tle"

Ostatnio zmodyfikowano 2009-09-20 22:00
Autor Wiadomość
Thud
» 2009-10-03 20:02:07
Wine jest na tyle głupie, że "głupie" aplikacja napisane z użyciem WinAPI nie odpalą. Głupota głupocie nierówna. Mam Linuxa.
P-10604
malan
Temat założony przez niniejszego użytkownika
Problem z dll
» 2009-10-29 19:01:29
Witam. Wróciłem do pisania mojego jakże skomplikowanego programiku. Trochę poszperałem tu i tam i wyczytałem iż jeśli chcę aby do programu dochodziły wszystkie komunikaty klawiatury (nawet jeśli nie jest on aktywny (nie posiada tak zwanego 'focus-a')) to muszę napisać 'dll', która będzie ładowana "do przestrzeni adresowej każdej aplikacji, która otrzyma komunikat związany z klawiaturą". Takową napisałem jednak:

     -chcąc ją uruchomić z poziomu aplikacji:
C/C++
LoadLibrary( "DLL_.dll" );
HackON(); // zakładanie hook-a
do programu nie dochodzą kom. z innych aplikacji/okien.

     -uruchamiając ją z polecenia 'Uruchom':
rundll32 DLL_, HackON
:
Wystąpił błąd podczas ładowania...
Nie mogę odnaleźć określonego modułu.

Kod biblioteki:
C/C++
//main.h
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
*  in your project.
*/

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C"
{
    #endif
   
    void __stdcall HackON( void );
    void __stdcall HackOFF( void );
   
    #ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

C/C++
//main.cpp
#include "main.h"

#include <fstream>

// a sample exported function
HHOOK uchwytHooka;
HINSTANCE uchwytDLL;
DWORD e;

void __stdcall HackON( void )
{
    LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam );
   
    uchwytHooka = SetWindowsHookEx( WH_KEYBOARD, & KeyboardProc, uchwytDLL, NULL );
   
    e = GetLastError();
    if( e != 0 )
    {
        MessageBox( NULL, "GLE != 0.", "KeyHook", MB_OK | MB_ICONERROR );
       
        std::fstream file( "f.ini", std::ios::out );
        file << e;
        file.close();
    }
   
    if( uchwytHooka == NULL )
         MessageBox( NULL, "Zakładanie 'hooka' nie powiodło się.", "KeyHook", MB_OK | MB_ICONERROR );
    else
         MessageBox( NULL, "Zakładanie 'hooka' powiodło się.", "KeyHook", MB_OK | MB_ICONINFORMATION );
   
};

void __stdcall HackOFF( void )
{
    if( MessageBox( NULL, "Czy usunąć 'hooka' ?", "KeyHook", MB_YESNO | MB_ICONQUESTION ) == IDYES )
    {
        bool OFF = UnhookWindowsHookEx( uchwytHooka );
       
        if( OFF )
             MessageBox( NULL, "Zdjęcie 'hooka' powiodło się.", "KeyHook", MB_OK | MB_ICONINFORMATION );
        else
             MessageBox( NULL, "Zdjęcie 'hooka' nie powiodło się.", "KeyHook", MB_OK | MB_ICONERROR );
       
    }
};

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
    switch( fdwReason )
    {
    case DLL_PROCESS_ATTACH:
       
        MessageBox( NULL, "Biblioteka załadowana.", "KeyHook", MB_OK | MB_ICONINFORMATION );
        uchwytDLL = hinstDLL;
       
        // attach to process
        // return FALSE to fail DLL load
        break;
       
    case DLL_PROCESS_DETACH:
        MessageBox( NULL, "Biblioteka usunięta.", "KeyHook", MB_OK | MB_ICONINFORMATION );
        // detach from process
        break;
       
    case DLL_THREAD_ATTACH:
        // attach to thread
        break;
       
    case DLL_THREAD_DETACH:
        // detach from thread
        break;
    }
    return TRUE; // succesful
}


LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam )
{
    if( code >= HC_ACTION )
    {
        Beep( 150, 50 );
    }
   
    return CallNextHookEx( uchwytHooka, code, wParam, lParam );
};
Wzorowałem się na jakimś artykule pisząc ten kodzik, według którego najpierw powinien się wyświetlić komunikat "Biblioteka załadowana". Ani razu go nie widziałem... Aha i tworzę w CB.

Pytania: Co tu jest nie tak? ;p
P-11154
DejaVu
» 2009-10-29 20:20:29
1) Zapodaj link do artykułu
2) Przetestuj najpierw działanie tej biblioteki 'lokalnie' tj. w jakimś prostym programie WinAPI i dolinkuj do niego tą bibliotekę dynamicznie.

Co do uruchamiania:
Wgrałeś tą dll'kę do katalogu odpowiedniego w Windowsie?
P-11155
malan
Temat założony przez niniejszego użytkownika
» 2009-10-29 21:01:46
1. Hooks

2. Napisałem sobie coś takiego, aby sprawdzić, czy w ogóle uda się założyć hook-a:
C/C++
#include <iostream>
#include "main.h"

using namespace std;

int main()
{
    cout << "Hackujemy !!!" << endl;
   
    HackON();
   
    return 0;
}
W linkerze dodałem libDLL_.a, *dll umieściłem w katalogu programu.

Sprawdzałem też jaki kod błędu zwraca GetLastError (kiedy dostawałem komunikat, iż hook-a nie można założyć) -> 1428. Sprawdziłem w msdn:
Cannot set nonlocal hook without a module handle.
Nie rozumiem tylko do czego uchwyt - do biblioteki ? Próbowałem tam wstawić GetCurentThreadID, ale wtedy program otrzymywał kom. tylko i wyłączenie 'od siebie', tzn. komunikaty innych aplikacji nie dochodziły.

3. Dla polecenia jak podałem powyżej w system 32, ale podałem ścieżkę do niej, coś w stylu:
rundll32 C:\...\DLL_, HackON
P-11156
DejaVu
» 2009-10-29 21:27:00
Tu masz podobny problem opisany:
http://www.programmersheaven.com/mb/CandCPP/81932/82018 /re-keyboard-hook-not-working/?S=B10000&ReadPostMode=2

Wniosek z tego taki, że podniesiono poziom bezpieczeństwa w Windowsach 2000/XP i wyżej.

/edit:
http://www.cpp-home.com/forum/viewtopic.php?f=2&t=1601&start=0
Oh, I see the problem. You need to create a new thread and use it's ID rather than 0 if you are not using a DLL.
/edit2:
Może tutaj znajedziesz jeszcze jakieś informacje: http://www.experts-exchange.com/Programming/Languages/CPP/Q_21793781.html. Z tego co jednak czytałem to w każdym temacie problem dotyczył NULL'a i nie znalazłem jakichś wskazówek, które by ten problem rozwiązywały dla przypadku ogólnego.
P-11158
malan
Temat założony przez niniejszego użytkownika
» 2009-10-30 16:18:43
Przeczytałem te wszystkie wiadomości i jak Pan napisał, nie znalazłem nic konkretnego dotyczącego mojego problemu.
Jednak pokombinowałem i działa ! :). Chyba najważniejszą rzeczą jaką zmieniłem było wyeksportowanie funkcji 'DLLmain'. Teraz włączam program, wyświetla się komunikat o załadowaniu 'dll', następnie o poprawnym założeniu 'hook-a'. Kiedy np. otworzę notatnik i wcisnę dowolny klawisz wyświetla mi się komunikat: 'Biblioteka załadowana' :), a w pliku znajdują się literki, które wpisywałem ;).

Dziękuję wszystkim bardzo za pomoc :).
W wolnej chwili podam rozwiązanie w dziale FAQ.
P-11162
manfred
» 2009-09-20 11:25:06
Mianowicie program ma zapisywać wciśnięte przez usera klawisze.
Keylogger znaczy się? Nieładnie, to jest nielegalne...
P-19343
manfred
» 2009-09-20 14:38:16
Pewnie, na 4p już paru takich było, nic nowego ;)
P-19344
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona