패치강좌  No 7

새롬 데이터맨 98 KeyGen 만들기

( Windows InstallShield Decompiler Version 1.00 Beta , Visual Basic 5.0 )


안냐세요.. 이 강좌에서는 InstallShield를 사용하는 방법에 대해. 잠시만 설명 드립니다. 그리고 새롬 데이터맨 98의 등록번호 연산 부분을 분석해 보도록 하겠습니다. 넘 간단하니까.. 잘 지켜봐 주세요. 중요한 것은 직접 해보는 것 이겠지요??

시작합니다..

먼저 Windows InstallShield Decompiler를 인스톨하시고 또 새롬 데이터맨98을 준비하셔야겠죠?? 없으시면 인터넷에 있으니.. 찾아 보시기 바랍니다. Decompiler 의 Open Script를 선택해서 setup.ins 파일을 불러 옵니다.. 그리고 F2 키를 눌러 Decompile을 해야겠죠!!

그런다음 조금만 내려가 보시면 아래의 부분을 만나실 수 있을 것입니다... 주석을 졸라게 달아 놓았으니 참고 하시면서 읽어 봐 주십시오!

00001B99: 0092        CtrlGetText (StrVar[002B],0000012F,StrVar[0025])
                               <= 첫번째 문자열
00001BA6: 0092        CtrlGetText (StrVar[002B],00000130,StrVar[0026])
                               <= 두번째 문자열
00001BB3: 0092        CtrlGetText (StrVar[002B],00000131,StrVar[0027])
                               <= 세번째 문자열
00001BC0: 0092        CtrlGetText (StrVar[002B],00000402,StrVar[0028])
                               <= 네번째 문자열
00001BCD: 0124        StrVar[0064] = StrVar[0025] + "-"
00001BD9: 0124        StrVar[0065] = StrVar[0064] + StrVar[0026]
00001BE4: 0124        StrVar[0066] = StrVar[0065] + "-"
00001BF0: 0124        StrVar[0067] = StrVar[0066] + StrVar[0027]
00001BFB: 0124        StrVar[0068] = StrVar[0067] + "-"
00001C07: 0124        StrVar[0023] = StrVar[0068] + StrVar[0028]
                              <= 1,2,3,4의 문자열을 '-' 문자열과 더해서 [0023] 에 저장
                               <= ( 12-12-12-12 이런식으로 )
00001C37: 0128        IF (StrCompare (StrVar[0023],"내일-꼭-살께요-맹세함") = 00000000) THEN
                              <= [0023] 이 "내일-꼭-살께요-맹세함" 인가를 비교
                              <= 지금 장난하나???
00001C57: 0021                NumVar[002A] = 00000001
                              <= [002A]가 1 이라면 시리얼 번호는 정확한 것..
00001C58: 0000        ENDIF
00001C69: 006D        StrToNum (NumVar[002F],StrVar[0025])
00001C71: 006D        StrToNum (NumVar[0030],StrVar[0026])
00001C79: 006D        StrToNum (NumVar[0031],StrVar[0027])
00001C81: 006D        StrToNum (NumVar[0032],StrVar[0028])
                              <= 다시 저장하고..
00001C89: 0128        NumVar[004A] = NumVar[002F] != 00012FEA
                              <= 핵사 12FEA = 77802
                             <= 처음 번호는 77802 이고 -> [004A] = 0
00001C9B: 0128        NumVar[004B] = NumVar[0030] < 00000064
                            <= 핵사 64 = 100
                            <= 두번째 번호는 100 보다 커야되고 -> [004B] = 0
00001CAD: 0126        NumVar[004C] = NumVar[004A] || NumVar[004B]        <===== || -> XOR

                            <= 위의 두 가지의 조건이 만족한다면
                            <= [004C] 0 = 0 || 0
00001CB8: 0128        NumVar[004A] = NumVar[0030] > 000003E7
                            <= 핵사 3E7 = 999
                            <= 두번째 번호는 999 보다 작아야 하고 -> [004A] = 0
00001CCA: 0126        NumVar[004B] = NumVar[004C] || NumVar[004A]
                            <= [004B] 0 = 0 || 0
00001CD5: 0128        NumVar[004A] = NumVar[0031] < 000F4240
                            <= 핵사 F4240 = 1000000
                            <= 3번째 번호는 1000000 보다 커야하고 -> [004A] = 0
00001CE7: 0126        NumVar[004C] = NumVar[004B] || NumVar[004A]
                            <= [004C] 0 = 0 || 0
00001CF2: 0128        NumVar[004A] = NumVar[0031] > 0098967F
                            <= 핵사 98967F = 9999999
                            <= 3번째 번호는 9999999 보다 작아야 하며 <- [004A] = 0
00001D04: 0126        NumVar[004B] = NumVar[004C] || NumVar[004A]
                            <= [004B] 0 = 0 || 0
00001D0F: 0128        NumVar[004A] = NumVar[0032] < 00002710
                            <= 핵사 2710 = 10000
                            <= 4번째 번호는 10000 보다 커야하고 <- [004A] = 0
00001D21: 0126        NumVar[004C] = NumVar[004B] || NumVar[004A]
                            <= [004C] 0 = 0 || 0
00001D2C: 0128        NumVar[004A] = NumVar[0032] > 0001869F
                            <= 핵사 1869F = 99999
                            <= 4번째 숫자는 99999 보다 작아야 한다. <- [004A] = 0
00001D49: 0022        IF (NumVar[004C] || NumVar[004A] != 00000000) THEN
                            <= [004C] = 0 , [004A] = 0  -> 0 = 0 || 0
                            <= 0 != 0    <- 거짓이므로 아래를 실행하지 않는다.

00001D57: 0128               IF (NumVar[002A] = 00000000) THEN
                                  <= [002A]가 0 일때
00001D77: 002A                    MessageBox ("제품 ID를 잘못 입력하셨습니다.",SEVERE)
00001D9F: 002C                    Goto (LABEL_0020)
00001DA0: 0000               ENDIF
00001DA0: 0000        ENDIF
00001DE5: 0128        IF (SdConfirmRegistration_[LABEL_019E] = 00000000) THEN
00001E05: 002C               Goto (LABEL_0020)
00001E06: 0000        ENDIF
00001E12: 011C        NumVar[004A] = NumVar[0030] / 00000007
00001E1F: 011B        NumVar[004B] = NumVar[004A] * 00000007
00001E2C: 011A        NumVar[0030] = NumVar[0030] - NumVar[004B]
                             <= 위의 등식은 두번째 숫자를 가지고..
                             <= A = 두번째 숫자 / 7
                             <= B = A * 7
                             <= 두번째 숫자 = A - B
00001E3F: 011C        NumVar[004A] = NumVar[0031] / 00000007
00001E4C: 011B        NumVar[004B] = NumVar[004A] * 00000007
00001E59: 011A        NumVar[0031] = NumVar[0031] - NumVar[004B]
                             <= 3번째 숫자도 마찮가지..
00001E6C: 011C        NumVar[004A] = NumVar[0032] / 00000007
00001E79: 011B        NumVar[004B] = NumVar[004A] * 00000007
00001E86: 011A        NumVar[0032] = NumVar[0032] - NumVar[004B]
                             <= 4번째 숫자도 마찮가지..
00001E99: 0128        NumVar[004A] = NumVar[0030] != 00000003
                             <= 두번째 숫자를 연산한 값이 3 이어야함
                             <= 만약 3 이라면 [004A] = 0
00001EAB: 0128        NumVar[004B] = NumVar[0031] != 00000003
                             <= 3번째 숫자를 연산한 것이 3 이어야함
                             <= 만약 3 이라면 [004B] = 0
00001EBD: 0126        NumVar[004C] = NumVar[004A] || NumVar[004B]
                             <= [004C] 0 = 0 || 0
00001EC8: 0128        NumVar[004A] = NumVar[0032] != 00000003
                             <= 4번째 숫자를 연산한 것이 3 이어야함
                             <= 만약 3 이이라면 [004A] = 0
00001EE5: 0022        IF (NumVar[004C] || NumVar[004A] != 00000000) THEN
                             <= [004C] = 0 , [004A] = 0 , 0 = 0 || 0
                             <= 0 != 0   -> 거짓이므로 아래를 실행하지 않음
00001EF3: 0128               IF (NumVar[002A] = 00000000) THEN
00001F13: 002A                      MessageBox ("제품 ID를 잘못 입력하셨습니다.",SEVERE)
00001F3B: 002C                      Goto (LABEL_0020)
00001F3C: 0000               ENDIF
00001F3C: 0000        ENDIF
00001F50: 0021        NumVar[0027] = 00000001
                         <= 이 곳까지 무사히 오면 시리얼 번호는 정확한것.!!
                         <= 최종적으로 [0027]에 1을 집어넣어.. 시리얼 번호를 레지스트리에
                         <= 저장된 시리얼이 이상이 없다는것을 확인..
                         
등록번호 연산과정이 의외로 간단하지요?? 으음.. 너무 간단해서.. 짜증남..

제가 Visual Basic 프로그래머 이니까.. KeyGen을 Visual Basic 으로 만들어 보았습니다. 이번 강좌에선 KeyGen을 만들어 보았지만.. 다른 종류도 많이 있습니다. 시리얼 번호를 아무거나 입력하여도 그냥 인스톨이 되도록 또는 CD를 검사하는 프로그램을 패치 하는 방법 등등 여러 가지가 있지만 이번 강좌에서는 이 정도로 하고 다음번에 할 때에는 다른 방법을 강좌 해보도록 하겠습니다.

죄송 합니다.. VisualBasic을 잘 모르시는 분은.. 음.. 엄.. 코드가 쉬우니까 이해가 가리라 봅니다.

KeyGen 소스 & 실행파일


 

 

[email protected]