Autor Beitrag
Alice
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Do 06.09.07 20:28 
hi,

vorneweg: es handelt sich hierbei um ein schönheits problem... ;-)

ich habe hier eine älter dll, die irgendwie schon immer benutzt wird,
keiner weis woher und es gibt auch keine quellen dazu...
ist soweit auch kein problem, denn sie läuft ohne probleme 24/7.

nur, diese dll kommt mit einem datum von >2000 nicht klar, warum auch
immer. also wenn ich sie init. und das datum aktuell (2007) ist, gibts einen
fehler.

workaround:
kurz bevor ich die dll lade, setzte ich das jahr auf 1999, dann nachdem sie geladen ist
zurück auf das aktuellen, wie gesagt nur das jahr, alles andere bleibt unberührt.

hat auch seit jahren .... :-) geklappt, aber ganz wohl bei der sache ist mir nicht.
denn wenn man sich beim laden des prog. das systemdatum ansieht dann, klar, sieht man es
für einen kurzen moment, also zurück dann wider vor aufs aktuelle.

naja ist bisher keinem aufgefallen, übler nachgeschmack bleibt.

ich habe das hier entdeckt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function SetDateto1999:Boolean;
var
 SetTM, GetTM: TSystemTime;
begin

 GetLocalTime(GetTM);

 OrigM := GetTM.wMonth;
 OrigD := GetTM.wDay;
 OrigY := GetTM.wYear;

 SetTM.wYear         := 1999;
 SetTM.wMonth        := 9;
 SetTM.wDay          := 1;
 SetTM.wHour         := GetTM.wHour;
 SetTM.wMinute       := GetTM.wMinute;
 SetTM.wSecond       := GetTM.wSecond;
 SetTM.wMilliSeconds := GetTm.wMilliseconds;

 Result :=  SetLocalTime(SetTM);
 PostMessage(HWND_BROADCAST, WM_TIMECHANGE, 00); // brauche ich eigntl. nicht mehr...

end;


so ähnl. sieht es auch im prg. aus, nur ohne das postmessage am schluss, da xp das automatisch !? ausführt.

nun zur frage:
geht es das ich quasi programm *intern das datum für einen moment zurücksetzte *ohne das das BS etwas davon
mitbekommt, aber die dll das schluck.

also dieses HWND_BROADCAST WM_TIMECHANGE unterdrücke? zumindest für einem moment?

cu

alice
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 06.09.07 20:42 
Wenn du die Message sendest, informierst du explizit alle Programme über die Änderung. Lass das einfach weg, dann bekommt auch kein Programm explizit die Meldung. Unberührt davon bleibt die Tatsache, dass das Betriebssystem natürlich das geänderte Datum anzeigt und auch eine Abfrage während das Datum geändert ist, diese geänderte Zeit liefert.

Unter Vista wird das so aber nicht mehr funktionieren, da dem Programm die erforderlichen Rechte fehlen. Und da du die vorher nicht holst (was dann einen UAC-Dialog zur Bestätigung bewirkt) wird das Programm da vermutlich Probleme bekommen. Ich habe das allerdings nicht ausprobiert, WEISS also nicht, was dann unter Vista passiert.
Alice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Do 06.09.07 20:50 
user profile iconjaenicke hat folgendes geschrieben:
Unberührt davon bleibt die Tatsache, dass das Betriebssystem natürlich das geänderte Datum anzeigt und auch eine Abfrage während das Datum geändert ist, diese geänderte Zeit liefert.


genau das würde ich gern verhindern, also quasi in einer art sandbox...

möglich!?

cu

alice
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 06.09.07 21:23 
Man könnte einen Hook auf die entsprechende Systemfunktion setzen und dann das gewünschte Ergebnis zurückliefern. Allerdings ist die Frage, wann genau der Fehler auftritt, d.h. ob tatsächlich bereits beim Laden selbst diese Umleitung funktionieren müsste.

Zudem kenne ich mich in der Materie nicht soo gut aus, d.h. ich weiß nicht, ob und wie man das bereits bei Code ändern kann, der direkt beim Laden der DLL ausgeführt wird. Aber da gibts ja einige hier, die da bestimmt mehr dazu sagen können...
Alice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Fr 07.09.07 17:18 
user profile iconjaenicke hat folgendes geschrieben:

Man könnte einen Hook auf die entsprechende Systemfunktion setzen und dann das gewünschte Ergebnis zurückliefern. Allerdings ist die Frage, wann genau der Fehler auftritt, d.h. ob tatsächlich bereits beim Laden selbst diese Umleitung funktionieren müsste.

Zudem kenne ich mich in der Materie nicht soo gut aus, d.h. ich weiß nicht, ob und wie man das bereits bei Code ändern kann, der direkt beim Laden der DLL ausgeführt wird. Aber da gibts ja einige hier, die da bestimmt mehr dazu sagen können...


hi,

ja beim init der dll muss das datum zurückgesetzt werden, danach geht's mit dem aktuellen weiter...
das mit dem Hook hört sich schon mal gut an!?
leider komme ich da nicht weiter..., aber vielleicht ja jemand anders? .-)

cu

alice
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 07.09.07 21:15 
uallCollection, IAT-Hook auf die Funktion zum Abfragen des Datums. Schau dazu einfach mal, was in der Import-Tabelle der DLL steht.

Alternativ dazu kannst Du auch nen Code-Hook auf den Funktionsanfang der den ausgeführten Code überschreibt.

In beiden Fällen ist wichtig, dass Du die zum Abfragen des Datums genutzte API-Funktion herausbekommst. Schau dazu einfach in die Import-Tabelle der besagten DLL.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Alice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Mo 10.09.07 14:59 
user profile iconBenBE hat folgendes geschrieben:
uallCollection, IAT-Hook auf die Funktion zum Abfragen des Datums. Schau dazu einfach mal, was in der Import-Tabelle der DLL steht.

Alternativ dazu kannst Du auch nen Code-Hook auf den Funktionsanfang der den ausgeführten Code überschreibt.

In beiden Fällen ist wichtig, dass Du die zum Abfragen des Datums genutzte API-Funktion herausbekommst. Schau dazu einfach in die Import-Tabelle der besagten DLL.


hi,

ich habe nach den stichwörtern uallCollection / IAT-Hook im netz gesucht, jedoch was ich gefunden habe übersteigt meine
kenntnisse um 1-2 schubladen... denke ich. :-(

und bin weiter auf der suche... nach einer lösung, die wahrscheinlich nicht aus meiner feder stammen wird.

cu

alice
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mo 10.09.07 20:06 
Ich finde dafür einen Hook irgendwie zu aufwändig um einmal das Datum zu ändern. Viel mehr würd ich die dll direkt patchen und den Bug beheben. Für jemanden mit Erfahrung (und wenn du die Nötigen Infos gibts) ist das eine Arbeit von 10 Minuten.

Den call von GetSystemtime einfach noppen und ggf Stack verändern mit einem gültigen Datum bei einer Lokalen Adresse, oder die Data Section mit einem gültigen Datum patchen bei einer globalen Adresse.

Oder eben alternativ, die Stelle fixen bei der es crashed wegen was auch immer.

Nun kannst du folgendes machen um zu helfen:
a) ein Miniprogramm schreiben bei dem du die dll lädst und wo der Fehler auftritt bzw. nicht autfritt wenn das Datum geändert wird und dieses hier anhängen (sofern erlaubt)
b) Disassembly von dem Code rund um den aufruf von GetSystemTime geben
c) Ollydbg installieren, als JIT Debugger anmelden und die dll crashen lassen -> bei der Windows Meldung dann auf debuggen klicken, danach wird das Programm in Ollydbg geladen. Der EIP is dabei die Fehlerstelle. Davon mal einen Teil zur Analyse rauskopieren.

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
Alice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 120



BeitragVerfasst: Di 11.09.07 13:08 
user profile iconuall@ogc hat folgendes geschrieben:
Ich finde dafür einen Hook irgendwie zu aufwändig um einmal das Datum zu ändern. Viel mehr würd ich die dll direkt patchen und den Bug beheben. Für jemanden mit Erfahrung (und wenn du die Nötigen Infos gibts) ist das eine Arbeit von 10 Minuten.


hi,

daran hatte ich auch schon gedacht, jedoch will ich die besagte dll nicht patchen da das kein
testprog. o.ä. ist.
im falle eines falles ist man dann immer der dumme.

von daher wäre mir so ein *hooking dieses system-calls *viel lieber :?

cu

alice
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 11.09.07 19:02 
uall.cheat-project.com/uallCollection

da gibts auch Beispiele zum Abfangen eine Funktion

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit