티스토리 뷰

이번 글 에서는 델파이 디컴파일러인..
DeDe를 이용하여 델파이로 만들어진 프로그램을
크렉하는 방법에 대하여 알아 보겠습니다.
먼저 대상 프로그램을 키시면 등록 하라는 메시지가 나오는데
그건 뒷부분에서 크렉하도록 하고 우선 "Continue Unregistered"
버튼을 눌러 넘어 가도록 합시다. Icon Grabber는 정식등록을
하지 않았을떄 몇가지 문제가 있는데...[정확히 몇개인지는 모름~:p]
첫번쨰는 사용할수 있는 횟수에 제한이 있다는 것이고...
두번쨰는 Icon을 Scan할떄 100개 까지만 보여준다는 것이며...
세번쨰는 Scan 할때마다 메시지 박스를 보고 OK버튼을 눌러줘야 한다는 점이며
네번쨰는 Save All을 할떄 한개 저장할떄마다 OK버튼을 눌러줘야 한다는 겁니다.
정말 사악한 프로그래머군요. 이래서 사용해 먹겠나요....
한개씩 패치해주도록 합시다. 첫번쨰 패치 할것은.....Scan 할떄
'The unregistered copy of Icon Grabber only can extract up to 100 icons
once and you only can use it for up to 30 times.'
라는 메시지 박스를 안나오게 하도록 해보죠.
DeDe를 이용해서 Icon Grabber를 불러온후 프로세스 버튼을 누릅시다.


불러오다 보면 메시지 박스가 두번 나오는데 전부 OK 눌러 주시면 됩니다.
DeDe로 대상 파일을 불러오는것이 완료 됬다면 이제 메뉴에서
Form 버튼을 눌러 대상 파일에 있는 Form을 보도록 하죠.


폼을 더블 클릭하면 폼을 우리는에 보여줌으로 첫번쨰 부터 한개씩
더블클릭하며 메인폼을 찾아 보죠. 찾았나요??????
저는 찾았습니다. TFormIconGrabber메인폼이군요.
우리가 찾을 버튼은 밑의 그림에서 보이는 돋보기에
EXE란 글자가 쓰여 있는 버튼 입니다.


TFormIconGrabber버튼중 Hint 값이 Start 인 버튼을 찾으면 되는 겁니다.


저는 그리 어렵지 않게 해당 버튼을 찾을수 있었습니다.
보면 OnClicktbtSearchClick 이라고 되있군요.
"tbtSearchClick" 을 잘 기억해 두시기 바랍니다.
이제 DeDe 메뉴중 "Procedures" 버튼을 누릅니다.
그럼 해당 객체들에 대한 동작(?) 들을 볼수 있는데


왼쪽 메뉴에서는 클레스네임중 "TFormIconGrabber" 을 클릭해주시면 됩니다.
이제 오른쪽에 나타난 메뉴에서 "tbtSearchClick" 찾아 보죠
중간쯤에 있는데 찾았다면 마우스 오른쪽 버튼으로 클릭하면 뜨는 메뉴중
역어셈블 메뉴를 눌러 해당 Proc에 대한 역어셈블된 코드를 띄웁니다.



이제 DeDe 역어셈블러의 메뉴중 첫번쨰 버튼을 눌러 찾기 창을 띄운후
아까 보았던 메시지를 검색 하도록 해보죠.


보다시피 MessageBox 같은 WIndows API는 전혀 보이지 않습니다.
왜냐구요? 이건 DelPhi로 만들어진 프로그램이기 떄문에...
MessageBoxA 함수대신 DelPhi 내부 함수를 사용합니다.
DelPhi 프로그램은 인자전달에도 일반적인... VC 프로그램 처럼
PUSH로 하는것이 아니라 레지스터를 통해서 전달하는듯 하더군요
우리는 이 메시지 박스를 안띄우기 위해서 529C0C 부터 529C17을
HexEditor를 이용하여 NOP(=90)로 떔질 해주시면 Scan할떄 메시지박스가 뜨지 않게 됩니다.
이렇게 첫번쨰 패치가 끝났고 두번쨰 패치를 해보죠......
두번쨰로 패치할것은 Scan 할떄 Icon을 보여주는 갯수제한 100개를 없애는겁니다.


이번에도 아까 tntSearchClick 버튼을 역어셈블된 코드창을 보시면...
우리는 짐작할수 있습니다. 아이콘을 한개씩 추가하며 체크하다가
100이 되면 추가를 중지하고 "Extracted 100 icons" 라는 글을 뛰울거란걸..
그럼 이번에도 문자 검색을 통해서 "Extracted 100 icons"을 찾아 봅시다.


네 찾았습니다. 역시나 0x52A2D5 줄에서 cmp edi,0x64(100) 해보고
작거나 같다면 0x52A2EC로 점프하고 크면 Extracted 100 icons 라고
SetText 하는 것을 볼수 있습니다. Extracted 100 icons 메시지가 SetText
되면 안됨으로 0x52A2EC로 무조건 점프하도록 바꾸어 주면 되겠습니다.
그럼 이걸로 두번쨰 패치도 끝일까요? 한번 테스트 해보시기 바랍니다.
어때요? 100개 이상 표시가 안되죠? 이 부분 전에 한번더 어느곳에서
테스트를 한다는 소리 입니다. DeDe안좋은점은 이부분으로
어디서 call 을 하거나 jmp 하는것을 볼수 없다는 점입니다.
W32Dasm의 힘을 빌어 어디서 이곳으로 점프 or 콜 하는지 보도록 하죠




0x52A20E 와 0x52A216이 두줄에서 이곳으로 점프 해오는것을 볼수 있습니다.
주소로 보니 바로 다음줄 혹은 서로 가까운데 있는 두줄인거 같군요.
어쨰든 0x52A20E로 한번 이동하도록 하여 보죠.


음... 아이템을 추가하면서 0x559948 와 0 을 비교해서 0이 아니면 점프 하거나
ESI 와 0x55992C 비교해서 ESI의 값이 작으면 점프하는걸 볼수 있습니다.
어짜피 두개다 같은 부분으로 점프하는 것이니 첫번쨰 점프인...
0x52A20E를 무조건 점프로 바꾸어 버립니다. 이로써 두번쨰 패치도 완료입니다.
혹시 의심 가는 분은 한번 테스트 하여 보세요. 100개 이상 되나 안되나...


세번쨰로 하여볼 패치는 Save All을 할때 한개저장할때마다 OK 버튼을 눌러 주어야
한다는 점입니다. 이래서야 어디 Save All 입니까? NoGaDa All이지.:p
현재 역어셈블된 코드창은 닫고 다시 폼 부분을 보도록 합시다.


커헉 SaveAll 폼의 클레스 네임은 TFormSaveAll 이군요.
이제 클레스 네임을 확인 했으니 "Procedures" 가서 클레스 네임이
"TFormSaveAll" 인것을 클릭하여 봅시다.


9개의 PROC이 있군요. 첫번쨰꺼부터 마우스 오른쪽 버튼으로 클릭하면 나오는
메뉴에서 "Show addtional data" 메뉴를 누르면 해당 PROC을 소유한 객체에 대한
Caption을 보여주게 됩니다. 우리는 그중에서 "OK"를 Caption으로
가진 PROC을 찾으면 되는 것이지요. 두번쨰 SpeedButton1Click이 Caption으로
"OK"를 가지고 있네요. 이 PROC을 마우스 오른쪽 버튼으로 클릭하여 뜨는 메뉴중
역어셈블 메뉴를 선택하여 해당 PROC의 코드를 역어셈블 하여 옵시다.


역어셈블된 코드창을 스크롤바를 이용하여 조금 내리다보면 GetCount 라는것을
볼수 있습니다. Count라는 단어는 뭔가를 센다는 단어로 상당히 의심스럽죠?
거기다가 조건 분기 점프까지 뭔가 있는게 분명 합니다.
이 조건분기의 점프지점인 0x52CAE2 부분으로 포인터를 옮겨 보죠


커헉 와봤더니 이건 PROC의 기능을 끝내는 끝부분 이군요.
이건 점프하면 안되는게 분명 하죠?
0x52C293의 jle를 NOP(=90)으로 떔질 하여주면 이번 패치도 끝입니다.
이제 마지막 네번쨰 패치인 사용횟수제한에 대한 겁니다.
처음에 뜨는 폼의 클레스 네임이 뭔지 알아 내기 위해서
폼에서 찾아 봅시다. "TFormOrder" 처음에 뜨는 창이란걸
클레스 네임들만 봐도 금방 짐작해낼수 있습니다.
이제 "Procedures"의 왼쪽메뉴에서 클레스 네임으로 "TFormOrder" 가진
것을 클릭하여 보죠. FormCreate,FormHide,등등 7개의 PROC이 있군요.
그중에서 폼을 처음 만들때 30일이 지났으면 해당 버튼을 비활성화
시키는 것임으로 FormCreate를 역어셈블 하여 옵시다.
역어셈블 되어 코드가 표시되면 스크롤바를 조금 내려보면...


0052D0F4 83FE1E cmp esi, +$1E
0052D0F7 7E0D jle 0052D106
라는 두줄을 볼수 있습니다. 0x1E를 10진수로 하면 무얼까요?
바로 30 입니다. 사용횟수가 30보다 작거나 같으면(크지 않으면)
점프를 하고 크면 "Continue Unreg..." 버튼을 비활성화 시키는 것이군요.
그래서 0x52D0F7의 jle를 무조건 점프인 jmp로 바꾸어 주시면.....
이번 패치도 완료 입니다. 이로써 4가지 패치가 다 끝났군요.
마지막으로 패치해야할 부분으로 정리하여 보면 ...
---------------------------------------------------------------------------
0x529C0C = ORGINAL : 6A00 PATCH : 9090 - Scan 할떄 메시지 박스 안뜨기
0x529C0E = ORGINAL : 6A8B0D48A55200 PATCH : 90909090909090 - Scan 할떄 메시지 박스 안뜨기
0x529C15 = ORGINAL : B202 PATCH : 9090 - Scan 할떄 메시지 박스 안뜨기
0x529C17 = ORGINAL : B854A55200 PATCH : 9090909090 - Scan 할떄 메시지 박스 안뜨기
0x529C1C = ORGINAL : E8C3F4F2FF PATCH : 9090909090 - Scan 할떄 메시지 박스 안뜨기
0x52A20E = ORGINAL : 7579 PATCH : EB79 - 100개 이상 icon표시하기
0x52A2D8 = ORGINAL : 7512 PATCH : EB12 - 100개 이상 icon표시하기
0x52C293 = ORGINAL : 0F8E49080000 PATCH : 909090909090 - Save All 한번에 다저장하기
0x52D0F7 = ORGINAL : 7E0D PATCH : EB0D - 기간 지나도 사용하기
---------------------------------------------------------------------------
이제 우리는 거의 정품과 비슷한 Icon Grabber를 얻게 되었습니다.
이번글은 여기서 마치겠습니다.

댓글