Free Information Xchange '98 presents: Pandemonium - CD crack by Static Vengeance Requirements Hex editor and full install Pandemonium is a platform jumping game in simular fashion to the mario jumpers in the nintendo world. It's alright, but what really stands out is the graphics in the 3Dfx version, it looks awesome! However, as you can see from this article, it does have one problem and it comes in the form of a CD check. Using my favorite tool to crack Win95 programs, W32Dasm from URSoft, I'll show you how to defeat that check. There are two versions of the program that come with the CD. The file called pandy.exe is the standard program, while the file pandy3.exe is the 3Dfx enhanced version. It's that version I will be using for the code listings, so if you want to follow along you will need to use pandy3.exe also. I have included the edit for pandy.exe below. Start up W32Dasm and disassemble PANDY3.EXE from where ever it is installed. Once W32Dasm has finished it's process and is ready, go up to the title bar select "Refs" and choose "String data references". From here grab the slider bar and scroll down looking to the string "The Pandemonium CD must be in " You did run the program once without the CD in to see how it asked for it, right? To continue, double click on the string and it puts you in the middle of the CD check routine. So let's take a look at the code and see what it does: * Referenced by a CALL at Address: |:00436015 <-- who made the call | :00427C60 A1FCB14600 mov eax, dword ptr [0046B1FC] :00427C65 85C0 test eax, eax :00427C67 741C je 00427C85 :00427C69 E8324EFEFF call 0040CAA0 * Possible StringData Ref from Data Obj ->"The Pandemonium CD must be in " <-- Don't want to ->"the CD-ROM drive before you can " <-- ever see this ->"play." | :00427C6E 6810CC4600 push 0046CC10 :00427C73 E878000000 call 00427CF0 :00427C78 83C404 add esp, 00000004 :00427C7B 6A00 push 00000000 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00427C39(C) | :00427C7D E89E3D0300 call 0045BA20 :00427C82 83C404 add esp, 00000004 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00427C41(C), :00427C67(C) | :00427C85 C3 ret That's one short and straight forward routine. So let's check the caller, the above routine is called once from 436015. However that section of code is in a routine short enough to list out the entire routine. Listing this code reveals: * Referenced by a CALL at Addresses: |:00407084 , :004070D7 , :004071F3 , :0040727E , :004072CC |:00407319 , :004073A5 , :00407E94 , :00407EEC , :00407F6F |:00408AE4 , :0040F655 , :0040F82B , :0040F8D7 , :00435F31 |:0044154F , :00441567 , :0045151C | :00436010 83EC04 sub esp, 00000004 :00436013 53 push ebx :00436014 56 push esi :00436015 E8461CFFFF call 00427C60 <-- Prints insert the CD stuff :0043601A A164E05900 mov eax, dword ptr [0059E064] :0043601F 85C0 test eax, eax :00436021 741D je 00436040 <-- Force this jump to contiune * Reference To: KERNEL32.Sleep, Ord:023Ah <-- This doesn't look good!!! | <-- We want to skip this part... :00436023 8B35B8B48100 mov esi, dword ptr [0081B4B8] * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0043603E(C) | :00436029 6A64 push 00000064 :0043602B FFD6 call esi :0043602D E8AE000000 call 004360E0 :00436032 E8591CFFFF call 00427C90 :00436037 A164E05900 mov eax, dword ptr [0059E064] :0043603C 85C0 test eax, eax :0043603E 75E9 jne 00436029 * Referenced by a (U)nconditional or (C)onditional Jump at Address: <-- Getting here continues the game |:00436021(C) | :00436040 8B442410 mov eax, dword ptr [esp+10] :00436044 8A4C2418 mov cl, byte ptr [esp+18] :00436048 A35CE05900 mov dword ptr [0059E05C], eax :0043604D 84C9 test cl, cl :0043604F 7424 je 00436075 :00436051 8B742414 mov esi, dword ptr [esp+14] :00436055 56 push esi :00436056 E8150A0000 call 00436A70 :0043605B C70564E0590000000000 mov dword ptr [0059E064], 00000000 :00436065 83C404 add esp, 00000004 :00436068 83F801 cmp eax, 00000001 :0043606B 1BC0 sbb eax, eax :0043606D 23C6 and eax, esi :0043606F 5E pop esi :00436070 5B pop ebx :00436071 83C404 add esp, 00000004 :00436074 C3 ret First off, there are too many calls to this section of code to trace each one and determine which is/are responsible for the CD check directly. So, instead we'll make our edit to this section of code. Alright, what do we need to do to make a runnable version without the CD in the drive? Let's see, first we don't want the call to the "insert CD" routine to be taken so we'll NOP it out. Next you have to force the conditional jump at 00436021 to always be taken. This is done by changing it from je (jump equal) to jmp (unconditional jump). Seems fairly simple with a little help, doesn't it? The actual edits to be made are as follows: Edit PANDY.EXE (standard version) at offset 189,925 ===================================================== Search for: E8 F6 3B 01 00 A1 D4 2B 59 00 85 C0 74 1D Change to : 90 90 90 90 90 -- -- -- -- -- -- -- EB -- Edit PANDY3.EXE (3Dfx version) at offset 218,133 ===================================================== Search for: E8 46 1C FF FF A1 64 E0 59 00 85 C0 74 1D Change to : 90 90 90 90 90 -- -- -- -- -- -- -- EB -- It goes without saying that you loose the CD music, Logos and intros AVI's and when you finish the game you don't see the finishing AVI (outros.avi). However when the CD is present the program will make use of it. Not too hard to FiX Pandemonium was it? Static Vengeance Cheat code for 14 ankhs, 8 hearts, any level and special weapon: ------------------------ AOIMFPIJ Fire AOEMDPIJ Ice AOMMHPIJ Shrinker