Norton Anywhere 크랙하기
로빈아빠
본문
Norton Anywhere ver 8.0 Cracking
Tools required
Soft-Ice 3.2 ( 3.2 이후의 어떤버전이든 상관없음.)
W32Dasm (any version should do, 8.93버전을 사용하면 더욱 좋음.)
An hexeditor ( 나는 UltraEdit 6.00a를 사용함. 어떤 거든지 상관없음, 본인이 쓰기에 편하기만 하면 됨.)
Target
PcAnywhere ver 8.0
Name : Winaw32.exe Size : 664,576 Bytes
Name : Awcomm32.dll Size : 128,512 Bytes
Program Location :
1. 통신망에 가면, 한국 Symantec에서 Trial버전을 배포하고 있음. 천리안은 go norton..
2. 개인적으로 용산전자상가의 프로그램 판매장에 들러서, 아가씨에게 Trial버전을 달라고 사정하면
CD를 얻을 수 있음. 아가씨를 잘 구슬르지 못하면, 포기하기 바람....
About this Protection system
한글판 PcAnywhere ver 8.0은 전형적인 30일 Trial Protection을 가지고 있습니다. 제가 확인한 바로는 미국꺼랑은 Protection이 틀립니다. 미국꺼는 무지 어렵게 되어 있는데.... 한국 노턴의 프로그래밍 실력이 별로라는 것을 보여주는 것입니다.
모든 비밀은 Awcomm32.dll 안에 들어 있습니다.
The Crack Essay
먼저 프로그램을 실행시키면, 등록라이선스 동의화면이 나옵니다. 이 때 Ctrl+D를 눌러서 소프트아이스를 불러낸 뒤, 명령어
hwnd
라고 치면, 다음과 같은 Text들이 나열되는 것이 보일 것입니다.
여기 출력되는 값은 컴퓨터마다 또한 실행할 때마다 틀립니다.
Window-Handle
hQueue
SZ
QOwner
Class-Name
Window-Procedure
0080 (0)
2057
32
MSGSVR32
#32711 (switch_win)
17EF:00004B6E
0084 (1)
2057
32
EXPLORER
shell_trayWnd
1487:0000016C
........
Enter키를 누르면, 한 줄씩 넘어가고, Space키를 누르면 명령어블럭의 한 화면씩 넘어갑니다. QOWNER[Program Name] 에 주의하면서,
Space키를 눌러가다 보면은 다음과 같은 부분이 보일 것입니다.
Window-Handle
hQueue
SZ
QOwner
Class-Name
Window-Procedure
0C18(1)
1A6F
32
WINAW32
IMEKR98U_MAIN
137F:0000012A
0B94 (1)
1A6F
32
WINAW32
IME
176F:00000000
0B9C (1)
1A6F
32
WINAW32
#32770 (Dialog)
1487:0000104A
0BA0 (2)
1A6F
32
WINAW32
Button
176F:000035CC
0BA4 (2)
1A6F
32
WINAW32
Button
176F:000035CC
0BA8 (2)
1A6F
32
WINAW32
Button
176F:000035CC
0BAC (2)
1A6F
32
WINAW32
Static
176F:0000828E
0BAF (2)
1A6F
32
WINAW32
Static
176F:0000828E
............
우리가 원하는 내용이 보였습니다. 바로 QOwner 가 WINAW32 이고, Class-Name이 #32770 (Dialog) 이며, Window-Handle이 0B9C 입니다. 그러나, 위 표에 보이는 값은 어디까지나 제 컴에서 실행했을 때 값입니다. 여러분은 여러분이 실행한 컴퓨터에서의 값을 기억해야 합니다.
우리가 추적을 원하는 메시지박스의 Window-Handle를 알아냈으므로, 우리는 BMSG command를 이용할 것입니다.
BMSG 는 메시지 브레이크를 거는 것입니다.
소프트아이스 명령윈도우에서 다음과 같이 칩니다.
BMSG 0B9C WM_DESTROY
다시 한번 말하지만, Window-Handle값 0B9C 는 여러분 컴퓨터에서 출력된 값을 써야 합니다.
그리고, 다른 브레이크포인트는 다 해제하십시오. 준비가 되었습니까??
그러면, Ctrl+D를 눌러서 프로그램을 실행시키고, 버튼을 누르면.....
짤까닥! 브레이크가 걸립니다. 여러분은 아마 USER.DLL 내부에 있을 것입니다. 정확히 얘기하면 DestroyWindow 함수입니다. 여기서 F12키를 천천히 누르면서, Awcomm32.dll 코드내부로 들어갑니다. ( 어떻게 Awcomm32.dll 코드내부인지를 아느냐면은 주소번지가 xxxx:0669Exxx 식입니다. W32Dasm 으로 disassemble 해보면 압니다. ) 바로 다음과 같은 부분입니다.
:0669E122 E8B92D0000 Call 066A0EE0
:0669E127 898538F1FFFF mov dword ptr [ebp+FFFFF138], eax <---- 우리가 도달한 곳
:0669E12D E9F1000000 jmp 0669E223
아하! 그렇습니다. 주소번지:0669E122 의 Call 066A0EE0 은 등록라이선스 동의화면을 띄우는 함수 CALL입니다. 자 이곳으로 오는 점프를 찾읍시다.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E090(C)
|
:0669E0FB 837D0800 cmp dword ptr [ebp+08], 00000000
:0669E0FF 0F844B010000 je 0669E250 <---- 등록라이선스 동의화면 그리기를 뛰어넘는 점프
:0669E105 FFB510F7FFFF push dword ptr [ebp+FFFFF710]
:0669E10B 6A00 push 00000000
:0669E10D 8D8D60F2FFFF lea ecx, dword ptr [ebp+FFFFF260]
:0669E113 E8E50A0000 call 0669EBFD
:0669E118 C645FC0B mov [ebp-04], 0B
:0669E11C 8D8D60F2FFFF lea ecx, dword ptr [ebp+FFFFF260]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E122 E8B92D0000 Call 066A0EE0 <---- 등록라이선스 동의 화면 그리기
:0669E127 898538F1FFFF mov dword ptr [ebp+FFFFF138], eax <---- 우리가 도달한 곳
:0669E12D E9F1000000 jmp 0669E223
바로 있습니다. 주소번지 :0669E0FF 의 je 0669E250 점프입니다. 여기서 무조건 점프를 하면 등록라이선스 동의화면은 나오지 않을 것입니다.
어떻게 하느냐면,
:0669E0FF 0F844B010000 je 0669E250 를
:0669E0FF E94C010000 jmp 0669E250
:0669E104 90 nop 로 바꿉니다. [ Offset은 D4FFh ]
여러분, 30일동안은 등록라이선스 동의화면이 없어서 좋았겠지만, 30일이 지나면, 사용기간이 만료됬다는 Nag화면이 뜹니다. 그리고는, 영원히 프로그램을 볼 수 없을지도 모릅니다. 어허, 전에 크랙한 화면이랑 비슷하지만, 버튼이 하나밖에 없습니다. 걱정하지 마세요. 저번이랑 똑같이 크랙하면 됩니다.
프로그램을 실행시키고, 사용기간 만료화면이 나옵니다. 이 때 Ctrl+D를 눌러서 소프트아이스를 불러낸 뒤, 명령어
hwnd
라고 치고, 우리가 원하는 부분까지 Space키를 누르면 다음과 같이 보일 것입니다.
Window-Handle
hQueue
SZ
QOwner
Class-Name
Window-Procedure
0F54(1)
1A6F
32
WINAW32
IMEKR98U_MAIN
137F:0000012A
0174 (1)
1A6F
32
WINAW32
IME
176F:00000000
0F48 (1)
1A6F
32
WINAW32
#32770 (Dialog)
19CF:0000072E
0F50 (2)
1A6F
32
WINAW32
Button
176F:000035CC
0F60 (2)
1A6F
32
WINAW32
Static
176F:0000828E
0F5C (2)
1A6F
32
WINAW32
Static
176F:0000828E
0F64 (2)
1A6F
32
WINAW32
Static
176F:0000828E
............
우리가 원하는 내용이 보였습니다. 바로 QOwner 가 WINAW32 이고, Class-Name이 #32770 (Dialog) 이며, Window-Handle이 0F48 입니다. 그러나, 위 표에 보이는 값은 어디까지나 제 컴에서 실행했을 때 값입니다. 여러분은 여러분이 실행한 컴퓨터에서의 값을 기억해야 합니다.
소프트아이스 명령윈도우에서 다음과 같이 칩니다.
BMSG 0F48 WM_DESTROY
다시 한번 말하지만, Window-Handle값 0F48 는 여러분 컴퓨터에서 출력된 값을 써야 합니다.
그리고, 다른 브레이크포인트는 다 해제하십시오. 준비가 되었습니까??
그러면, Ctrl+D를 눌러서 프로그램을 실행시키고, 버튼을 누르면.....
짤까닥! 브레이크가 걸립니다. 여러분은 아마 USER.DLL 내부에 있을 것입니다. 정확히 얘기하면 DestroyWindow 함수입니다. 여기서 F12키를 천천히 누르면서, Awcomm32.dll 코드내부로 들어갑니다. ( 어떻게 Awcomm32.dll 코드내부인지를 아느냐면은 주소번지가 xxxx:0669Exxx 식입니다. W32Dasm 으로 disassemble 해보면 압니다. ) 바로 다음과 같은 부분입니다.
:0669E01C E8BF2E0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E021 C78568F1FFFF00000000 mov dword ptr [ebp+FFFFF168], 00000000 <---- 우리가 도달한 곳
아하! 또 찾았습니다. 윗부분의 점프를 찾으면.
0669DFFD 85C0 test eax, eax
:0669DFFF 0F8558000000 jne 0669E05D <--- 여기서 점프를 해야만 한다.
:0669E005 6A00 push 00000000
:0669E007 8D8D28F3FFFF lea ecx, dword ptr [ebp+FFFFF328]
:0669E00D E8BF070000 call 0669E7D1
:0669E012 C645FC09 mov [ebp-04], 09
:0669E016 8D8D28F3FFFF lea ecx, dword ptr [ebp+FFFFF328]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E01C E8BF2E0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E021 C78568F1FFFF00000000 mov dword ptr [ebp+FFFFF168], 00000000
주소번지 :0669DFFF 의 jne 0669E05D 점프를 크랙하면 되겠지요.
~라고만 생각하면 오산입니다. 결과를 미리 얘기하면, 이 사용기간 만료화면을 그리는 부분은 이 곳을 포함해서 총 세군데입니다.
이것을 알아내는 데 많은 시행착오를 거쳤는데, 잘 보면 다 뻔히 보이는 것는데....
자!! 보시죠.....
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E356(C)
|
:0669DFF2 8D8D14F7FFFF lea ecx, dword ptr [ebp+FFFFF714]
:0669DFF8 E8C5550000 call 066A35C2
:0669DFFD 85C0 test eax, eax
:0669DFFF 0F8558000000 jne 0669E05D <--- 여기서 점프를 해야만 한다.
<--- 이 밑에 사용기간 만료 화면을 띄우는 부분이 있다.
:0669E005 6A00 push 00000000
:0669E007 8D8D28F3FFFF lea ecx, dword ptr [ebp+FFFFF328]
:0669E00D E8BF070000 call 0669E7D1
:0669E012 C645FC09 mov [ebp-04], 09
:0669E016 8D8D28F3FFFF lea ecx, dword ptr [ebp+FFFFF328]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E01C E8BF2E0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E021 C78568F1FFFF00000000 mov dword ptr [ebp+FFFFF168], 00000000
:0669E02B C645FC02 mov [ebp-04], 02
:0669E02F E8CE030000 call 0669E402
:0669E034 C645FC01 mov [ebp-04], 01
:0669E038 E819040000 call 0669E456
:0669E03D C645FC00 mov [ebp-04], 00
:0669E041 E81C040000 call 0669E462
:0669E046 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0669E04D E81C040000 call 0669E46E
:0669E052 8B8568F1FFFF mov eax, dword ptr [ebp+FFFFF168]
:0669E058 E927040000 jmp 0669E484
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669DFFF(C) <--- 여기로 점프가 도달한다.
|
:0669E05D 8D8D38F7FFFF lea ecx, dword ptr [ebp+FFFFF738]
:0669E063 E867040000 call 0669E4CF
:0669E068 50 push eax
:0669E069 8D8D14F7FFFF lea ecx, dword ptr [ebp+FFFFF714]
:0669E06F E84E550000 call 066A35C2
:0669E074 50 push eax
:0669E075 FFB534F7FFFF push dword ptr [ebp+FFFFF734]
:0669E07B E8AC5A0000 call 066A3B2C
:0669E080 83C40C add esp, 0000000C
:0669E083 898510F7FFFF mov dword ptr [ebp+FFFFF710], eax
:0669E089 83BD10F7FFFF00 cmp dword ptr [ebp+FFFFF710], 00000000
:0669E090 0F8565000000 jne 0669E0FB <--- 여기서 점프를 해야만 한다.
<--- 이 밑에 사용기간 만료 화면을 띄우는 부분이 있다.
:0669E096 6A00 push 00000000
:0669E098 8D8D14F7FFFF lea ecx, dword ptr [ebp+FFFFF714]
:0669E09E E85A550000 call 066A35FD
:0669E0A3 6A00 push 00000000
:0669E0A5 8D8DC8F2FFFF lea ecx, dword ptr [ebp+FFFFF2C8]
:0669E0AB E821070000 call 0669E7D1
:0669E0B0 C645FC0A mov [ebp-04], 0A
:0669E0B4 8D8DC8F2FFFF lea ecx, dword ptr [ebp+FFFFF2C8]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E0BA E8212E0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E0BF C78564F1FFFF00000000 mov dword ptr [ebp+FFFFF164], 00000000
:0669E0C9 C645FC02 mov [ebp-04], 02
:0669E0CD E824030000 call 0669E3F6
:0669E0D2 C645FC01 mov [ebp-04], 01
:0669E0D6 E87B030000 call 0669E456
:0669E0DB C645FC00 mov [ebp-04], 00
:0669E0DF E87E030000 call 0669E462
:0669E0E4 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0669E0EB E87E030000 call 0669E46E
:0669E0F0 8B8564F1FFFF mov eax, dword ptr [ebp+FFFFF164]
:0669E0F6 E989030000 jmp 0669E484
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E090(C) <--- 여기로 점프가 도달한다.
|
:0669E0FB 837D0800 cmp dword ptr [ebp+08], 00000000
:0669E0FF 0F844B010000 je 0669E250 <--- 여기서 점프를 해야만 한다.
:0669E105 FFB510F7FFFF push dword ptr [ebp+FFFFF710]
:0669E10B 6A00 push 00000000
:0669E10D 8D8D60F2FFFF lea ecx, dword ptr [ebp+FFFFF260]
:0669E113 E8E50A0000 call 0669EBFD
:0669E118 C645FC0B mov [ebp-04], 0B
:0669E11C 8D8D60F2FFFF lea ecx, dword ptr [ebp+FFFFF260]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E122 E8B92D0000 Call 066A0EE0 <---- 등록라이선스 동의화면 그리기 CALL
:0669E127 898538F1FFFF mov dword ptr [ebp+FFFFF138], eax
:0669E12D E9F1000000 jmp 0669E223
주소번지 :0669E0FF 의 je 0669E250 점프에서 무조건 점프시키면 다른 곳에서 좀 놀다가 다시 다음으로 또 옵니다.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E22A(C)
|
:0669E132 83BD10F7FFFF05 cmp dword ptr [ebp+FFFFF710], 00000005
:0669E139 0F8F2B000000 jg 0669E16A <--- 여기서 점프를 해야만 한다.
<--- 이 밑에 사용기간 만료화면을 띄우는 부분이 있다.
:0669E13F FFB510F7FFFF push dword ptr [ebp+FFFFF710]
:0669E145 6A00 push 00000000
:0669E147 8D8DF8F1FFFF lea ecx, dword ptr [ebp+FFFFF1F8]
:0669E14D E83C0D0000 call 0669EE8E
:0669E152 C645FC0C mov [ebp-04], 0C
:0669E156 8D8DF8F1FFFF lea ecx, dword ptr [ebp+FFFFF1F8]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E15C E87F2D0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E161 C645FC0B mov [ebp-04], 0B
:0669E165 E874020000 call 0669E3DE
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E139(C)
|
:0669E16A C78560F1FFFF01000000 mov dword ptr [ebp+FFFFF160], 00000001
:0669E174 C645FC02 mov [ebp-04], 02
:0669E178 E86D020000 call 0669E3EA
:0669E17D C645FC01 mov [ebp-04], 01
:0669E181 E8D0020000 call 0669E456
:0669E186 C645FC00 mov [ebp-04], 00
:0669E18A E8D3020000 call 0669E462
:0669E18F C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0669E196 E8D3020000 call 0669E46E
:0669E19B 8B8560F1FFFF mov eax, dword ptr [ebp+FFFFF160]
:0669E1A1 E9DE020000 jmp 0669E484
잘 보셨나요?? 총 네군데가 고쳐져야 합니다. 먼저 두 번의 사용기간 만료 검사를 실시하고, 등록라이선스 동의를 했는지 확인하고, 또다시 사용기간 만료를 검사합니다. CALL들을 보면 주소가 다 똑같지 않습니까? “ Call 066A0EE0 ”입니다.
마지막의 사용기간 만료 검사는 제 경우에는 동작하지 않았습니다. 항시 점프가 되던데... 그래도 무시하면 안되지요.
완벽한 크랙을 하려면, 네 부분을 모두 고친다.
먼저,
:0669DFFF 0F8558000000 jne 0669E05D 를
:0669DFFF 0F8458000000 je 0669E05D
또는, 안전하게
:0669DFFF EB5C jmp 0669E05D
:0669E001 F7D8 neg eax
:0669E003 F7D8 neg eax 로 고친다. [ Offset은 D3FFh ]
두번째,
:0669E090 0F8565000000 jne 0669E0FB를
:0669E090 0F8465000000 je 0669E0FB
또는, 안전하게
:0669E090 EB69 jmp 0669E0FB
:0669E092 F7D8 neg eax
:0669E094 F7D8 neg eax 로 고친다. [ Offset은 D490h ]
세 번째, 이미 설명한 대로
:0669E0FF 0F844B010000 je 0669E250 를
:0669E0FF E94C010000 jmp 0669E250
:0669E104 90 nop 로 바꿉니다. [ Offset은 D4FFh ]
네 번째,
:0669E139 0F8F2B000000 jg 0669E16A 를
:0669E139 EB2F jmp 0669E16A
:0669E13B F7D8 neg eax
:0669E13D F7D8 neg eax 로 바꿉니다. [ Offset은 D539h ]
이렇게 하면, 한글판 노턴 피씨애니훼얼??의 옷을 다 벗긴 것입니다.
하! 하! 하!
개봉박두!!! 완벽한 신기술~~~~~!!!!!
네 군데의 스물여덟 BYTE ! 너무 힘겹습니까?
한방에 모두 끝내는 법을 가르쳐 드리지요..
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E356(C)
|
:0669DFF2 8D8D14F7FFFF lea ecx, dword ptr [ebp+FFFFF714]
:0669DFF8 E8C5550000 call 066A35C2
:0669DFFD 85C0 test eax, eax
:0669DFFF 0F8558000000 jne 0669E05D
앞에서 크랙한 부분의 위로 올라가다 보면은, 점프가 있습니다. 그 곳으로 가보면,
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669DFED(U)
|
:0669E342 83BD3CF1FFFFFF cmp dword ptr [ebp+FFFFF13C], FFFFFFFF
:0669E349 0F8496FFFFFF je 0669E2E5
:0669E34F 83BD3CF1FFFF00 cmp dword ptr [ebp+FFFFF13C], 00000000
:0669E356 0F8496FCFFFF je 0669DFF2
:0669E35C 83BD3CF1FFFF01 cmp dword ptr [ebp+FFFFF13C], 00000001
:0669E363 0F841FFFFFFF je 0669E288
:0669E369 E900000000 jmp 0669E36E
바로 찾은 것 같다는 생각이 후두부를 치고 지나가고 있지 않습니까????
주소 [ebp+FFFFF13C] 에 날짜제한에 관한 정보로 값 0과 1로 저장하고 있음.
주소 :0669E356에서 점프를 하면은, 제한에 관한 모든 체크가 이루어지게 되므로, 당연히 여기서 점프가 안되고, 주소:0669E363에서 점프가 되어야 정상적인 실행이 됩니다.
크랙은
:0669E356 0F8496FCFFFF je 0669DFF2를
:0669E356 0F842CFFFFFF je 0669E288 로 고친다. [ Offset은 D758h ]
이렇게 하면, 제한이 되건 안되건 상관없이 정상적인 실행루틴으로 가서 동작합니다.
퀴즈??????
W32Dasm 으로 Awcomm32.dll을 Disassemble 해보면, 첫부분 EXPORTED FUNCTIONS 부분에 다음과 같은 내용이 보입니다.
Addr:06695518 Ord: 196 (00C4h) Name: _StrReplace@12
Addr:0669D910 Ord: 197 (00C5h) Name: _TimeBombCheck@4
Addr:066979F6 Ord: 198 (00C6h) Name: _TimedDspErr@24
_TimeBombCheck 라~~~, 함수 이름치고는 너무 리얼합니다.
각성하시오.
한국노턴 프로그램관계자 여러분~~~~~~~!!!!!
♤ 성가시게 구는 Nag 화면 없애기 ♤
프로그램 실행때마다 제일 먼저 등장해서 “PcAnywhere ver 8.0” 라고 그려지는 녀석을 없애보기로 합시다. 먼저 bpx Updatewindow로 브포를 잡고, 프로그램을 실행하면은 바로 소프트아이스가 뜹니다.
(※ 소프트아이스에서 bpx Updatewindow 명령을 준 뒤에 윈도우로 돌아오면은 가만이 있어도 브레이크가 계속 걸립니다. 왜냐면, Updatewindow함수는 화면을 갱신하는 것으로서 윈도우 운영체제는 계속해서 화면을 갱신하고 있기 때문입니다. 자! 어떻게 하면 우리가 원하는 Updatewindow함수에 브레이크를 걸 수 있을까요??? 먼저 윈도우 데스크탑에 Winaw32.exe의 단축키를 만듭니다. 그리고, 윈도우상의 다른 프로그램들을 다 종료시킵니다. 특히, 시계 프로그램 같은 것은 더더욱 종료시켜야 합니다. 다 종료시켰으면, 마우스로 윈도우 데스크탑의 빈 부분을 한 번 꼭 찍어주고 나서, 다음에 Winaw32.exe의 단축키를 마우스로 꼭 한번 찍어줍니다. 그러면, Winaw32.exe의 단축키가 색깔이 반전됩니다. 준비가 다 되었습니다. Ctrl+D 키를 눌러서 소프트아이스를 불러낸 뒤, 명령어 bpx Updatewindow를 친 뒤에 다시 Ctrl+D 키를 눌러서 윈도우 화면으로 돌아오면 Winaw32.exe의 단축키가 색깔이 반전된 채 기다리고 있지요. 이 때에 빨리 Enter키를 눌러주면 바로 우리가 원하는 Updatewindow함수에 브레이크를 걸립니다. 윈도우 화면에 그림이 그려질려고 하는 모양이 보이시지요.)
F11 키를 한번 눌러주면은 Winaw32.exe 파일안에서 다음과 같은 코드를 볼 수 있습니다.
* Referenced by a CALL at Address:
|:00406EAA
|
:00407485 B83A754000 mov eax, 0040753A
* Reference To: MSVCRT._EH_prolog, Ord:0042h
|
:0040748A E835B80300 Call 00442CC4
:0040748F 83EC10 sub esp, 00000010
:00407492 53 push ebx
:00407493 56 push esi
:00407494 57 push edi
:00407495 894DE4 mov dword ptr [ebp-1C], ecx
* Possible Reference to Dialog: DialogID_7801, CONTROL_ID:0064, ""
|
:00407498 6A64 push 00000064
* Reference To: MFC42.Ordinal:0337, Ord:0337h
|
:0040749A E8FB3B0000 Call 0040B09A
:0040749F 83C404 add esp, 00000004
:004074A2 8945F0 mov dword ptr [ebp-10], eax
:004074A5 E900000000 jmp 004074AA
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004074A5(U)
|
:004074AA C745FC00000000 mov [ebp-04], 00000000
:004074B1 837DF000 cmp dword ptr [ebp-10], 00000000
:004074B5 0F8410000000 je 004074CB
:004074BB 8B4DF0 mov ecx, dword ptr [ebp-10]
:004074BE E830120000 call 004086F3
:004074C3 8945EC mov dword ptr [ebp-14], eax
:004074C6 E907000000 jmp 004074D2
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004074B5(C)
|
:004074CB C745EC00000000 mov [ebp-14], 00000000
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004074C6(U)
|
:004074D2 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:004074D9 8B45EC mov eax, dword ptr [ebp-14]
:004074DC 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004074DF 898114010000 mov dword ptr [ecx+00000114], eax
:004074E5 8B45E4 mov eax, dword ptr [ebp-1C]
:004074E8 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004074EB 8B8914010000 mov ecx, dword ptr [ecx+00000114]
:004074F1 8B11 mov edx, dword ptr [ecx]
:004074F3 8B8814010000 mov ecx, dword ptr [eax+00000114]
:004074F9 FF92C0000000 call dword ptr [edx+000000C0]
:004074FF 6A05 push 00000005
:00407501 8B45E4 mov eax, dword ptr [ebp-1C]
:00407504 8B8814010000 mov ecx, dword ptr [eax+00000114]
* Reference To: MFC42.Ordinal:1847, Ord:1847h
|
:0040750A E805400000 Call 0040B514
:0040750F 8B45E4 mov eax, dword ptr [ebp-1C]
:00407512 8B8014010000 mov eax, dword ptr [eax+00000114]
:00407518 8945E8 mov dword ptr [ebp-18], eax
:0040751B 8B45E8 mov eax, dword ptr [ebp-18]
:0040751E FF7020 push [eax+20]
* Reference To: USER32.UpdateWindow, Ord:0251h
|
:00407521 FF15F83D4900 Call dword ptr [00493DF8] <--- Nag 화면 Update Call 루틴
:00407527 E900000000 jmp 0040752C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407527(U)
|
:0040752C E913000000 jmp 00407544
:00407531 FF75F0 push [ebp-10]
:00407534 E895A1FFFF call 004016CE
:00407539 C3 ret
이 루틴을 불러내는 부분을 찾아가 보면 다음과 같습니다.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406E79(U)
|
:00406E7E 8B8504F7FFFF mov eax, dword ptr [ebp+FFFFF704]
:00406E84 F6801C01000004 test byte ptr [eax+0000011C], 04
:00406E8B 0F851E000000 jne 00406EAF
:00406E91 8B8D04F7FFFF mov ecx, dword ptr [ebp+FFFFF704]
:00406E97 E848050000 call 004073E4
:00406E9C 85C0 test eax, eax
:00406E9E 0F840B000000 je 00406EAF
:00406EA4 8B8D04F7FFFF mov ecx, dword ptr [ebp+FFFFF704]
:00406EAA E8D6050000 call 00407485 <--- Nag 화면을 그리는 Call
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00406E8B(C), :00406E9E(C)
|
:00406EAF C7852CF7FFFF00000000 mov dword ptr [ebp+FFFFF72C], 00000000
:00406EB9 E900000000 jmp 00406EBE
Nag 화면을 그리는 Call 루틴을 넘어가는 점프가 바로 앞에 있습니다.
주소:00406E9E의 je 00406EAF 명령어입니다.
이 부분을 이렇게 바꿉니다.
:00406E9E 0F840B000000 je 00406EAF를
:00406E9E EB0F jmp 00406EAF
:00406EA0 F7D8 neg eax
:00406EA2 F7D8 neg eax 로 바꿉니다. [ Offset은 629Eh ]
Tools required
Soft-Ice 3.2 ( 3.2 이후의 어떤버전이든 상관없음.)
W32Dasm (any version should do, 8.93버전을 사용하면 더욱 좋음.)
An hexeditor ( 나는 UltraEdit 6.00a를 사용함. 어떤 거든지 상관없음, 본인이 쓰기에 편하기만 하면 됨.)
Target
PcAnywhere ver 8.0
Name : Winaw32.exe Size : 664,576 Bytes
Name : Awcomm32.dll Size : 128,512 Bytes
Program Location :
1. 통신망에 가면, 한국 Symantec에서 Trial버전을 배포하고 있음. 천리안은 go norton..
2. 개인적으로 용산전자상가의 프로그램 판매장에 들러서, 아가씨에게 Trial버전을 달라고 사정하면
CD를 얻을 수 있음. 아가씨를 잘 구슬르지 못하면, 포기하기 바람....
About this Protection system
한글판 PcAnywhere ver 8.0은 전형적인 30일 Trial Protection을 가지고 있습니다. 제가 확인한 바로는 미국꺼랑은 Protection이 틀립니다. 미국꺼는 무지 어렵게 되어 있는데.... 한국 노턴의 프로그래밍 실력이 별로라는 것을 보여주는 것입니다.
모든 비밀은 Awcomm32.dll 안에 들어 있습니다.
The Crack Essay
먼저 프로그램을 실행시키면, 등록라이선스 동의화면이 나옵니다. 이 때 Ctrl+D를 눌러서 소프트아이스를 불러낸 뒤, 명령어
hwnd
라고 치면, 다음과 같은 Text들이 나열되는 것이 보일 것입니다.
여기 출력되는 값은 컴퓨터마다 또한 실행할 때마다 틀립니다.
Window-Handle
hQueue
SZ
QOwner
Class-Name
Window-Procedure
0080 (0)
2057
32
MSGSVR32
#32711 (switch_win)
17EF:00004B6E
0084 (1)
2057
32
EXPLORER
shell_trayWnd
1487:0000016C
........
Enter키를 누르면, 한 줄씩 넘어가고, Space키를 누르면 명령어블럭의 한 화면씩 넘어갑니다. QOWNER[Program Name] 에 주의하면서,
Space키를 눌러가다 보면은 다음과 같은 부분이 보일 것입니다.
Window-Handle
hQueue
SZ
QOwner
Class-Name
Window-Procedure
0C18(1)
1A6F
32
WINAW32
IMEKR98U_MAIN
137F:0000012A
0B94 (1)
1A6F
32
WINAW32
IME
176F:00000000
0B9C (1)
1A6F
32
WINAW32
#32770 (Dialog)
1487:0000104A
0BA0 (2)
1A6F
32
WINAW32
Button
176F:000035CC
0BA4 (2)
1A6F
32
WINAW32
Button
176F:000035CC
0BA8 (2)
1A6F
32
WINAW32
Button
176F:000035CC
0BAC (2)
1A6F
32
WINAW32
Static
176F:0000828E
0BAF (2)
1A6F
32
WINAW32
Static
176F:0000828E
............
우리가 원하는 내용이 보였습니다. 바로 QOwner 가 WINAW32 이고, Class-Name이 #32770 (Dialog) 이며, Window-Handle이 0B9C 입니다. 그러나, 위 표에 보이는 값은 어디까지나 제 컴에서 실행했을 때 값입니다. 여러분은 여러분이 실행한 컴퓨터에서의 값을 기억해야 합니다.
우리가 추적을 원하는 메시지박스의 Window-Handle를 알아냈으므로, 우리는 BMSG command를 이용할 것입니다.
BMSG 는 메시지 브레이크를 거는 것입니다.
소프트아이스 명령윈도우에서 다음과 같이 칩니다.
BMSG 0B9C WM_DESTROY
다시 한번 말하지만, Window-Handle값 0B9C 는 여러분 컴퓨터에서 출력된 값을 써야 합니다.
그리고, 다른 브레이크포인트는 다 해제하십시오. 준비가 되었습니까??
그러면, Ctrl+D를 눌러서 프로그램을 실행시키고, 버튼을 누르면.....
짤까닥! 브레이크가 걸립니다. 여러분은 아마 USER.DLL 내부에 있을 것입니다. 정확히 얘기하면 DestroyWindow 함수입니다. 여기서 F12키를 천천히 누르면서, Awcomm32.dll 코드내부로 들어갑니다. ( 어떻게 Awcomm32.dll 코드내부인지를 아느냐면은 주소번지가 xxxx:0669Exxx 식입니다. W32Dasm 으로 disassemble 해보면 압니다. ) 바로 다음과 같은 부분입니다.
:0669E122 E8B92D0000 Call 066A0EE0
:0669E127 898538F1FFFF mov dword ptr [ebp+FFFFF138], eax <---- 우리가 도달한 곳
:0669E12D E9F1000000 jmp 0669E223
아하! 그렇습니다. 주소번지:0669E122 의 Call 066A0EE0 은 등록라이선스 동의화면을 띄우는 함수 CALL입니다. 자 이곳으로 오는 점프를 찾읍시다.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E090(C)
|
:0669E0FB 837D0800 cmp dword ptr [ebp+08], 00000000
:0669E0FF 0F844B010000 je 0669E250 <---- 등록라이선스 동의화면 그리기를 뛰어넘는 점프
:0669E105 FFB510F7FFFF push dword ptr [ebp+FFFFF710]
:0669E10B 6A00 push 00000000
:0669E10D 8D8D60F2FFFF lea ecx, dword ptr [ebp+FFFFF260]
:0669E113 E8E50A0000 call 0669EBFD
:0669E118 C645FC0B mov [ebp-04], 0B
:0669E11C 8D8D60F2FFFF lea ecx, dword ptr [ebp+FFFFF260]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E122 E8B92D0000 Call 066A0EE0 <---- 등록라이선스 동의 화면 그리기
:0669E127 898538F1FFFF mov dword ptr [ebp+FFFFF138], eax <---- 우리가 도달한 곳
:0669E12D E9F1000000 jmp 0669E223
바로 있습니다. 주소번지 :0669E0FF 의 je 0669E250 점프입니다. 여기서 무조건 점프를 하면 등록라이선스 동의화면은 나오지 않을 것입니다.
어떻게 하느냐면,
:0669E0FF 0F844B010000 je 0669E250 를
:0669E0FF E94C010000 jmp 0669E250
:0669E104 90 nop 로 바꿉니다. [ Offset은 D4FFh ]
여러분, 30일동안은 등록라이선스 동의화면이 없어서 좋았겠지만, 30일이 지나면, 사용기간이 만료됬다는 Nag화면이 뜹니다. 그리고는, 영원히 프로그램을 볼 수 없을지도 모릅니다. 어허, 전에 크랙한 화면이랑 비슷하지만, 버튼이 하나밖에 없습니다. 걱정하지 마세요. 저번이랑 똑같이 크랙하면 됩니다.
프로그램을 실행시키고, 사용기간 만료화면이 나옵니다. 이 때 Ctrl+D를 눌러서 소프트아이스를 불러낸 뒤, 명령어
hwnd
라고 치고, 우리가 원하는 부분까지 Space키를 누르면 다음과 같이 보일 것입니다.
Window-Handle
hQueue
SZ
QOwner
Class-Name
Window-Procedure
0F54(1)
1A6F
32
WINAW32
IMEKR98U_MAIN
137F:0000012A
0174 (1)
1A6F
32
WINAW32
IME
176F:00000000
0F48 (1)
1A6F
32
WINAW32
#32770 (Dialog)
19CF:0000072E
0F50 (2)
1A6F
32
WINAW32
Button
176F:000035CC
0F60 (2)
1A6F
32
WINAW32
Static
176F:0000828E
0F5C (2)
1A6F
32
WINAW32
Static
176F:0000828E
0F64 (2)
1A6F
32
WINAW32
Static
176F:0000828E
............
우리가 원하는 내용이 보였습니다. 바로 QOwner 가 WINAW32 이고, Class-Name이 #32770 (Dialog) 이며, Window-Handle이 0F48 입니다. 그러나, 위 표에 보이는 값은 어디까지나 제 컴에서 실행했을 때 값입니다. 여러분은 여러분이 실행한 컴퓨터에서의 값을 기억해야 합니다.
소프트아이스 명령윈도우에서 다음과 같이 칩니다.
BMSG 0F48 WM_DESTROY
다시 한번 말하지만, Window-Handle값 0F48 는 여러분 컴퓨터에서 출력된 값을 써야 합니다.
그리고, 다른 브레이크포인트는 다 해제하십시오. 준비가 되었습니까??
그러면, Ctrl+D를 눌러서 프로그램을 실행시키고, 버튼을 누르면.....
짤까닥! 브레이크가 걸립니다. 여러분은 아마 USER.DLL 내부에 있을 것입니다. 정확히 얘기하면 DestroyWindow 함수입니다. 여기서 F12키를 천천히 누르면서, Awcomm32.dll 코드내부로 들어갑니다. ( 어떻게 Awcomm32.dll 코드내부인지를 아느냐면은 주소번지가 xxxx:0669Exxx 식입니다. W32Dasm 으로 disassemble 해보면 압니다. ) 바로 다음과 같은 부분입니다.
:0669E01C E8BF2E0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E021 C78568F1FFFF00000000 mov dword ptr [ebp+FFFFF168], 00000000 <---- 우리가 도달한 곳
아하! 또 찾았습니다. 윗부분의 점프를 찾으면.
0669DFFD 85C0 test eax, eax
:0669DFFF 0F8558000000 jne 0669E05D <--- 여기서 점프를 해야만 한다.
:0669E005 6A00 push 00000000
:0669E007 8D8D28F3FFFF lea ecx, dword ptr [ebp+FFFFF328]
:0669E00D E8BF070000 call 0669E7D1
:0669E012 C645FC09 mov [ebp-04], 09
:0669E016 8D8D28F3FFFF lea ecx, dword ptr [ebp+FFFFF328]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E01C E8BF2E0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E021 C78568F1FFFF00000000 mov dword ptr [ebp+FFFFF168], 00000000
주소번지 :0669DFFF 의 jne 0669E05D 점프를 크랙하면 되겠지요.
~라고만 생각하면 오산입니다. 결과를 미리 얘기하면, 이 사용기간 만료화면을 그리는 부분은 이 곳을 포함해서 총 세군데입니다.
이것을 알아내는 데 많은 시행착오를 거쳤는데, 잘 보면 다 뻔히 보이는 것는데....
자!! 보시죠.....
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E356(C)
|
:0669DFF2 8D8D14F7FFFF lea ecx, dword ptr [ebp+FFFFF714]
:0669DFF8 E8C5550000 call 066A35C2
:0669DFFD 85C0 test eax, eax
:0669DFFF 0F8558000000 jne 0669E05D <--- 여기서 점프를 해야만 한다.
<--- 이 밑에 사용기간 만료 화면을 띄우는 부분이 있다.
:0669E005 6A00 push 00000000
:0669E007 8D8D28F3FFFF lea ecx, dword ptr [ebp+FFFFF328]
:0669E00D E8BF070000 call 0669E7D1
:0669E012 C645FC09 mov [ebp-04], 09
:0669E016 8D8D28F3FFFF lea ecx, dword ptr [ebp+FFFFF328]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E01C E8BF2E0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E021 C78568F1FFFF00000000 mov dword ptr [ebp+FFFFF168], 00000000
:0669E02B C645FC02 mov [ebp-04], 02
:0669E02F E8CE030000 call 0669E402
:0669E034 C645FC01 mov [ebp-04], 01
:0669E038 E819040000 call 0669E456
:0669E03D C645FC00 mov [ebp-04], 00
:0669E041 E81C040000 call 0669E462
:0669E046 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0669E04D E81C040000 call 0669E46E
:0669E052 8B8568F1FFFF mov eax, dword ptr [ebp+FFFFF168]
:0669E058 E927040000 jmp 0669E484
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669DFFF(C) <--- 여기로 점프가 도달한다.
|
:0669E05D 8D8D38F7FFFF lea ecx, dword ptr [ebp+FFFFF738]
:0669E063 E867040000 call 0669E4CF
:0669E068 50 push eax
:0669E069 8D8D14F7FFFF lea ecx, dword ptr [ebp+FFFFF714]
:0669E06F E84E550000 call 066A35C2
:0669E074 50 push eax
:0669E075 FFB534F7FFFF push dword ptr [ebp+FFFFF734]
:0669E07B E8AC5A0000 call 066A3B2C
:0669E080 83C40C add esp, 0000000C
:0669E083 898510F7FFFF mov dword ptr [ebp+FFFFF710], eax
:0669E089 83BD10F7FFFF00 cmp dword ptr [ebp+FFFFF710], 00000000
:0669E090 0F8565000000 jne 0669E0FB <--- 여기서 점프를 해야만 한다.
<--- 이 밑에 사용기간 만료 화면을 띄우는 부분이 있다.
:0669E096 6A00 push 00000000
:0669E098 8D8D14F7FFFF lea ecx, dword ptr [ebp+FFFFF714]
:0669E09E E85A550000 call 066A35FD
:0669E0A3 6A00 push 00000000
:0669E0A5 8D8DC8F2FFFF lea ecx, dword ptr [ebp+FFFFF2C8]
:0669E0AB E821070000 call 0669E7D1
:0669E0B0 C645FC0A mov [ebp-04], 0A
:0669E0B4 8D8DC8F2FFFF lea ecx, dword ptr [ebp+FFFFF2C8]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E0BA E8212E0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E0BF C78564F1FFFF00000000 mov dword ptr [ebp+FFFFF164], 00000000
:0669E0C9 C645FC02 mov [ebp-04], 02
:0669E0CD E824030000 call 0669E3F6
:0669E0D2 C645FC01 mov [ebp-04], 01
:0669E0D6 E87B030000 call 0669E456
:0669E0DB C645FC00 mov [ebp-04], 00
:0669E0DF E87E030000 call 0669E462
:0669E0E4 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0669E0EB E87E030000 call 0669E46E
:0669E0F0 8B8564F1FFFF mov eax, dword ptr [ebp+FFFFF164]
:0669E0F6 E989030000 jmp 0669E484
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E090(C) <--- 여기로 점프가 도달한다.
|
:0669E0FB 837D0800 cmp dword ptr [ebp+08], 00000000
:0669E0FF 0F844B010000 je 0669E250 <--- 여기서 점프를 해야만 한다.
:0669E105 FFB510F7FFFF push dword ptr [ebp+FFFFF710]
:0669E10B 6A00 push 00000000
:0669E10D 8D8D60F2FFFF lea ecx, dword ptr [ebp+FFFFF260]
:0669E113 E8E50A0000 call 0669EBFD
:0669E118 C645FC0B mov [ebp-04], 0B
:0669E11C 8D8D60F2FFFF lea ecx, dword ptr [ebp+FFFFF260]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E122 E8B92D0000 Call 066A0EE0 <---- 등록라이선스 동의화면 그리기 CALL
:0669E127 898538F1FFFF mov dword ptr [ebp+FFFFF138], eax
:0669E12D E9F1000000 jmp 0669E223
주소번지 :0669E0FF 의 je 0669E250 점프에서 무조건 점프시키면 다른 곳에서 좀 놀다가 다시 다음으로 또 옵니다.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E22A(C)
|
:0669E132 83BD10F7FFFF05 cmp dword ptr [ebp+FFFFF710], 00000005
:0669E139 0F8F2B000000 jg 0669E16A <--- 여기서 점프를 해야만 한다.
<--- 이 밑에 사용기간 만료화면을 띄우는 부분이 있다.
:0669E13F FFB510F7FFFF push dword ptr [ebp+FFFFF710]
:0669E145 6A00 push 00000000
:0669E147 8D8DF8F1FFFF lea ecx, dword ptr [ebp+FFFFF1F8]
:0669E14D E83C0D0000 call 0669EE8E
:0669E152 C645FC0C mov [ebp-04], 0C
:0669E156 8D8DF8F1FFFF lea ecx, dword ptr [ebp+FFFFF1F8]
* Reference To: MFC42.Ordinal:09D2, Ord:09D2h
|
:0669E15C E87F2D0000 Call 066A0EE0 <---- 사용기간 만료화면 그리기 CALL
:0669E161 C645FC0B mov [ebp-04], 0B
:0669E165 E874020000 call 0669E3DE
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E139(C)
|
:0669E16A C78560F1FFFF01000000 mov dword ptr [ebp+FFFFF160], 00000001
:0669E174 C645FC02 mov [ebp-04], 02
:0669E178 E86D020000 call 0669E3EA
:0669E17D C645FC01 mov [ebp-04], 01
:0669E181 E8D0020000 call 0669E456
:0669E186 C645FC00 mov [ebp-04], 00
:0669E18A E8D3020000 call 0669E462
:0669E18F C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:0669E196 E8D3020000 call 0669E46E
:0669E19B 8B8560F1FFFF mov eax, dword ptr [ebp+FFFFF160]
:0669E1A1 E9DE020000 jmp 0669E484
잘 보셨나요?? 총 네군데가 고쳐져야 합니다. 먼저 두 번의 사용기간 만료 검사를 실시하고, 등록라이선스 동의를 했는지 확인하고, 또다시 사용기간 만료를 검사합니다. CALL들을 보면 주소가 다 똑같지 않습니까? “ Call 066A0EE0 ”입니다.
마지막의 사용기간 만료 검사는 제 경우에는 동작하지 않았습니다. 항시 점프가 되던데... 그래도 무시하면 안되지요.
완벽한 크랙을 하려면, 네 부분을 모두 고친다.
먼저,
:0669DFFF 0F8558000000 jne 0669E05D 를
:0669DFFF 0F8458000000 je 0669E05D
또는, 안전하게
:0669DFFF EB5C jmp 0669E05D
:0669E001 F7D8 neg eax
:0669E003 F7D8 neg eax 로 고친다. [ Offset은 D3FFh ]
두번째,
:0669E090 0F8565000000 jne 0669E0FB를
:0669E090 0F8465000000 je 0669E0FB
또는, 안전하게
:0669E090 EB69 jmp 0669E0FB
:0669E092 F7D8 neg eax
:0669E094 F7D8 neg eax 로 고친다. [ Offset은 D490h ]
세 번째, 이미 설명한 대로
:0669E0FF 0F844B010000 je 0669E250 를
:0669E0FF E94C010000 jmp 0669E250
:0669E104 90 nop 로 바꿉니다. [ Offset은 D4FFh ]
네 번째,
:0669E139 0F8F2B000000 jg 0669E16A 를
:0669E139 EB2F jmp 0669E16A
:0669E13B F7D8 neg eax
:0669E13D F7D8 neg eax 로 바꿉니다. [ Offset은 D539h ]
이렇게 하면, 한글판 노턴 피씨애니훼얼??의 옷을 다 벗긴 것입니다.
하! 하! 하!
개봉박두!!! 완벽한 신기술~~~~~!!!!!
네 군데의 스물여덟 BYTE ! 너무 힘겹습니까?
한방에 모두 끝내는 법을 가르쳐 드리지요..
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669E356(C)
|
:0669DFF2 8D8D14F7FFFF lea ecx, dword ptr [ebp+FFFFF714]
:0669DFF8 E8C5550000 call 066A35C2
:0669DFFD 85C0 test eax, eax
:0669DFFF 0F8558000000 jne 0669E05D
앞에서 크랙한 부분의 위로 올라가다 보면은, 점프가 있습니다. 그 곳으로 가보면,
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0669DFED(U)
|
:0669E342 83BD3CF1FFFFFF cmp dword ptr [ebp+FFFFF13C], FFFFFFFF
:0669E349 0F8496FFFFFF je 0669E2E5
:0669E34F 83BD3CF1FFFF00 cmp dword ptr [ebp+FFFFF13C], 00000000
:0669E356 0F8496FCFFFF je 0669DFF2
:0669E35C 83BD3CF1FFFF01 cmp dword ptr [ebp+FFFFF13C], 00000001
:0669E363 0F841FFFFFFF je 0669E288
:0669E369 E900000000 jmp 0669E36E
바로 찾은 것 같다는 생각이 후두부를 치고 지나가고 있지 않습니까????
주소 [ebp+FFFFF13C] 에 날짜제한에 관한 정보로 값 0과 1로 저장하고 있음.
주소 :0669E356에서 점프를 하면은, 제한에 관한 모든 체크가 이루어지게 되므로, 당연히 여기서 점프가 안되고, 주소:0669E363에서 점프가 되어야 정상적인 실행이 됩니다.
크랙은
:0669E356 0F8496FCFFFF je 0669DFF2를
:0669E356 0F842CFFFFFF je 0669E288 로 고친다. [ Offset은 D758h ]
이렇게 하면, 제한이 되건 안되건 상관없이 정상적인 실행루틴으로 가서 동작합니다.
퀴즈??????
W32Dasm 으로 Awcomm32.dll을 Disassemble 해보면, 첫부분 EXPORTED FUNCTIONS 부분에 다음과 같은 내용이 보입니다.
Addr:06695518 Ord: 196 (00C4h) Name: _StrReplace@12
Addr:0669D910 Ord: 197 (00C5h) Name: _TimeBombCheck@4
Addr:066979F6 Ord: 198 (00C6h) Name: _TimedDspErr@24
_TimeBombCheck 라~~~, 함수 이름치고는 너무 리얼합니다.
각성하시오.
한국노턴 프로그램관계자 여러분~~~~~~~!!!!!
♤ 성가시게 구는 Nag 화면 없애기 ♤
프로그램 실행때마다 제일 먼저 등장해서 “PcAnywhere ver 8.0” 라고 그려지는 녀석을 없애보기로 합시다. 먼저 bpx Updatewindow로 브포를 잡고, 프로그램을 실행하면은 바로 소프트아이스가 뜹니다.
(※ 소프트아이스에서 bpx Updatewindow 명령을 준 뒤에 윈도우로 돌아오면은 가만이 있어도 브레이크가 계속 걸립니다. 왜냐면, Updatewindow함수는 화면을 갱신하는 것으로서 윈도우 운영체제는 계속해서 화면을 갱신하고 있기 때문입니다. 자! 어떻게 하면 우리가 원하는 Updatewindow함수에 브레이크를 걸 수 있을까요??? 먼저 윈도우 데스크탑에 Winaw32.exe의 단축키를 만듭니다. 그리고, 윈도우상의 다른 프로그램들을 다 종료시킵니다. 특히, 시계 프로그램 같은 것은 더더욱 종료시켜야 합니다. 다 종료시켰으면, 마우스로 윈도우 데스크탑의 빈 부분을 한 번 꼭 찍어주고 나서, 다음에 Winaw32.exe의 단축키를 마우스로 꼭 한번 찍어줍니다. 그러면, Winaw32.exe의 단축키가 색깔이 반전됩니다. 준비가 다 되었습니다. Ctrl+D 키를 눌러서 소프트아이스를 불러낸 뒤, 명령어 bpx Updatewindow를 친 뒤에 다시 Ctrl+D 키를 눌러서 윈도우 화면으로 돌아오면 Winaw32.exe의 단축키가 색깔이 반전된 채 기다리고 있지요. 이 때에 빨리 Enter키를 눌러주면 바로 우리가 원하는 Updatewindow함수에 브레이크를 걸립니다. 윈도우 화면에 그림이 그려질려고 하는 모양이 보이시지요.)
F11 키를 한번 눌러주면은 Winaw32.exe 파일안에서 다음과 같은 코드를 볼 수 있습니다.
* Referenced by a CALL at Address:
|:00406EAA
|
:00407485 B83A754000 mov eax, 0040753A
* Reference To: MSVCRT._EH_prolog, Ord:0042h
|
:0040748A E835B80300 Call 00442CC4
:0040748F 83EC10 sub esp, 00000010
:00407492 53 push ebx
:00407493 56 push esi
:00407494 57 push edi
:00407495 894DE4 mov dword ptr [ebp-1C], ecx
* Possible Reference to Dialog: DialogID_7801, CONTROL_ID:0064, ""
|
:00407498 6A64 push 00000064
* Reference To: MFC42.Ordinal:0337, Ord:0337h
|
:0040749A E8FB3B0000 Call 0040B09A
:0040749F 83C404 add esp, 00000004
:004074A2 8945F0 mov dword ptr [ebp-10], eax
:004074A5 E900000000 jmp 004074AA
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004074A5(U)
|
:004074AA C745FC00000000 mov [ebp-04], 00000000
:004074B1 837DF000 cmp dword ptr [ebp-10], 00000000
:004074B5 0F8410000000 je 004074CB
:004074BB 8B4DF0 mov ecx, dword ptr [ebp-10]
:004074BE E830120000 call 004086F3
:004074C3 8945EC mov dword ptr [ebp-14], eax
:004074C6 E907000000 jmp 004074D2
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004074B5(C)
|
:004074CB C745EC00000000 mov [ebp-14], 00000000
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004074C6(U)
|
:004074D2 C745FCFFFFFFFF mov [ebp-04], FFFFFFFF
:004074D9 8B45EC mov eax, dword ptr [ebp-14]
:004074DC 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004074DF 898114010000 mov dword ptr [ecx+00000114], eax
:004074E5 8B45E4 mov eax, dword ptr [ebp-1C]
:004074E8 8B4DE4 mov ecx, dword ptr [ebp-1C]
:004074EB 8B8914010000 mov ecx, dword ptr [ecx+00000114]
:004074F1 8B11 mov edx, dword ptr [ecx]
:004074F3 8B8814010000 mov ecx, dword ptr [eax+00000114]
:004074F9 FF92C0000000 call dword ptr [edx+000000C0]
:004074FF 6A05 push 00000005
:00407501 8B45E4 mov eax, dword ptr [ebp-1C]
:00407504 8B8814010000 mov ecx, dword ptr [eax+00000114]
* Reference To: MFC42.Ordinal:1847, Ord:1847h
|
:0040750A E805400000 Call 0040B514
:0040750F 8B45E4 mov eax, dword ptr [ebp-1C]
:00407512 8B8014010000 mov eax, dword ptr [eax+00000114]
:00407518 8945E8 mov dword ptr [ebp-18], eax
:0040751B 8B45E8 mov eax, dword ptr [ebp-18]
:0040751E FF7020 push [eax+20]
* Reference To: USER32.UpdateWindow, Ord:0251h
|
:00407521 FF15F83D4900 Call dword ptr [00493DF8] <--- Nag 화면 Update Call 루틴
:00407527 E900000000 jmp 0040752C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407527(U)
|
:0040752C E913000000 jmp 00407544
:00407531 FF75F0 push [ebp-10]
:00407534 E895A1FFFF call 004016CE
:00407539 C3 ret
이 루틴을 불러내는 부분을 찾아가 보면 다음과 같습니다.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00406E79(U)
|
:00406E7E 8B8504F7FFFF mov eax, dword ptr [ebp+FFFFF704]
:00406E84 F6801C01000004 test byte ptr [eax+0000011C], 04
:00406E8B 0F851E000000 jne 00406EAF
:00406E91 8B8D04F7FFFF mov ecx, dword ptr [ebp+FFFFF704]
:00406E97 E848050000 call 004073E4
:00406E9C 85C0 test eax, eax
:00406E9E 0F840B000000 je 00406EAF
:00406EA4 8B8D04F7FFFF mov ecx, dword ptr [ebp+FFFFF704]
:00406EAA E8D6050000 call 00407485 <--- Nag 화면을 그리는 Call
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00406E8B(C), :00406E9E(C)
|
:00406EAF C7852CF7FFFF00000000 mov dword ptr [ebp+FFFFF72C], 00000000
:00406EB9 E900000000 jmp 00406EBE
Nag 화면을 그리는 Call 루틴을 넘어가는 점프가 바로 앞에 있습니다.
주소:00406E9E의 je 00406EAF 명령어입니다.
이 부분을 이렇게 바꿉니다.
:00406E9E 0F840B000000 je 00406EAF를
:00406E9E EB0F jmp 00406EAF
:00406EA0 F7D8 neg eax
:00406EA2 F7D8 neg eax 로 바꿉니다. [ Offset은 629Eh ]
관련링크
댓글목록
등록된 댓글이 없습니다.