 
View Full Version : some reversing questions
radaremt
November 2nd, 2000, 12:01
Hi all,
ok i am working on trying to crack Abacus Pub's Flight sim design studio
i have tried to reverse with softice,IDA and w32dasm, i believe this program is in delphi but dede will not decompile it...
i have found the core of the serial check - a friend who is more advanced at cracking than me tried it - finally got it to install but only in demo mode..... e-mail me at swflatrunking@hotmail.com and i can provide the source code i have
Exported fn(): SerialCheck - Ord:0001h
:0040C450 55                      push ebp
:0040C451 8BEC                    mov ebp, esp
:0040C453 8B4514                  mov eax, dword ptr [ebp+14]
:0040C456 50                      push eax
:0040C457 E850000000              call 0040C4AC
:0040C45C 84C0                    test al, al
:0040C45E 7404                    je 0040C464
:0040C460 B064                    mov al, 64
:0040C462 EB15                    jmp 0040C479
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040C45E(C)
|
:0040C464 6A30                    push 00000030
* Possible StringData Ref from Code Obj ->"SERIAL NUMBER ERROR"
                                  |
:0040C466 6880C44000              push 0040C480
* Possible StringData Ref from Code Obj ->"Invalid Serial Number"
                                  |
:0040C46B 6894C44000              push 0040C494
:0040C470 6A00                    push 00000000
* Reference To: user32.MessageBoxA, Ord:0000h
                                
if anyone can assist me in this - would be appreciated - and you can take the credit for the crack when it is complete ..
also i can provide dumps from softice, w32dasm, and IDA if needed
Thanks
Jason
goatass
November 2nd, 2000, 14:24
Hey there, going by the only thing you provided it looks like
:0040C453 8B4514 mov eax, dword ptr [ebp+14]  <--moving your serial to EAX
:0040C456 50 push eax  
:0040C457 E850000000 call 0040C4AC   <--the actual CALL that checks serial
:0040C45C 84C0 test al, al  <-- AL must be 1 if it's 0 it will jump to the error box
:0040C45E 7404 je 0040C464
:0040C460 B064 mov al, 64   <--some flag maybe
:0040C462 EB15 jmp 0040C479   <-- jump passed the error box maybe good place
the 0040C457 E850000000 call 0040C4AC is the one place you should focus on, it could be that it's generating a real serial in there or maybe just checking the length of the serial.  If you could provide some code from with in that CALL it would be easier to see what it does.
Just make sure that the je 0040C464 never executes this way you won't get the error message box, I don't know what the program does after that since you didn't include the code but that flag (MOV al, 64) looks like it has something to do with it.
Another thing, try using IDA to disassemble the program, it provides much more informtaion about functions that could be of great help.
hope that helped.
goatass
radaremt
November 2nd, 2000, 14:46
Ok here is the code for that call - see next reply for something i did
* Referenced by a CALL at Address:
|:0040C457   
|
:0040C4AC 55                      push ebp
:0040C4AD 8BEC                    mov ebp, esp
:0040C4AF 33C9                    xor ecx, ecx
:0040C4B1 51                      push ecx
:0040C4B2 51                      push ecx
:0040C4B3 51                      push ecx
:0040C4B4 51                      push ecx
:0040C4B5 53                      push ebx
:0040C4B6 33C0                    xor eax, eax
:0040C4B8 55                      push ebp
:0040C4B9 68BCC54000              push 0040C5BC
:0040C4BE 64FF30                  push dword ptr fs:[eax]
:0040C4C1 648920                  mov dword ptr fs:[eax], esp
:0040C4C4 8D45F0                  lea eax, dword ptr [ebp-10]
:0040C4C7 8B5508                  mov edx, dword ptr [ebp+08]
:0040C4CA E8ED6EFFFF              call 004033BC
:0040C4CF 8B45F0                  mov eax, dword ptr [ebp-10]
:0040C4D2 8D55F4                  lea edx, dword ptr [ebp-0C]
:0040C4D5 E84A9DFFFF              call 00406224
:0040C4DA 8B45F4                  mov eax, dword ptr [ebp-0C]
:0040C4DD 8D55F8                  lea edx, dword ptr [ebp-08]
:0040C4E0 E8079EFFFF              call 004062EC
:0040C4E5 8B45F8                  mov eax, dword ptr [ebp-08]
:0040C4E8 50                      push eax
:0040C4E9 E8FA000000              call 0040C5E8
:0040C4EE 84C0                    test al, al
:0040C4F0 7516                    jne 0040C508
:0040C4F2 8B45F8                  mov eax, dword ptr [ebp-08]
* Possible StringData Ref from Code Obj ->"DEMO"
                                  |
:0040C4F5 BAD4C54000              mov edx, 0040C5D4
:0040C4FA E87170FFFF              call 00403570
:0040C4FF 7407                    je 0040C508
:0040C501 33DB                    xor ebx, ebx
:0040C503 E999000000              jmp 0040C5A1
i have the entire source code as a text file
radaremt
November 2nd, 2000, 14:52
ok i did some changing to the code but got it to install only in demo mode so i have to figure out how to bypass that call 
Exported fn(): SerialCheck - Ord:0001h
:0040C450 55                      push ebp
:0040C451 8BEC                    mov ebp, esp
:0040C453 8B4514                  mov eax, dword ptr [ebp+14]
:0040C456 50                      push eax
:0040C457 E850000000              call 0040C4AC
:0040C45C 84C0                    test al, al
:0040C45E 7404                    je 0040C464 
**** Changed to je 0040c479*******
:0040C460 B064                    mov al, 64
:0040C462 EB15                    jmp 0040C479
and this is the Jump
:0040C47D 000000                  BYTE  3 DUP(0)
:0040C480 53                      push ebx
:0040C481 45                      inc ebp
:0040C482 52                      push edx
:0040C483 49                      dec ecx
:0040C484 41                      inc ecx
:0040C485 4C                      dec esp
:0040C486 204E55                  and byte ptr [esi+55], cl
:0040C489 4D                      dec ebp
:0040C48A 42                      inc edx
:0040C48B 45                      inc ebp
:0040C48C 52                      push edx
:0040C48D 204552                  and byte ptr [ebp+52], al
:0040C490 52                      push edx
:0040C491 4F                      dec edi
:0040C492 52                      push edx
:0040C493 00496E                  add byte ptr [ecx+6E], cl
:0040C496 7661                    jbe 0040C4F9
:0040C498 6C                      insb
:0040C499 6964205365726961        imul esp, dword ptr [eax+53], 61697265
:0040C4A1 6C                      insb
:0040C4A2 204E75                  and byte ptr [esi+75], cl
:0040C4A5 6D                      insd
:0040C4A6 626572                  bound esp, dword ptr [ebp+72]
:0040C4A9 000000                  BYTE  3 DUP(0)
radaremt
November 2nd, 2000, 15:08
here is the code for IDA
040C450 ; Exported entry   1. SerialCheck
0040C450 
0040C450 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
0040C450 
0040C450 ; Attributes: bp-based frame
0040C450 
0040C450                 public SerialCheck
0040C450 SerialCheck     proc near
0040C450 
0040C450 arg_C           = dword ptr  14h
0040C450 
0040C450                 push    ebp
0040C451                 mov     ebp, esp
0040C453                 mov     eax, [ebp+arg_C]
0040C456                 push    eax
0040C457                 call    sub_40C4AC
0040C45C                 test    al, al
0040C45E                 jz      short loc_40C464
0040C460                 mov     al, 64h
0040C462                 jmp     short loc_40C479
0040C464 ; ---------------------------------------------------------------------------
0040C464 
0040C464 loc_40C464:                             ; CODE XREF: SerialCheck+Ej
0040C464                 push    30h
0040C466                 push    offset dword_40C480
0040C46B                 push    offset dword_40C494
0040C470                 push    0
0040C472                 call    j_MessageBoxA_0
0040C477                 xor     eax, eax
0040C479 
0040C479 loc_40C479:                             ; CODE XREF: SerialCheck+12j
0040C479                 pop     ebp
0040C47A                 retn    14h
0040C47A SerialCheck     endp ; sp = -14h
0040C47A 
0040C47A ; ---------------------------------------------------------------------------
0040C47D                 align 4
0040C480 dword_40C480    dd 49524553h, 4E204C41h, 45424D55h, 52452052h, 524F52h
0040C480                                         ; DATA XREF: SerialCheck+16o
0040C494 dword_40C494    dd 61766E49h, 2064696Ch, 69726553h, 4E206C61h, 65626D75h
0040C494                                         ; DATA XREF: SerialCheck+1Bo
0040C494                 dd 72h
0040C4AC 
0040C4AC ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
0040C4AC 
0040C4AC ; Attributes: bp-based frame
0040C4AC 
0040C4AC sub_40C4AC      proc near               ; CODE XREF: SerialCheck+7p
0040C4AC 
0040C4AC var_10          = dword ptr -10h
0040C4AC var_C           = dword ptr -0Ch
0040C4AC var_8           = dword ptr -8
0040C4AC var_4           = dword ptr -4
0040C4AC arg_0           = dword ptr  8
0040C4AC 
0040C4AC                 push    ebp
0040C4AD                 mov     ebp, esp
0040C4AF                 xor     ecx, ecx
0040C4B1                 push    ecx
0040C4B2                 push    ecx
0040C4B3                 push    ecx
0040C4B4                 push    ecx
0040C4B5                 push    ebx
0040C4B6                 xor     eax, eax
0040C4B8                 push    ebp
0040C4B9                 push    offset loc_40C5BC
0040C4BE                 push    dword ptr fs:[eax]
0040C4C1                 mov     fs:[eax], esp
0040C4C4                 lea     eax, [ebp+var_10]
0040C4C7                 mov     edx, [ebp+arg_0]
0040C4CA                 call    unknown_libname_25
0040C4CF                 mov     eax, [ebp+var_10]
0040C4D2                 lea     edx, [ebp+var_C]
0040C4D5                 call    sub_406224
0040C4DA                 mov     eax, [ebp+var_C]
0040C4DD                 lea     edx, [ebp+var_8]
0040C4E0                 call    sub_4062EC
0040C4E5                 mov     eax, [ebp+var_8]
0040C4E8                 push    eax
0040C4E9                 call    sub_40C5E8
0040C4EE                 test    al, al
0040C4F0                 jnz     short loc_40C508
0040C4F2                 mov     eax, [ebp+var_8]
0040C4F5                 mov     edx, offset _str_DEMO.Text
0040C4FA                 call    @System@@LStrCmp$qqrv ; System __linkproc__ LStrCmp(void)
0040C4FF                 jz      short loc_40C508
0040C501                 xor     ebx, ebx
0040C503                 jmp     loc_40C5A1
goatass
November 2nd, 2000, 18:18
ok that's a alof code 
 
The change you made is wrong because you skipped the MOV EAX,64 which is like I said some kind of flag so this is how to fix that problem:
:0040C457 E850000000 call 0040C4AC
:0040C45C 84C0 test al, al
:0040C45E 90 nop
:0040C45F 90 nop
:0040C460 B064 mov al, 64
:0040C462 EB15 jmp 0040C479
Here is another place to look at, as you can see from looking in IDA that this call is a compare - call @System@@LStrCmp$qqrv ; System __linkproc__ LStrCmp
0040C4E8 push eax
0040C4E9 call sub_40C5E8  <--don't know but if return 1 it's good
0040C4EE test al, al
0040C4F0 jnz short loc_40C508  <--bad jump (maybe)
0040C4F2 mov eax, [ebp+var_8]  <-- your serial maybe ?
0040C4F5 mov edx, offset _str_DEMO.Text  <--checks if you entered DEMO ?
0040C4FA call @System@@LStrCmp$qqrv ; System __linkproc__ LStrCmp(void)
0040C4FF jz short loc_40C508  <--did you enter DEMO as serial ? bad jump
0040C501 xor ebx, ebx
0040C503 jmp loc_40C5A1  <-- probably a good jump
check out what all the CALLs above this code do and check out all the stuff being pushed to these CALLs.  Do a:  d eax  or d *eax to see what registers hold everytime they go into and come out of a CALL.
If you want a JZ or JNZ to NOT execute just NOP (90) it out so the program will proceed normally.
goatass
?ferret
November 2nd, 2000, 21:59
:0040C4E8 50 push eax
:0040C4E9 E8FA000000 call 0040C5E8  //This one could be interesting
:0040C4EE 84C0 test al, al
:0040C4F0 7516 jne 0040C508  //Jumps past the string ref for "DEMO"....possibly to registered version?
:0040C4F2 8B45F8 mov eax, dword ptr [ebp-08]
* Possible StringData Ref from Code Obj ->"DEMO"
|
:0040C4F5 BAD4C54000 mov edx, 0040C5D4
zitterbe
November 3rd, 2000, 06:12
Why not let it go ahead in make the call and fuck with the code in that proc that affects the return value? Or better, analyze and fuck with the code, in the 
"call :0040C457 E850000000 call 0040C4AC <--the actual CALL that checks serial"???
Code in that call (or maybe deeper level calls) supposely detertmines immediate results of the serial check - so maybe global variables (that may get tested later) get set that may need that that call to be made and get set some variables set right?  
z
radaremt
November 3rd, 2000, 10:32
also i now know there are three types of licenses for this program - standard, pro, and Commercial..... i have found the .dll in the install directory that affects these as well
radaremt
November 3rd, 2000, 11:21
ok i dissasembled asreg02.dll in the program once it installed - the upgrade registration menu was disabled but i found some very very interesting code - i cannot post all the code here but if someone wants to take a look at it with me i can send it to you as a text file it is very very interesting indeed
e-mail swflatrunking@hotmail.com or ICQ 8074034
Thanks for the help so far
Powered by vBulletin® Version 4.2.2 Copyright © 2018 vBulletin Solutions, Inc. All rights reserved.