티스토리 뷰

1.cff crackme #2 Serial Crack

이번에는 acid의 CrackMe들을 풀어 보자.

이글을 쓰기전 acid가 만든 CrackMe를 풀면서

느꼈던 것은 acid라는 사람은 C보다는 Delphi

잘하기 떄문에 Delphi로 CrackMe만든게 아닌지 짐작하여 본다.

어쨰든 Delphi로 만들어진 CrackMe들인 만큼 DeDe를 이용하여

크랙을 한번 하여보자. 시작하기전 한마디 하자면 무지 쉽다.

! abex 솔루션에서 말했던 것처럼 CrackMe풀기전에

Crack Me가 원하는것이 무엇인지 확실이 알고 해야 할것이다.

Crack Me는 단지 Crack Me에 맞는 시리얼만 맞추면 된다.

정말 간단하지 않은가? 먼저 대상을 실행해 보도록 하자.

정말 간단한 인터페이스를 가지고 있다.

시리얼을 입력받을 Edit 한개와 체크 버튼 그리고 종료 버튼이다.

체크 버튼의 이름을 잘 봐두도록 하자. "Check the Serial"이다.

이제 DeDe를 이용하여 대상을 불러오도록 하자

다 불러왔다면 DeDe 메뉴에서 Procedures 메뉴를 누르자.

왼쪽에 표시되어있는 이벤트 목록의 첫번쨰것부터 마우스 오른쪽

버튼으로 클릭하면 나오는 팝업메뉴중 "Show additional data"

메뉴를 눌러 caption이 뭔지 참조하며 Caption이 "Check the Serial"

인것을 찾도록 하자.

첫번쨰 이벤트인 SpeedButton1Click의 Caption이 "Check the Serial" 임을 볼수 있었다.

그럼 이제 첫번쨰 이벤트를 마우스 오른쪽 버튼으로 클릭할떄 나오는 팝업메뉴중

역어셈블 메뉴를 눌러 해당 이벤트를 역어셈블 하여 오자.


! 보면 0x442B4B 줄에서 GetText 델파이 내부 함수로 시리얼 창에서

우리가 입력한 값을 긁어오고 긁어온 결과를 eax에 넣는다.

그리고 edx에는 "12011982"라는 의심가는 문자열을 넣는다.

그리고 0x403B44를 콜한다. 0x403B44지점에 들어와 조금 내려 보니

00403B4B   39D0                   cmp     eax, edx

00403B4D   0F848F000000           jz      00403BE2

이런 부분이 보인다. eax에는 우리가 입력한 키값이 들어있고

edx에는 "12011982"라는 의심가는 문자열이 들어있는데...

두가지를 비교하여 비어 있다면 다시 위로 점프하여 루프(?)

도는 것을 볼수 있다. 만약 0 이 아니라면..

00403B53   85F6                   test    esi, esi

00403B55   7468                   jz      00403BBF

esi[우리가 입력한값]가 비어있나 안비어있나 체크한후...

00403B57   85FF                   test    edi, edi

00403B59   746B                   jz      00403BC6

edi[올바른 시리얼값]도 비어있나 비어있지 않나 체크한다.

00403B5B   8B46FC                 mov     eax, [esi-$04]

00403B5E   8B57FC                 mov     edx, [edi-$04]

00403B61   29D0                   sub     eax, edx

그리고 esi[우리가입력한값]의 길이를 eax에 넣고...

edi[올바른 시리얼값]의 길이를 edx에 넣고 eax에서 edx뺸다.

그리고 입력된 길이가 올바르다면 밑과 같은 곳으로 가서 체크한다.

00403BCE   38D9             CMP CL,BL

00403BD0   75 10            JNZ SHORT CrackMe2.00403BE2

00403BD2   38FD             CMP CH,BH

00403BD4   75 0C            JNZ SHORT CrackMe2.00403BE2

00403BD6   C1E9 10          SHR ECX,10

00403BD9   C1EB 10          SHR EBX,10

00403BDC   38D9             CMP CL,BL

00403BDE   75 02            JNZ SHORT CrackMe2.00403BE2

00403BE0   38FD             CMP CH,BH

00403BE2   5F               POP EDI                            

00403BE3   5E               POP ESI

00403BE4   5B               POP EBX

어쨰든 이건 그런거고 올바른 시리얼 값은 EDI에 저장되어 있다.

바로 "12011982"이다. 한번 직접입력하여 보자


어떤가? 비교적 쉽지 않았는가? 간단한 준비 운동이었다.

2.cff crackme #3 name/serial Crack

여어~ 이번에는 name과 serial두개다를 요구한다.

하지만 본인이 미리 알아본 결과 name과 serial은

이미 정해져 있다. 그럼으로 무지 쉽다. :p

이번 CrackMe역시 Delphi로 작성되 있으니 DeDe

이용 하도록 하고.. 먼저 CrackMe를 실행해 보자.

Name 입력창과 Serial입력창, 등록버튼 그리고

종료 버튼이 보인다. 이전 CrackMe에서 그랬던 것처럼

이번에도 등록버튼의 Capiton을 잘 외워 둔다.

"Register now !"이다. 기억하였으면...

이제 DeDe로 대상을 불러 오도록 하자


로딩이 완료되었으면 DeDe의 Procedures 메뉴를 누르자.



2가지의 이벤트들이 보이는데 Show additional data메뉴의

Caption이 "Register now !"을 찾아 보자.

운이 좋게도 첫번째 이벤트가 Capiton으로 "Register now !"

가지고 있다. 이제 역어셈블 메뉴를 눌러 이벤트를

역어셈블 하여 오자.


역어셈블 해온 코드에서 가장 먼저 보이는 부분이다.

눈에 띄는것은 Name을 읽어온후 비어있는가 비어있지 않는가

체크한후 비어있지 않다면 점프를 하는 것이다.

당연히 점프를 해야 정상일것임으로 점프되는 지점인...

0x440EF2 부분을 보도록 하자.


0x440EF2로 이동해 와보니.. 이곳은 Serial이 비어있는가

비어 있지 않은가를 체크한후 비어있지 않다면 0x440F1E로

점프 하는것을 볼수 있다. 그럼으로 0x440F1E로 이동해 보자.


! 보니 다시 Name을 읽어온후 eax에 저장하고

edx에는 "Resisterd User"라는 의심가는 문자열을 저장한후

0x403B2C라는 의문가는 지점을 콜 하는것을 볼수 있다.

0x403B2C부분으로 보도록 하자.


별로 볼건 없다 그져 비어있는가 안비어있는가를 체크한후

별문제 없다면 0x403BB5로 점프하게 된다.. 0x403BB5로 가보자


'Registered User' 라는 문자열과 우리가 입력한 Name을

한글자씩 가지고 와서 비교하는 루틴이란걸 볼수 있다.

'Registered User'와 비교하는걸 봐서 'Registered User'가

올바른 Name이라는 점을 알수 있다. 용량 문제도 있고 해서

Serial부분은 줄이도록 하겠다. Serial의 올바른 답은..

GFX-754-IER-954라는것은 쉽게 알수 있고 하니 말이다.

Name:Registered User

Serial:GFX-754-IER-954

입력하여 보자.




3.cff crackme #3 name/serial Crack

마지막 3번 CrackMe입니다.

3번인만큼 이번엔 이름에 대한 시리얼 뽑기입니다.

그러나 지금 시간이 12시인 만큼 간단하게 쓰도록

하겠습니다. 자세히 하는건 개인이 해도 충분하니

말이에요. 먼저 대상 CrackMe를 실행하여 봅시다.


이번 CrackMe도 Name 입력창, Serial입력창

체크버튼,종료버튼 등이 보입니다.

이번에도 역시 체크버튼의 제목을 잘 외워 둡시다.

"Check if valid..." 이군요. 이제 알았으니...

DeDe로 이 CrackMe를 불러 오고 Procedures메뉴로

들어가서 이벤트 목록들의 Show additional data를

봐서 Caption이 "Check if valid..." 인것을 찾습니다.

두번쨰 버튼의 Capiton이 "Check if valid..." 이네요.

역어셈블 메뉴를 선택하여 이벤트를 역어셈블 해옵시다.

역어셈블 해온 코드를 보니 맨처음엔 Name이 공갈인지 체크 하네요.

---------------------------------------------------------------------

00457BC7   648920                 mov     fs:[eax], esp

00457BCA   8D55FC                 lea     edx, [ebp-$04]

* Reference to control TForm1.Edit1 : TEdit|

00457BCD   8B83D8020000           mov     eax, [ebx+$02D8]

* Reference to: controls.TControl.GetText(TControl):TCaption;|

00457BD3   E808C3FCFF             call    00423EE0

00457BD8   837DFC00               cmp     dword ptr [ebp-$04], +$00

00457BDC   7518                   jnz     00457BF6 ;<================

00457BDE   6A00                   push    $00

* Possible String Reference to: 'Enter your Name !'|

00457BE0   B9987E4500             mov     ecx, $00457E98

* Possible String Reference to: 'You must enter your Name !'|

00457BE5   BAAC7E4500             mov     edx, $00457EAC

* Reference to TApplication instance|

00457BEA   A198A54500             mov     eax, dword ptr [$0045A598]

00457BEF   8B00                   mov     eax, [eax]

* Reference to : TApplication._PROC_00440130()|

00457BF1   E83A85FEFF             call    00440130

---------------------------------------------------------------------

0x457BD8줄에서 0인지 체크하고 0x457BDC줄에서 0이 아니면 점프하네요.

점프 되는 지점인 0x457BF6으로 가봅시다.

---------------------------------------------------------------------

00457BF6   8D55FC                 lea     edx, [ebp-$04]

* Reference to control TForm1.Edit2 : TEdit

|

00457BF9   8B83DC020000           mov     eax, [ebx+$02DC]

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457BFF   E8DCC2FCFF             call    00423EE0

00457C04   837DFC00               cmp     dword ptr [ebp-$04], +$00

00457C08   7518                   jnz     00457C22  ;<==============

00457C0A   6A00                   push    $00

* Possible String Reference to: 'Enter a Serial !'

|

00457C0C   B9C87E4500             mov     ecx, $00457EC8

* Possible String Reference to: 'You must enter a Serial !'

|

00457C11   BADC7E4500             mov     edx, $00457EDC

* Reference to TApplication instance

|

00457C16   A198A54500             mov     eax, dword ptr [$0045A598]

00457C1B   8B00                   mov     eax, [eax]

* Reference to : TApplication._PROC_00440130()

|

00457C1D   E80E85FEFF             call    00440130

---------------------------------------------------------------------

이번에는 Serial을 입력받은후 입력받은 시리얼이 빈것인지

0x457C04에서 체크하고 0x457C08줄에서 비어있지 않다면 점프하네요.

점프 되는 지점인 0x457C22으로 가봅시다.

---------------------------------------------------------------------

00457C22   33C0                   xor     eax, eax  ;eax를 0으로 초기화

* Reference to GlobalVar_0045B840

|

00457C24   A340B84500             mov     dword ptr [$0045B840], eax

00457C29   8D55FC                 lea     edx, [ebp-$04]

* Reference to control TForm1.Edit1 : TEdit

|

00457C2C   8B83D8020000           mov     eax, [ebx+$02D8]

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457C32   E8A9C2FCFF             call    00423EE0  ;Name을 다시 읽어옴

00457C37   8B45FC                 mov     eax, [ebp-$04]

* Reference to: System.Proc_00403C38

|

00457C3A   E8F9BFFAFF             call    00403C38  ;Name이 비었는지 체크

* Reference to GlobalVar_0045B844

|

00457C3F   A344B84500             mov     dword ptr [$0045B844], eax

00457C44   A144B84500             mov     eax, dword ptr [$0045B844]

* Reference to: Unit_004069CC.Proc_004079D0

|

00457C49   E882FDFAFF             call    004079D0

00457C4E   83F806                 cmp     eax, +$06  ;6보다 길어야함

00457C51   731D                   jnb     00457C70   ;길거나 같으면 점프

00457C53   6A00                   push    $00

* Possible String Reference to: 'Name too short !'

|

00457C55   B9F87E4500             mov     ecx, $00457EF8

* Possible String Reference to: 'Your Name must be at least 6 Chars

|                                long !'

|

00457C5A   BA0C7F4500             mov     edx, $00457F0C

* Reference to TApplication instance

|

00457C5F   A198A54500             mov     eax, dword ptr [$0045A598]

00457C64   8B00                   mov     eax, [eax]

* Reference to : TApplication._PROC_00440130()

|

00457C66   E8C584FEFF             call    00440130

---------------------------------------------------------------------

0x457C4E줄에서 Name의 길이가 6보다 짧은지 체크하고

0x47C51줄에서 짧지 않으면(길거나 같으면) 점프하네요.

점프 되는 지점인 0x457C70으로 가봅시다.

---------------------------------------------------------------------

00457C70   8D55FC                 lea     edx, [ebp-$04]

* Reference to control TForm1.Edit1 : TEdit

|

00457C73   8B83D8020000           mov     eax, [ebx+$02D8]

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457C79   E862C2FCFF             call    00423EE0  ;Name을 다시 읽어옴

00457C7E   8B45FC                 mov     eax, [ebp-$04]

00457C81   BA01000000             mov     edx, $00000001

00457C86   4A                     dec     edx

00457C87   3B50FC                 cmp     edx, [eax-$04]  ;edx와 0비교

00457C8A   7205                   jb      00457C91  ;작으면 점프 (점프할게 당연하다.)

---------------------------------------------------------------------

Name을 다시 읽어온후 0x457C87줄에서 0과 비교하고 0x457C8A줄에서

점프를 해야 한다는것을 알수 있습니다. 점프 되는 지점인 0x457C91로 가보죠.

---------------------------------------------------------------------

00457C91   42                     inc     edx ;0인 edx를 1증가 시켜 1로 만듬

00457C92   0FB64410FF             movzx   eax, byte ptr [eax+edx-$01]  ;Name 첫글자를 eax

00457C97   6BF002                 imul    esi, eax, $02  ;esieax 그리고 2로 곱셈

00457C9A   7105                   jno     00457CA1  ;오버 플로가 왜나오는지 모르겠음

* Reference to: system.@IntOver;

|

00457C9C   E8EBAEFAFF             call    00402B8C

00457CA1   8D55F8                 lea     edx, [ebp-$08]

* Reference to control TForm1.Edit1 : TEdit

|

00457CA4   8B83D8020000           mov     eax, [ebx+$02D8]

 

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457CAA   E831C2FCFF             call    00423EE0  ;다시 Name을 읽어온다.

00457CAF   8B45F8                 mov     eax, [ebp-$08]  ;결과를 eax

00457CB2   BA02000000             mov     edx, $00000002  ;edx에는 2를 넣고...

00457CB7   4A                     dec     edx  ;edx를 1로 만들고..

00457CB8   3B50FC                 cmp     edx, [eax-$04]  ;edx와 Name을 비교한다.

00457CBB   7205                   jb      00457CC2  ;작으면 점프 (점프할게 당연하다.)

---------------------------------------------------------------------

0x457B8 지점에서 edx(1)과 비교하여 1보다 길으면 0x457CBB에서 점프한다.

점프 되는 지점인 0x457CC2로 가보자.

---------------------------------------------------------------------

00457CC2   42                     inc     edx

00457CC3   0FB64410FF             movzx   eax, byte ptr [eax+edx-$01]

00457CC8   6BC002                 imul    eax, eax, $02

00457CCB   7105                   jno     00457CD2

* Reference to: system.@IntOver;

|

00457CCD   E8BAAEFAFF             call    00402B8C

00457CD2   03F0                   add     esi, eax

00457CD4   7105                   jno     00457CDB

* Reference to: system.@IntOver;

|

00457CD6   E8B1AEFAFF             call    00402B8C

00457CDB   8D55F4                 lea     edx, [ebp-$0C]

* Reference to control TForm1.Edit1 : TEdit

|

00457CDE   8B83D8020000           mov     eax, [ebx+$02D8]

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457CE4   E8F7C1FCFF             call    00423EE0  ;또 이름을 읽어온다.

00457CE9   8B45F4                 mov     eax, [ebp-$0C]

00457CEC   BA03000000             mov     edx, $00000003

00457CF1   4A                     dec     edx

00457CF2   3B50FC                 cmp     edx, [eax-$04]  ;이번엔 2와 비교한다.

00457CF5   7205                   jb      00457CFC  ;작으면 점프(점프하는게 당연.)

---------------------------------------------------------------------

너무 반복적으로 문자열 길이를 체크하는것이 아닌가 하는 생각이 든다.

이런 루틴은 사람을 짜증나게 하며 프로그램의 속도를 저하한다.

어쨰든 0x457CF5지점에서 작으면 점프하게 되는 지점인 0x457CFC으로 가보자.

---------------------------------------------------------------------

00457CFC   42                     inc     edx

00457CFD   0FB64410FF             movzx   eax, byte ptr [eax+edx-$01]

00457D02   6BC002                 imul    eax, eax, $02

00457D05   7105                   jno     00457D0C

* Reference to: system.@IntOver;

|

00457D07   E880AEFAFF             call    00402B8C

00457D0C   03F0                   add     esi, eax

00457D0E   7105                   jno     00457D15

* Reference to: system.@IntOver;

|

00457D10   E877AEFAFF             call    00402B8C

00457D15   8D55F0                 lea     edx, [ebp-$10]

* Reference to control TForm1.Edit1 : TEdit

|

00457D18   8B83D8020000           mov     eax, [ebx+$02D8]

 

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457D1E   E8BDC1FCFF             call    00423EE0

00457D23   8B45F0                 mov     eax, [ebp-$10]

00457D26   BA04000000             mov     edx, $00000004

00457D2B   4A                     dec     edx

00457D2C   3B50FC                 cmp     edx, [eax-$04]  ;이번엔 3과 비교

00457D2F   7205                   jb      00457D36  ;작으면 점프(당연히 점프)

---------------------------------------------------------------------

제길... 또 길이 비교다 다시.. 0x457D2F지점에서 점프되는 지점인

0X457D36지점으로 가보자.

---------------------------------------------------------------------

00457D36   42                     inc     edx

00457D37   0FB64410FF             movzx   eax, byte ptr [eax+edx-$01]

00457D3C   6BC002                 imul    eax, eax, $02

00457D3F   7105                   jno     00457D46

* Reference to: system.@IntOver;

|

00457D41   E846AEFAFF             call    00402B8C

00457D46   03F0                   add     esi, eax

00457D48   7105                   jno     00457D4F

* Reference to: system.@IntOver;

|

00457D4A   E83DAEFAFF             call    00402B8C

00457D4F   8D55EC                 lea     edx, [ebp-$14]

* Reference to control TForm1.Edit1 : TEdit

|

00457D52   8B83D8020000           mov     eax, [ebx+$02D8]

 

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457D58   E883C1FCFF             call    00423EE0

00457D5D   8B45EC                 mov     eax, [ebp-$14]

00457D60   BA05000000             mov     edx, $00000005

00457D65   4A                     dec     edx

00457D66   3B50FC                 cmp     edx, [eax-$04]  ;이번엔 4와 비교

00457D69   7205                   jb      00457D70  ;작다면 점프(당연히 점프)

---------------------------------------------------------------------

정말 즐기다 또 길이 체크다....0X457D69지점에서 점프되는 지점인

0X457D70으로 가보자....

---------------------------------------------------------------------

00457D70   42                     inc     edx

00457D71   0FB64410FF             movzx   eax, byte ptr [eax+edx-$01]

00457D76   6BC002                 imul    eax, eax, $02

00457D79   7105                   jno     00457D80

* Reference to: system.@IntOver;

|

00457D7B   E80CAEFAFF             call    00402B8C

00457D80   03F0                   add     esi, eax

00457D82   7105                   jno     00457D89

* Reference to: system.@IntOver;

|

00457D84   E803AEFAFF             call    00402B8C

00457D89   8D55E8                 lea     edx, [ebp-$18]

* Reference to control TForm1.Edit1 : TEdit

|

00457D8C   8B83D8020000           mov     eax, [ebx+$02D8]

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457D92   E849C1FCFF             call    00423EE0

00457D97   8B45E8                 mov     eax, [ebp-$18]

00457D9A   BA06000000             mov     edx, $00000006

00457D9F   4A                     dec     edx

00457DA0   3B50FC                 cmp     edx, [eax-$04]  ;이제 5와 비교

00457DA3   7205                   jb      00457DAA  ;작다면 점프(당연히 점프)

---------------------------------------------------------------------

정말 지겹지도 않나 별써 6번째이다. 후우... 이제 끝이 나올떄도 된거 같다.

0x457DA3 지점에서 점프 되는 지점인 0X457DAA으로 가보자.

---------------------------------------------------------------------

00457DAA   42                     inc     edx

00457DAB   0FB64410FF             movzx   eax, byte ptr [eax+edx-$01]

00457DB0   6BC002                 imul    eax, eax, $02  ;eax를 곱한다 2

00457DB3   7105                   jno     00457DBA

* Reference to: system.@IntOver;

|

00457DB5   E8D2ADFAFF             call    00402B8C

00457DBA   03F0                   add     esi, eax

00457DBC   7105                   jno     00457DC3

* Reference to: system.@IntOver;

|

00457DBE   E8C9ADFAFF             call    00402B8C

00457DC3   893540B84500           mov     [$0045B840], esi

00457DC9   A144B84500             mov     eax, dword ptr [$0045B844]

* Reference to: Unit_004069CC.Proc_004079D0

|

00457DCE   E8FDFBFAFF             call    004079D0  ;콜

00457DD3   6BC002                 imul    eax, eax, $02  ;eax를 곱한다 2

00457DD6   7305                   jnb     00457DDD  ;크거나 같으면 점프

---------------------------------------------------------------------

드디어 길이 체크가 끝났다....

0x457DD76에서 0x457DDD로 점프하는것을 볼수 있다..

0x457DDD으로 가보자.

---------------------------------------------------------------------

00457DDD   33D2                   xor     edx, edx  ;edx 초기화

00457DDF   52                     push    edx

00457DE0   50                     push    eax

00457DE1   A140B84500             mov     eax, dword ptr [$0045B840]

00457DE6   99                     cdq

00457DE7   030424                 add     eax, [esp]

00457DEA   13542404               adc     edx, [esp+$04]

00457DEE   7105                   jno     00457DF5

* Reference to: system.@IntOver;

|

00457DF0   E897ADFAFF             call    00402B8C

00457DF5   83C408                 add     esp, +$08

00457DF8   50                     push    eax

00457DF9   C1F81F                 sar     eax, $1F

00457DFC   3BC2                   cmp     eax, edx  ;eaxedx를 비교(둘다 0이다)

00457DFE   58                     pop     eax

00457DFF   7405                   jz      00457E06  ;둘다 0이라면 점프

---------------------------------------------------------------------

0x457DFC 지점에서 eaxedx가 0인지 연산하고 0x457DFF지점에서

0이라면 점프한다. 점프되는 지점인 0x457E06으로 가보자.

---------------------------------------------------------------------

00457E06   A340B84500             mov     dword ptr [$0045B840], eax

00457E0B   8D55E4                 lea     edx, [ebp-$1C]

00457E0E   A140B84500             mov     eax, dword ptr [$0045B840]

* Reference to: Unit_004069CC.Proc_00407744

|

00457E13   E82CF9FAFF             call    00407744  ;의심가는 콜-1

00457E18   8B45E4                 mov     eax, [ebp-$1C]

00457E1B   50                     push    eax

00457E1C   8D55FC                 lea     edx, [ebp-$04]

* Reference to control TForm1.Edit2 : TEdit

|

00457E1F   8B83DC020000           mov     eax, [ebx+$02DC]

* Reference to: controls.TControl.GetText(TControl):TCaption;

|

00457E25   E8B6C0FCFF             call    00423EE0  ;Serial을 읽어온다.

00457E2A   8B55FC                 mov     edx, [ebp-$04]

00457E2D   58                     pop     eax

* Reference to: System.Proc_00403B84

|

00457E2E   E851BDFAFF             call    00403B84  ;의심가는 콜-2

00457E33   751A                   jnz     00457E4F

00457E35   6A00                   push    $00

* Possible String Reference to: 'Congratz !'

|

00457E37   B9387F4500             mov     ecx, $00457F38

 

* Possible String Reference to: 'You cracked the CFF CrackMe #4 ! Pl

|                                ease send your solution to acidbyte

|                                s@gmx.net !'

|

00457E3C   BA447F4500             mov     edx, $00457F44

* Reference to TApplication instance

|

00457E41   A198A54500             mov     eax, dword ptr [$0045A598]

00457E46   8B00                   mov     eax, [eax]

* Reference to : TApplication._PROC_00440130()

|

00457E48   E8E382FEFF             call    00440130

---------------------------------------------------------------------

드디어 마지막 부분인듯 하다. 먼저 0x457E13이 수상하다.

알수 없는 Call이로다. 키생성 루틴일 가능성이 크다.

어쨰든 Call의 결과를 0x457E18에서 eax에 넣고.....

0x457E25에서는 Serial을 읽어오고 0x457E2A 지점에서 그걸 edx에 넣는다.

그리고 0x457E2E에서 의심가는 콜-2를 Call 한다. 키비교 루틴일 가능성이 크다.

만약 나의 짐작이 맞다면 0x457E18 줄에서.....

---------------------------------------------------------------------

00457E0B   8D55E4                 lea     edx, [ebp-$1C]

00457E0E   A140B84500             mov     eax, dword ptr [$0045B840]

* Reference to: Unit_004069CC.Proc_00407744

|

00457E13   E82CF9FAFF             call    00407744  ;의심가는 콜-1

00457E18   8B45E4                 mov     eax, [ebp-$1C] <===여기다가 브포를 걸면

----------------------------------------------------------------------

0x457E18줄에 브레이크 포인트를 걸면 올바른 시리얼을 건질수 있을 것이다.

어쨰든 의심가는-2 지점인 0x403B84 지점을 보도록 하자.

----------------------------------------------------------------------

00403B84   53                     push    ebx

00403B85   56                     push    esi

00403B86   57                     push    edi

00403B87   89C6                   mov     esi, eax

00403B89   89D7                   mov     edi, edx

00403B8B   39D0                   cmp     eax, edx  ;eaxedx 비교

00403B8D   0F848F000000           jz      00403C22  ;같다면 점프 (시리얼 비교)

00403B93   85F6                   test    esi, esi

00403B95   7468                   jz      00403BFF

00403B97   85FF                   test    edi, edi

00403B99   746B                   jz      00403C06

00403B9B   8B46FC                 mov     eax, [esi-$04]

00403B9E   8B57FC                 mov     edx, [edi-$04]

00403BA1   29D0                   sub     eax, edx

00403BA3   7702                   jnbe    00403BA7

00403BA5   01C2                   add     edx, eax

00403BA7   52                     push    edx

00403BA8   C1EA02                 shr     edx, $02

00403BAB   7426                   jz      00403BD3

----------------------------------------------------------------------

잡다한 설명은 넣지 않았다. 딱 저 두줄로 모든것이 결정 난다.

eax의 값과 edx의 값을 비교한다. 이전에 봤던 아래의 두줄...

--------------------------------------------------------

00457E18   8B45E4                 mov     eax, [ebp-$1C]

00457E2A   8B55FC                 mov     edx, [ebp-$04]

--------------------------------------------------------

을 기억 한다면 이게 무슨 말인지 쉽게 알수 있을 것이다. eax에는 올바른 시리얼이..

그리고 edx에는 우리가 입력한 시리얼이 있다. 그 두개를 비교 하는 것이다.

이지점에 디버거를 이용해 브레이크 포인트를 걸고 eax레지스터 값을 본다면 거기에

올바른 시리얼이 있을 것이다. 밑의 그림은 실제로 브레이크 포인트를 건 장면이다.


Name: #Dual_Root

Serial: 1060

이라는 결과를 얻을수 있었다.. 여러분도 재대로 했다면 각자의 올바른 결과를 구했으리라..

밑은 한번 위의 결과를 Crack Me에 입력해 본 그림이다.

이로써 모든 acid crack이 끝났다.

즐거운 시간이였다면 영광이다.

물런 감정을 어떻게 느끼던 그것은...

내가 뭐라 말할 바는 아니지만 말이야!

그래도 즐거운 시간이었기를 바란다.

그럼 앞으로도 즐거운 Crack의 도를 쌓기 바란다

댓글