티스토리 뷰
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번인만큼 이번엔 이름에 대한 시리얼 뽑기입니다.
그러나 지금 시간이
하겠습니다. 자세히 하는건 개인이 해도 충분하니
말이에요. 먼저 대상 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 ;esi와 eax 그리고 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 ;eax와 edx를 비교(둘다 0이다)
00457DFE 58 pop eax
00457DFF 7405 jz 00457E06 ;둘다 0이라면 점프
---------------------------------------------------------------------
0x457DFC 지점에서 eax와 edx가 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 ;eax와 edx 비교
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의 도를 쌓기 바란다
'Reverse Engineering' 카테고리의 다른 글
W32Dasm - 디스 어셈블러 (0) | 2008.01.15 |
---|---|
RecStudio - 디 컴파일러 (0) | 2008.01.15 |
Tutorial 7 - abex's Crack Me 솔루션 (0) | 2008.01.11 |
Tutorial 6 - Dede를 이용한 Icon Grabber 2.1v 크랙하기 (0) | 2008.01.11 |
Tutorial 5 - IDA를 이용한 내 다이어리 크랙하기 (9) | 2008.01.11 |
- Total
- Today
- Yesterday
- NDC2013
- ruby
- 루비
- 디자인 패턴
- Ruby on Rails
- c언어
- 엘키
- SDL
- TDD
- 좋은 프로그래머
- EasyExec
- SQLite Spy
- perfmon
- ftp
- 디버깅
- Rails
- EzShortcut
- 조엘 온 소프트웨어
- 리버스 엔지니어링
- 임백준
- 루비 온 레일즈
- 게임데브포에버
- 게임개발포에버
- CppSQLite
- 멀티스레드
- MS-SQL
- RoR
- 바로가기 프로그램
- TraceRoute
- svn
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |