s
Keyloggera na twojej stronie testowalem działa

, ale pod win7 doczytałem że trzeba hooka zrobić w dll, a tego nie potrafię.
Nie sądzę by umieszczenie kodu w bibliotece DLL miało aż takie znaczenie, gdyż DLL jest tylko rozszerzeniem aplikacji. Gdy kiedyś szukałem kodu keylogera, gdy nowością był WinXP to też spotykałem się z opiniami, że należy to robić w DLL, ale jak widać kod dało się bez problemu umieścić w aplikacji. Użycie DLL ma tą zaletę, że można taki keyloger załadować jako usługę i w ten sposób ukryć przed użytkownikiem. Problem z WinXP jest pewnie związany z samym zamontowaniem haka systemowego. Nie mam niestety na stałe dostępu do tego systemu, wiec nie mogę tego sprawdzić, ale być może ktoś to czytający znajdzie chwilę by przetestować kod keylogera w Win7.
A testowałem te dwa przykłady pod buildera 2006, i ten do nowszego, u mnie (2006), nie działał ten pod 2006 zn. nie zapisywał pełnej nazwy ścieżki do pliku w rejestrze, tylko ze trzy pierwsze litery np: "C://proj" Za to ten pod 2009 działa OK.
Te kody nie różnią się wiele między sobą w zasadzie to chodziło tylko o konwersje zmiennych, gdyż w BCB 2006 mamy zmienną typu AnsiString, a w 2009 i 2010 typ UnicodeString. Kod nie działał prawidłowo, gdyż popełniłem bardzo głupi błąd, użyłem funkcji sizeof do określenia rozmiaru zmiennej typu AnsiStirng, co jest niedopuszczalne.
Sprawdź ten kod:
#include <registry.hpp>
HKEY hKey;
if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0, NULL, 0, KEY_ALL_ACCESS, NULL,
&hKey, NULL) == ERROR_SUCCESS)
{
char name[] = "Program name";
char date[] = "c:\\program.exe";
RegSetValueEx(hKey, name, 0, REG_SZ, (PBYTE)date, strlen(date));
RegCloseKey(hKey);
}
Tym razem użyłem zmiennych typu char, więc będzie działać prawidłowo. Zamieniłem również funkcję
sizeof na
strlen, gdyż tej należy użyć do określania długości łańcucha znaków typu chat. Ponieważ jesteś początkujący to jeszcze podam kod z pobieraniem ścieżki do programu. Jeżeli program ma dodać siebie samego do rejestru, to nie można określać ścieżki na sztywno, gdyż program może znajdować się w różnych lokalizacjach:
AnsiString progPath = Application->ExeName.t_str();
AnsiString progName = ExtractFileName(progPath).t_str();
progName = progName.SubString(1, progName.Length() - 4);
HKEY hKey;
if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0, NULL, 0, KEY_ALL_ACCESS, NULL,
&hKey, NULL) == ERROR_SUCCESS)
{
char name[MAX_PATH];
sprintf(name, "%s", progName.c_str());
char date[MAX_PATH];
sprintf(date, "%s", progPath.c_str());
RegSetValueEx(hKey, name, 0, REG_SZ, (PBYTE)date, strlen(date));
RegCloseKey(hKey);
}
Można też trochę prościej z wykorzystaniem tylko zmiennych typu AnsiString, bez char:
AnsiString progPath = Application->ExeName.t_str();
AnsiString progName = ExtractFileName(progPath).t_str();
progName = progName.SubString(1, progName.Length() - 4);
HKEY hKey;
if(RegCreateKeyExA(HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
0, NULL, 0, KEY_ALL_ACCESS, NULL,
&hKey, NULL) == ERROR_SUCCESS)
{
RegSetValueExA(hKey, progName.c_str(), 0, REG_SZ, (PBYTE)progPath.c_str(),
progPath.Length());
RegCloseKey(hKey);
}