home *** CD-ROM | disk | FTP | other *** search
- Cardenal Mendoza'z tutor #1:
-
- HOW TO CRACK MICRO$OFT COMBAT $IMULATOR 98
- (a very easy cd check)
- -------------------------------------------
-
- Hi there this is my first tutorial, so don't expect too
- much. I hope you'll enjoy it anyway ;-)
- Please excuse my bad english, it's not my mother language...
-
- Part 1: The beginning...
- ------------------------
-
- In this tutorial I expect that you know how to use W32dasm
- and how to modify the exe with your hex editor.
- Install the game and choose full install. Then Try to start
- it without the cd. It won't work. A Dialog pop's up and asks
- you to put in the cd. No problem - start W32dasm and disassemble
- COMBATFS.EXE. Ok, now you should see the deadlisting of the code.
-
- Part 2: The cd-check...
- -----------------------
-
- Click on String Data References and search for your error message.
- Have you found it? Ok? Just click on it. You should now see the
- following part of the code:
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Address:
- |:00401D4E(C)
- |
- :00401D9E 8B15E8C84100 mov edx, dword ptr [0041C8E8]
-
- * Reference To: USER32.LoadStringA, Ord:0183h
- |
- :00401DA4 8B35E81A4200 mov esi, dword ptr [00421AE8]
- :00401DAA 6804010000 push 00000104
- :00401DAF 68C0084200 push 004208C0
-
- * Possible Reference to String Resource ID=01500: "Bitte legen Sie die Microsoft« Combat Flight Simulator-CD ei"
- |
- :00401DB4 68DC050000 push 000005DC
- :00401DB9 52 push edx
- :00401DBA FFD6 call esi
- :00401DBC 8B0DE8C84100 mov ecx, dword ptr [0041C8E8]
- :00401DC2 8D8424A4000000 lea eax, dword ptr [esp+000000A4]
- :00401DC9 6804010000 push 00000104
- :00401DCE 50 push eax
-
- Now doubleclick a second time on the string. It scrolls to a second
- location. Have a look at it. Hmm, this seems to be curios. Nothing
- interesting but the reference and a jmp. Look at the jump. Here is nothing
- interesting, too. That's why they call it possible reference. Not every
- time it is a reference. In this case it is not our string. But how to know that?
- Look back at the first location. Do you see the recerence to USER32.LoadStringA ??
- I think I don't have to explain what this is. Most of the times real references are
- followed by a messageboxa, a showwindow or just any function which does something
- with our string, like lstrcpy or loadstringa. So let's go further.
- Click on our string to see if there is a "real" second location - no, we're
- back at our first place. Ok, now we should observe the whole function. First
- it does something in our registry. Do you see the string "InstalledFrom"?
- This should be our cd drive. Then there are the two strings of the error
- message ( the text and the caption of the dialog ). Then there follows a bunch of
- assembler code. Just ignore it for the moment. At the end there is a call to
- USER32.MessageBoxIndirectA. This is a unusual function and I see it here for the
- first time, but maybe I simply don't crack long enough :-(
- After the call there are two cmp's with a je after each. Now think what this could
- be... yes, it is the code which checks which button was pressed. The first cmp check's the
- cancel button. If you would change the je to jmp, it would close the game if no
- cd is inserted. The second jumps back, to see if the cd is now in the drive.
- After this two jumps you should see this:
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
- |:00401E23(C), :00401E2D(C), :00401E48(C)
- |
- :00401E62 8B0DE8C84100 mov ecx, dword ptr [0041C8E8]
- :00401E68 51 push ecx
- :00401E69 E8F2F2FFFF call 00401160
- :00401E6E 85C0 test eax, eax
- :00401E70 750B jne 00401E7D
- :00401E72 5F pop edi
- :00401E73 5E pop esi
- :00401E74 5D pop ebp
- :00401E75 5B pop ebx
- :00401E76 81C498010000 add esp, 00000198
- :00401E7C C3 ret
-
- This seems to be the exit of the function for good guys, who have their cd
- in their drive. But we're bad, are we ;-) ...
-
- Part 3: The crack...
- --------------------
-
- OK, if you look at the code above, the easiest thing would be to nop out
- the last two je, then the game would simply run to the good guy exit. But wait.
- First you should thing. You nop out the *check* of the buttons, therefore the
- errorwindow would popup, each time you would start the game. Of course it would
- run after you pressed something, but isn't there a better way. You could try to nop
- out the call to the USER32.MessageBoxIndirectA, too, but if there is one bad thing
- you could do, it is nopping out calls to a dll. You could try it, but then it will...
- Just try it, you will see.
- So look at the last part of the code. There are three different jumps to it. So the
- easiest working thing is, going to the first jump and change it to jump everytime.
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Address:
- |:00401E60(C)
- |
- :00401E13 8A0DC0FF4100 mov cl, byte ptr [0041FFC0]
- :00401E19 51 push ecx
- :00401E1A E801FDFFFF call 00401B20
- :00401E1F 8BF0 mov esi, eax
- :00401E21 3BF5 cmp esi, ebp
- :00401E23 753D jne 00401E62 <---- here it is...
- :00401E25 B341 mov bl, 41
- :00401E27 885C241C mov byte ptr [esp+1C], bl
-
- Just change the 0x75 at the offset 0x00401E23 into a 0xEB. This will change it
- to jmp 00401E62. Try it...
- *KEWL* - It works. Isn't that a lame cd check?! I have expected something better
- from Micro$oft.
-
- Part 4: The finish...
- ---------------------
-
- I hope you had enjoyed this tutorial. Remember, it was my first - nothing is
- perfect at once :-)
-
- If you have suggestions for a second tutor, send me a mail to: Cardenal@gmx.net
- I hope to see you in tutor #2...
-
- OH, yes. Cracking a program you don't own yourself is illegal, so don't do this :-(
-
-
- Greetinx to:
- warp_9 & darkman & antos & homer
-
-
- Cardenal Mendoza
- 11/12/1998