ESTUDIO COLECTIVO DE DESPROTECCIONES | ||
![]() |
WKT Tutorialz Site | ![]() |
![]() |
![]() |
![]() |
Program | English-Spanish Interpreter 2000 | W95 / W98 / NT |
Description | Translation & Reading of documents | |
Type | Fully working demo. Limited number of uses (4) | |
Url | http://ssl.pair.com/magicw | |
Protection | Serial / Malfunctioning after 4 uses | |
Difficulty | 1) Beginner, 2) Amateur, 3) Advanced, 4) Professional, 5) Specialist | |
Tools | SoftIce v3.25 & TechFacts95 | |
Objetive | Unlimited fully working uses | |
Cracker | MrCrimson/[WkT!99] | |
Date | August 25 1999 |
Introduction |
The very first time we run this software
a futuristic splash appears. Once it vanishes a fully working program is
offered to us :o)
The second time it happens exactly the same The third one we are also shown an ugly NAG which remind us about the limitations of DEMO version. It invite us to choose between entering a valid registration code or keep using the program in DEMO mode (there are two more uses left). Once we finished the number of allowed uses, the soft provides the following menace: Hey, where did you learn about that marketing tips...? Don't you know the product must never be degraded...? Protection is not an excuse to deliberately produce malfunctioning code....:o( Ok, let's see how this curse works. During the first 4 authorized sessions I asked for the translation of the following phrase: Which was translated correctly as follows: When I asked again the same question in 'expired' mode that asshole answered: (Case you do not understand spanish, I tell you that's not right at
all)
|
A first try: Serial number and the hidden algorithm |
The first try, as usual, aimed to uncover the algorithm responsible
for serial validationl and then reverse it to produce a nice keymaker.
Unfortunately, the algo seemed to be a genuine example of so-called
spaghetti code. During the calculations a pretty large number of non-binary
flags were created to be checked later along the whole program session.
Anyway it's well known that MrCrimson must attend daily many love dates
so there is no time to lose: Let's crack!
|
A second try: TechFact95 |
A classical question: How the hell does the proggie know that free
uses are expired...?
That info must have been stored someway in:
I really recommend it to you. I think there is only one thing which is worse thant having NO INFO and that is having TOO MUCH. That is what happen most times when using 'regmon' for example. Monitoring ALL ocurrencies in registry can be pretty useless if they are hundreds... TechFact, among other features, provides you a concise report on changes occured in the system (INI files, disk files, registry) when an particular application were executed. When applied to this case I got NOTHING :o( Well, what did you expect? Once the DEMO has expired there is no use in checking anything.... so the mechanism responsible of counting uses is probably disabled. At this point what we should do is going back to the beginning and
re-installing the software.
1st Run:
wait a second...there is something more....one of the new keys is named: HKEY_LOCAL_MACHINE\Config\0001\Other Flags This value ("Other Flags") contains more than 2000 bytes and what makes it suspicious (besides that name) is its location. It is not placed together with the rest of configuraton values for the application. It was placed in an area which could be thought as configuration values for Windows. It would be quite difficult to relate it to ESI....(call it ZEN if you like it)
|
First success |
If I am right we could 'RESET' the counter of uses by entering
in the registry the original values for 'Other flags', I mean the data
after the first run (when they were created).
Voilà. When done, I started the program to see how it worked
as the fucking first time...
When asked the proggie about the current status it says there are 4
more uses left...:o)
|
Hands on! |
Gonna have some action...!
LONG RegQueryValueEx(
There are many calls to this function but after tracing a while it makes clear that interesting ones happens in: * Reference To: advapi32.RegQueryValueExA,
Ord:0000h
In order to filter for our particular query to 'Other flags' we do: Bpx 0045210A IF *(*(ESP+4))==6568744F Here, the second parameter, pushed to the stack, should points to "Other
Flags"
:00488D8F E8B09EF7FF call 00402C44 to :00488D8F 9090909090 nop nop nop nop nop Now, restoring the registry key to its original value and running the
code patched as indicated, we will be at our first try FOREVER... :o)
|
Putting all together |
Things go fine but we still have to take into the crack that 2Kb of
data and that's not too elegant, I think.
When running the proggie, the key was newly created (meaning 'starting
4 uses demo period')
|
Deleting registry values |
Registry scripts (*.reg) can easily handled to add entries but it cannot
delete them.
We are also interested in join the whole prot-remover in a single file. How can we manage to erase the key...? Easy, another API function. Its name says it all LONG RegDeleteKey(
The following snippet solves that point: .const
.data?
;Abre
;Borra
Beautiful isn't it?
|
Last breath |
During the test period, a friend of mine realized that after each 100
sentences translated a windows popped up with an annoying message about
demo version. Relax. It did not hang the program.... just asked for confirmation.
After click OK all kept on working fine
:0063BE96 FF058C7F6400
inc dword ptr [00647F8C]
:0063BE96 FF058C7F6400 inc dword ptr [00647F8C] Changes to: :0063BE96 909090909090 nop nop nop nop nop nop An that's all you need.
|
Finale |
This kind of massive checking protections is 100% pure shit: It Makes codes slower
Hope this doc will be helpful and add some new trick to your skills.
Up The Hammer!
|