Ok, load your protected target in order to disassemble the progress and watch how
softSENTRY does work. For disassemble we will use SoftICE, because Wdasm89 seem to
crash when we try to load this target. The Protected file, and the original file
have a different size. Good, you'll probably expect, as I did, some encryption and
variable random protection scheme inside the target. You're in for a surprise.
Now hold your breath: this is the entry point for ALL PROTECTED FILES:
:004B066F CC int 3
:004B0670 55 push ebp ; <----- We start here
:004B0671 8BEC mov ebp,esp
:004B0673 83EC48 sub esp,00000048
:004B0676 53 push ebx
:004B0677 56 push esi
:004B0678 57 push edi
:004B0679 E950000000 jmp 004B06CE
:004B067E 0000 add [eax],al
:004B0680 7006 jo 004B0688
Look! All protected files, have the same pattern, whit the same JUMP (coded as E950000000)!
This is very useful, for us; it means that searching any 'protected' file for this pattern:
55 8B EC 83 EC 48 53 56 57 E9 50 00 00 00
Will give us, the entry-point of the program, and tell us if the program has been
'protected' with SoftSentry2 Scheme! I told you you would have opened your mouths in
awe. Incredible, and very very silly. The stupid JUMP 4b6ce (very insolit),
points the EIP to the real protection routine (you can easy realize it tracing over
the code).
This routine jumps different for each type of 'protection scheme' that the programmer have
selected to use: Time limit, splash...etc. If the Protection fails, you will land AT
00093C9B:
00093C82: 8B4508 mov eax,[ebp][00008] ; Load right value to pass to the call..
00093C85: 50 push eax ; ..push it!..
00093C86: 68A0324B00 push 004B32A0 ; idem
00093C8B: FF156C744B00 call [0004B746C] ; This is a Call [User32!UnregisterClass]
00093C91: E88A000000 call 001279B1 ; *** LOAD THE RESOURCE OF THE
MAIN PROGRAM!
00093C96: E825000000 call 00127956 ; *** This CALL, Run THE MAIN
PROGRAM!
00093C9B: 8B45B8 mov eax,[ebp][0FFB8] ; *** HERE YOU LAND! If the check
routine fails!
; Load handle of the main?
00093C9E: 50 push eax ; prepare for the call
00093C9F: FF15E4734B00 call [0004B73E4] ; This is CALL [Kernel32!ExitProcess]
; and the program terminate
This 2 Calls at 93C91, 93C96 are the FULL programs completely free from any NAG, Splash,
time-limit, whatever 'ptotection' had been chosen (I know, because I have execute it!);
and if you compare this source with any other program protected, you'll see that both
calls are ALWAYS coded as
E8 8A 00 00 00 E8 25 00 00 00
^^^^^ ^^^^^
1st CALL 2nd Call
(use a hex editor to search)
Very nice!.. so the protection scheme work as:
:MAINPROGRAM-PROTECTED
Jmp SoftSentriProtection (Always E950000000)
:End MAINPROGRAM-PROTECTED
:SoftSentriProtection
// Put Here your nag-splash-timelimit code //
// made whit the SoftSentr2.007 //
IF (TrialPeriod==OK) Then
CALL LoadResouce_FullProgram (Always E88A000000)
CALL Run_Fullprogram (Always E825000000)
Else
Kernel21!CallExitprocess
:End SoftSentriProtection
OK? Now we can write a GeneralCrack for this incredibly silly Commercial Protection Scheme,
simply changing the first jump (coded as E950000000) with the right code of the 2 CALL
(which, as you remember, was always E88A000000 E825000000). OK?
1) Search for 55 8B EC 83 EC 48 53 56 57 E9 50 00 00 00
^^^^^^^^^^^^^^ THE JUMP!
2) Replace With E8A2040000 E83D040000 (*)
1St Call 2nd Call
(*) Note the code of the 2 call has been recalculated for the new position
(always the same! Just track it whitin your debugger!)
Ok, we have killed another Commercial 'Protection' Scheme.
Hope you'll understand the whole point: Never never never use 'commercial' ready-made
protections! Commercial oriented programmers are the most useless and stupid programmer
breed, they will NEVER be able to offer you any real protection whatsoever... for
godzilla's sake create your own protections, it's not so difficult after all, and you
will at the very least know what you're doing.
|