Hook funkcji time z biblioteki msvcrt.dll

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Siemanko:)

Mam pewien komponent do delphi, który ma ograniczenie czasowe. Po zainstalowaniu komponentu w delphi należało jeszcze zarejestrować kontrolkę ocx za pomocą regsrv32. Programy pisane przy pomocy tego komponentu korzystają właśnie z tej kontrolki ocx. Oprócz ograniczenia czasowego wyświetlany jest tzw. NagScreen informujący że to trial. Nigdzie nie mogę znaleźć pełnej wersji tego komponentu więc postanowiłem go "zcrackować" tzn.

Zakładam Hooka na MessageBoxA (ten NagScreen) tak żęby program go nie wyświetlał i myślał że użytkownik kliknął na OK. To mi działa. Do zakładania hooka korzystam z komponentu afxcodehook. Oto kod:

...
newMessageBoxA: function (hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: Cardinal): Integer; stdcall;
...
function callbackMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: Cardinal): Integer; stdcall;
begin
Result := 1;
end;
...
HookCode(GetProcAddress(GetModuleHandle('user32'), 'MessageBoxA'), @callbackMessageBoxA, @newMessageBoxA);

Teraz chciałbym oszukać komponent co do czasu jaki jest ustawiony w komputerze ale tak by niezmieniać czasu w kompie tylko zhookować tą funkcję za pomocą której komponent odczytuje sobie czas systemowy. Wrzuciłem na virustotal.com tą kontrolkę ocx i pokazało że korzysta ona m.in z funkcji time z biblioteki msvcrt.dll. I rzeczywiście tak jest. Nawet 3 razy z niej korzysta - ciekawe po co aż 3 razy?:)

Napisałem coś takiego:

newTime: function (timer: PCardinal): Cardinal ; stdcall;
...
function callbackTime(timer: PCardinal): Cardinal ; stdcall;
begin
// showmessage( 'Hello World' );

Result:=newTime(timer);
end;
...
HookCode(GetProcAddress(GetModuleHandle('msvcrt'), 'time'), @callbackTime, @newTime);

Problem w tym, że nie do końca działa mi ten hook na tą funkcję time. Hook się zakłada ale wywala mi pod delphi bład : Access violation at address 00000000. Read of address 00000000 i klapa. Zamiast Result:=newTime(timer); podstawił bym jakąs stałą wartość. Taki miałem plan ale mi to nie działa. Help.

Tutaj jest troche informacji na temat tej funkcji time:
http://www.cplusplus.com/reference/clibrary/ctime/time/
http://msdn.microsoft.com/en-us/library/1f4c8f33%28v=vs.80%29.aspx Tam jest napisane pod kątem programowania w C i nie wiem czy dobrze zadeklarowałęm tą funkcję pod delphi.
 

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
no nic dziwnego ze sie wywala. Funkcja time jak reszta funkcji w bibliotece msvcrt nie jest typu stdcall(funkcja dba o wyczyszczenie stosu na koniec wywolania) tylko jest typu cdecl (czyli ten kto wywoluje ten sprzata stos) a wywolywac moze 3 razy bo kozystac z niej moze jeszcze w prologu programu.

A jak chcesz to mozesz mi podeslac ten program to ja sproboje go jakos scrackowac w wolnym czasie.
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Dzięki. Zmieniłem typ funkcji na cdecl i już wszystko ładnie działa bez błedów.

Tzn. gdy dam Result:=newTime(timer); to komponent działą lub nie w zalezności jaki mam czas ustawiony w systemie (ja mam zainstalowaną starszą wersję 3.0 a na ich stronie jest już 3.1 dostepna) - działa mi gdy ustawie w kompie rok 2007 15 październik.

Wiec daje Result:=1192454195; tak by funkcja time zwracała cały czas tą samą wartość dla której komponent powinien działać ale niestety nie działa i komponent informuje mnie żę trial się skończył - nawet gdy w systemie mam ustawiony rok 2007 15 październik. Komponent nie daje się oszukać. Może komponent jakoś wykrywa to żę kombinuje coś z czasem hmmm

Ta kontrolka ocx importuje następujące funkcje:

[[ 12 import(s) ]]
MFC42.DLL: -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -
MSVCRT.dll: _EH_prolog, vsprintf, _CIacos, malloc, __CxxFrameHandler, rand, srand, time, atol, _ftol, _mbsicmp, _mbscmp, _except_handler3, strchr, realloc, sprintf, strncmp, strstr, sscanf, _terminate@@YAXXZ, __dllonexit, _onexit, exit, free, calloc, printf, ceil, floor, _CIpow, memmove, _initterm, _adjust_fdiv, __1type_info@@UAE@XZ, atoi, strncpy, tolower, _stricmp, _strnicmp
KERNEL32.dll: InitializeCriticalSection, DeleteCriticalSection, LeaveCriticalSection, EnterCriticalSection, LoadLibraryA, GetTempFileNameA, GetTempPathA, LocalFree, LocalAlloc, FreeLibrary, GetProcAddress, TerminateThread, GetTickCount, lstrcmpA, lstrlenA, CreateEventA, CloseHandle, WaitForSingleObject, SetEvent, DeleteFileA, SetThreadPriority, Sleep
USER32.dll: SetTimer, PostMessageA, EnableWindow, FillRect, PostQuitMessage, PostThreadMessageA, SetWindowLongA, KillTimer, DestroyWindow, DefWindowProcA, GetWindowLongA, RegisterClassA, GetClassInfoA, UnregisterClassA, GetForegroundWindow, CreateWindowExA, GetDesktopWindow, MessageBoxA
GDI32.dll: GetStockObject
ADVAPI32.dll: RegCreateKeyExA, RegQueryValueExA, RegOpenKeyExA, RegCloseKey, RegSetValueExA
ole32.dll: StringFromCLSID
OLEAUT32.dll: -
WSOCK32.dll: -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -, -
DSOUND.dll: -, -, -
WINMM.dll: waveOutWrite, waveOutPrepareHeader, waveOutReset, waveInAddBuffer, waveInPrepareHeader, waveInUnprepareHeader, waveInClose, waveInReset, waveInOpen, waveInStart, mixerGetDevCapsA, mixerOpen, mixerGetNumDevs, waveOutUnprepareHeader, mixerGetLineInfoA, mixerClose, mixerGetControlDetailsA, mixerSetControlDetails, mmioClose, mmioOpenA, mmioRead, mmioDescend, mmioSeek, waveOutClose, waveOutOpen, mixerGetLineControlsA
MSACM32.dll: acmStreamOpen, acmStreamSize, acmStreamUnprepareHeader, acmStreamPrepareHeader, acmStreamConvert, acmStreamClose





Ten komponent można pobrać tutaj http://vaxvoip.com/SDK/VaxSIPUserAgentSDK.zip W paczce są już przykładowe programiki z użyciem komponentu - w katalogu SampleCode.
 
Ostatnia edycja:

grzonu

Były Moderator
Dołączył
Grudzień 26, 2006
Posty
1390
To co ona importuje to jest malo wazne bo pobierac czas mozna na 1000 roznych sposobow np. przez funkcje ZwQuerySystemTime ktora mozna wykonać bez wywolywania jakiejkolwiek funkcji API tylko uzywajac syscalli(czysty assembler i przerwanie systemowe SYSCALL albo INT 2E)

Mowilem zebys mi wyslal cały program to moge go scrackować bo tak na odleglosc to bez sensu. Duzo lepiej jest patchować kod programu niz zakładac hooki. W to się można bawić jak nie ma innej drogi albo jest zbyt czasochłonna.
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Podaje jeszcze raz linka. http://vaxvoip.com/SDK/VaxSIPUserAgentSDK.zip ale to trzeba skrakować tą kontrolkę ocx.
VaxSIPUserAgentSDK.zip\VaxSIPUserAgentSDK\SampleCode\Delphi\SampleCode-1\Delphi\Project1.exe - tu jest przykładowy program już skompilowany i ocx też jest w tym katalogu.

Trial działa na kluczu:'TRIAL-LICENSE-KEY' i jest podawany w kodzie programu przez VaxSIPUserAgentOCX.SetLicenceKey('TRIAL-LICENSE-KEY');

Jako login , haslo i proxy mozna wpisac byle co (najwyzej sie nigdzie nie polaczymy). Jak wciśniemy Online to wtedy komponent sprawdz czy jest trialem czy pelną wersją.

Aha, Założyłęm hooka na callbackRegOpenKeyExA i wyczaiłem żę ta kontrolka zapisuje i odczytuje z HKEY_LOCAL_MACHINE\SOFTWARE\mimi wartośći takie jak 'cursor' i 'screen' przypisany do nich jest o ile sie nie mylę właśnie data pierwszego i ostatniego dnia dzialania wersji trial w formacie utc.
Ale najlepiej było by poprostu zrobić jakiś keygen albo spatchowaćgo tak żęby po podaniu jakiegokolwiek klucza komponent myslal ze to poprawny klucz.

Usunięcie klucza HKEY_LOCAL_MACHINE\SOFTWARE\mimi pozwala 'zresetować' trial i mieć znów 30 dni jego działania ale po dacie 11-03-2009 trial już nie dziala - nawet na czystym systemie. Także konieczna jest zmiana daty na taką sprzed 11-03-2009 (tyczy się to wersji 3.0 tego komponentu, na stronie producenta dostępna jest wer. 3.1).

NO i jak tam grzonu z tym zcrakowaniem tego?
 
Ostatnio edytowane przez moderatora:
Do góry Bottom