Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2021-09-28, 22:51
  #13
Medlem
Jag lyckas inte hitta textsträngen i x32dbg heller. mongomannen, ligger texten som en sträng referens? Skulle vara roligt att vet hur du hittade även om ni redan löst mitt problem.
Citera
2021-09-29, 02:43
  #14
Medlem
Citat:
Ursprungligen postat av mongomannen
Det är ingen kryptering. TS söker i fel fil eller har missat att det är en unicode-sträng.

Kod:
        00407b30 ff d5             CALL    EBP=>KERNEL32.DLL::GetTickCount00407b32 2b c3             SUB     EAX,EBX
        00407b34 3d 40 77 1b 00    CMP     EAX,0x1b7740  eb


Hmm, man kan rentav ta bort raden med anropet till GetTickCount helt och hållet, och ersätta det med NOP, eller en ovillkorlig JMP , dvs fortsättningen av den normala programkoden.
Eller lägga in sådana värden i EAX,EBX att de alltid kommer att godkännas i testet.
Finns många metoder att göra detta på.
Lycka till !!
Citera
2021-09-29, 09:27
  #15
Medlem
Telepatisks avatar
Citat:
Ursprungligen postat av kanalapa
Jag lyckas inte hitta textsträngen i x32dbg heller. mongomannen, ligger texten som en sträng referens? Skulle vara roligt att vet hur du hittade även om ni redan löst mitt problem.
Den kan ligga i regedit (eller är det helt orimligt?) eller i någon annan fil ja.

För egen del så kollade jag igenom vilka system calls som används i programmet (t.ex. Sleep). Tänkte att Sleep antagligen används till "problemet" på ett eller annat sätt så jag kollade igenom alla ställen där Sleep används (typ 20 st) och såg den "uppenbara" loopen (som mongomannen länkade). Men jag satt i Ghidra där man kan se en motsvarande C-kod istället för x86 vilket är lättare. Nu kan jag förvisso x86 men det är ofta svårt att se helheten där.

Sen så ändrade jag tiden för att testa istället för att göra det till en evighetsloop.
Citera
2021-09-29, 12:13
  #16
Medlem
Citat:
Ursprungligen postat av kanalapa
Jag lyckas inte hitta textsträngen i x32dbg heller. mongomannen, ligger texten som en sträng referens? Skulle vara roligt att vet hur du hittade även om ni redan löst mitt problem.
Det är en strängresurs i plc416dm. Men hur som helst är det ett villospår att söka efter text i en MFC-app. Det tar garanterat längre tid att spåra användningen bakåt än att söka efter tidshanteringen direkt.
Citera
2021-09-29, 14:21
  #17
Medlem
Citat:
Ursprungligen postat av Telepatisk
Den kan ligga i regedit (eller är det helt orimligt?) eller i någon annan fil ja.

För egen del så kollade jag igenom vilka system calls som används i programmet (t.ex. Sleep). Tänkte att Sleep antagligen används till "problemet" på ett eller annat sätt så jag kollade igenom alla ställen där Sleep används (typ 20 st) och såg den "uppenbara" loopen (som mongomannen länkade). Men jag satt i Ghidra där man kan se en motsvarande C-kod istället för x86 vilket är lättare. Nu kan jag förvisso x86 men det är ofta svårt att se helheten där.

Sen så ändrade jag tiden för att testa istället för att göra det till en evighetsloop.


Sleep är vanligt i program som kommunicerar med hårdvara, och där man vet att hårdvaran tar viss tid på sig innan den har utfört det kommando man har begärt att den ska göra.Tex på printrar så lade man vanligen in en Sleep eller delay, mellan typ varje sida, eller om man visste hur stor skrivarens buffert var.

Citat:
Ursprungligen postat av mongomannen
Det är en strängresurs i plc416dm. Men hur som helst är det ett villospår att söka efter text i en MFC-app. Det tar garanterat längre tid att spåra användningen bakåt än att söka efter tidshanteringen direkt.


Ja, MFC lade in strängarna som resources istället för att lägga in dem direkt i koden. Ursprungliga anledningen var nog tänkt att det skulle göra det lättare att byta språk i programmet, tex till tyska eller franska. Man behövde bara köra resource-kompileringen då.

En intressant egenskap hos de tidiga Visual C++ var att de genererade C-kod från C++, innan det slutliga kompileringssteget och den kunde man titta igenom. Ganska grötig men ändå intressant, massvis av MACROs fanns i detta. Cynikerna kallade det för degenererad C/CPP-kod
__________________
Senast redigerad av DrSvenne 2021-09-29 kl. 14:40.
Citera
2021-10-01, 02:04
  #18
Medlem
OBS, En viktig observation är att funktionen GetTickCount returnerar i de flesta fall ett 32 bit värde, inte ett 64 bits värde.

Eftersom ett dygn svarar mot 86400 sekunder och därmed 86 400 000 ticks (ms) så efter 49,7 dygn så slår GetTickCount runt från noll, 0, igen. Det kallas för overflow. Eftersom maxvärdet 32 bit är 4,294,967,295 så svarar det mot 49,7 dygn i kontuerlig drift.

Buggen finns lite varstans och rapporterades bland annat för Windows 95, där datorn kunde frysa efter 49,7 dygn, efter ständig drift.

En del system, även hårdvarusystem har sådana felaktigheter, att de inte varnar för att en overflow har inträffat.

Men bör alltså vara uppmärksam vilka system där denna buggen kan undvikas.
Men det är brukligt att GetTickCount brukas så i ditt loopexempel..

Lycka till !
Citera
2021-10-03, 00:54
  #19
Medlem
Kom ihåg att funktionerna Sleep(DWORD dwMilliseconds) och SleepEx(DWORD dwMilliseconds)
är funktioner som överlämnar kontrollen til taskschedulern i Windows enkelt uttryckt.

https://docs.microsoft.com/en-us/win...synchapi-sleep

Windows får därmed överta den timeslice din applikation/program/tråd/process i schedulern, och göra vad den vill med den.
I regel så kollar då Windows sin WM_MESSAGE-kö och betar av den.
Ett värde på noll (0) på dwMilliseconds innebär att programmet tillfälligt släpper kontrollen kortaste möjliga timeslice.
Men storleken på den kan variera från körning till körning beroende på aktuell CPU-load, beroende på hur många processer som körs, mm. .

Funktionen delay() har nästan samma funktion men är inte del av Windows funktionsutbud.
Som sagt så används Sleep() och SleepEx() ofta i samband med att ditt program kommunicerar mot intern eller extern hårdvara, och att man vet att hårdvaran tar en viss tid på sig att utföra kommandot.
Det finns/fanns också i exempelkod för tex Lab-kort, för att undvika för tät pollning av att läsa något realtidsvärde, som ändå inte ändras på kanske x millisekunder. Detta brukar finnas nämnt i manualer för sådana kort

Man undviker med Sleep() därmed att ditt program i onödan käkar upp CPU-cykler som det inte behöver.
Och sänker programmets begov av CPU-cykler, och sänker CPU-loaden.

Sleep och SleepEx används ofta också för att underlätta synkning mellan tex trådar eller processer.
__________________
Senast redigerad av DrSvenne 2021-10-03 kl. 01:03.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback