Windows program detects debugger and quits
Zsolt Rizsanyi
rizsanyi at myrealbox.com
Fri Oct 25 16:05:35 CDT 2002
On Friday 25 October 2002 19:31, Peter Andersson wrote:
> Hiya!
> Maybe this program checks the debugging processor registers
> somehow?
>
> Wine Gurus out there: Could this be the explanation?
>
> The ptrace syscall which Wine uses,setup the process in debug mode
> (thus using the debug registers). Probably some kind of copy
> protection in the ACR program checks the debug registers somehow.
>
> I believe wine is heavily dependent of the ptrace call (correct me if Im
> wrong, Wine gurus), for example for catching DOS interupts.
> Unless there is a way to turn off ptrace calls in Wine, or you hack your
> app to not do these checks, you wont be able to run your program.
You could try set winver to nt40.
Programs usually use different methods to detect if they are debugged when
they detect that they run on NT.
Eg. the programs guarded with safedisc also checked for debug registers, but
when you set winver to nt40 much less checks are done.
> On Thursday 24 October 2002 01.49, Paul wrote:
> > I am trying to run a windows program called ACR with Wine on a Mandrake
> > system. The install goes beautifully (thanks to all of those hardworking
> > programmers!). But when I try to run ACR it complains that Windows is
> > being run in Debug mode and quits.
Maybe your program is guarded with safedisc, or some similar guard mechanism.
If it is safedisc, then by patching wine you could enable it to run your
program.
You can check if it is safedisc protected by following the FAQ sent by Laurent
Pinchart to the wine-devel list. You should search the archives.
Hmm. I tried to search the archives, and it seems, that it is not searchable.
So I'm attaching the faq. Though maybe there is an updated version somewhere.
> > This is also what happened when trying to run ACR on Win4Lin. Does this
> > make running ACR hopeless on any emmulator or is there a way around this?
No. Longman Dictionary of Contemporary English did not run under VMWare. But
now it works under wine + safedisc patch.
So surely there IS hope :).
Regards
Zsolt
-------------- next part --------------
SafeDisc FAQs
What is SafeDisc ?
==================
SafeDisc is a CD copy protection system designed for Microsoft Windows. It is
widely used, especially to protect games. There are currently 2 main versions
of SafeDisc around: SafeDisc 1 and SafeDisc 2.
Is my program protected by SafeDisc ?
=====================================
Look at the root directory of the program CD. The following files are present
on SafeDisc 1 protected programs:
secdrv.sys
drvmgt.dll
clcd16.dll
clcd32.dll
clokspl.exe
dplayerx.dll (not present on the very first version of SafeDisc)
In addition to these files, a .icd file contains the encrypted binary, while
the main executable (usually game.exe) is only a wrapper used to load and
decrypt the .icd file.
For SafeDisc 2, only secdrv.sys and drvmgt.dll can be found on the CD. The
encrypted binary and dplayerx.dll are now stored inside the wrapper (usually
game.exe).
How do I run SafeDisc protected programs with Wine ?
====================================================
If your version of SafeDisc is supported (see below), your program will run
out-of-the-box (at least for SafeDisc related code :-) if you use NT mode
(--winver nt40, --winver win2k or --winver winxp). Pick the version of NT that
your program is the most likely to support (winxp with a 5 years old program
isn't a good idea).
How do I find out which version of SafeDisc my program uses ?
=============================================================
There is no publicaly available version numbering for SafeDisc. However, it
seems that the version number is stored in the executable as 3 unsigned 32-bit
integers. Using an hexadecimal editor, locate the following byte pattern in
the wrapper (game.exe)
> 426f475f 202a3930 2e302621 21202059 BoG_ *90.0&!! Y
> 793e0000 y>..
There should be 3 unsigned integers right after that, which are respectively
the version, subversion an revision number.
On some versions of SafeDisc there are 3 null integers following the pattern,
before the version number. You'll then have to look at the 3 unsigned 32-bit
integers right after
> 426f475f 202a3930 2e302621 21202059 BoG_ *90.0&!! Y
> 793e0000 00000000 00000000 00000000 y>..............
Don't forget to convert the version number from hexadecimal to decimal.
For SafeDisc 1 you can alternatively check the size of the dplayerx.dll file.
dplayerx.dll size SafeDisc version number
-------------------------------------------------------
165.888 bytes 1.35.0
Another very important information is the secdrv.sys version number.
secdrv.sys size secdrv.sys version number
---------------------------------------------------------
14.368 bytes 1.3.0 (SafeDisc 1.35.0)
18.768 bytes 2.2.0 (SafeDisc 2.5.30)
(If you have another version of SafeDisc please contribute to these tables).
Which version of SafeDisc are currently supported ?
===================================================
This hasn't been determined yet. SafeDisc support for Wine has been developped
using a game protected with SafeDisc 1.35.0. SafeDisc versions which use
secdrv.sys 1.3.0 or lower might work. Some other versions might work too.
SafeDisc 2 is not supported yet.
How does SafeDisc 1 work ?
==========================
SafeDisc encrypts the real executable into a .icd file, and uses a wrapper to
decrypt the executable.
The wrapper contains 3 code sections: `.text', `.txt' and `.txt2'. `.txt' is
encrypted.
The wrapper starts by decrypting itself, using the checksum of `.text', the
binary content of `.txt2' and some values which depend on debugger detection
tests. If a debugger is loaded, if a software breakpoint is set in the first 8
bytes of any of the kernel32.dll functions, or if the `.text' and `.txt2'
sections have been modified (this includes setting a software breakpoint in
the code), the `.txt' section won't be decrypted correctly and a crash will
occur.
On NT, the process of detecting a debugger involves loading the kernel-space
driver secdrv.sys, which I implemented as a user-space code for Wine. On
Windows 95, 98 or Me, it involves executing arbitrary code in ring 0 mode
(kernel mode). This is not supported by Wine (as the underlying OS isn't as
broken as win9x), so that's why you have to use NT mode.
When the `.txt' section has been decrypted, the wrapper will then check for
the CD key using direct SCSI operations on the CD driver. If the CD key
doesn't match the expected value, a message box pops up to ask you to insert
the original CD in the drive.
The wrapper then loads and starts clokspl.exe for a still unknown purpose.
The last stage consists in creating the game.icd in a suspended state. The
suspended process memory is then written with some initialization code, and
SetThreadContext is called to jump to that code. The initialization code will
load dplayerx.dll (which is encrypted in the same way as the wrapper, with 3
code sections), and will decrypt the main executable. Control is then
transfered to the main executable, and the game starts.
Have you ever tried to rename game.icd to game.exe, and run it ? It will
crash, because WinMain is encrypted. It needs to be decrypted by the
initialization code, which is found in the wrapper and in dplayerx.dll.
That's pretty much all I know about SafeDisc. Don't ask me how to remove
SafeDisc from a game. I don't know how to do so.
If you have more information, especially about debugger detection and
secdrv.sys, please let me know.
My version of SafeDisc is not supported. What should I do ?
===========================================================
Implement support for it :-)
For unsupported SafeDisc 1 versions you will probably 'only' need to implement
the secdrv.sys that comes with your program. For SafeDisc 2 things could be
more difficult as I haven't tried any SafeDisc 2 protected program yet.
More information about the wine-users
mailing list