007D256B |. E8 9837C3FF |CALL dumped_.00405D08 Gán Char đó vào Part 3 Code: 007D2570 |. 4B |DEC EBX 007D2571 |. 46 |INC ESI 007D2572 |.^ 75 E2 \JNZ SHORT dumped_.007D2556 EBX - 1 để lùi dần sang phải Hey ESI tăng 1 và Loop Until ESI = 0 Nghĩ xem nào Giả sử ta có EncryptedName.Length = 1A Vậy ESI = 1A - 9 -1A = FFFFFFF7 Còn nếu EncryptedName.Length = 5D ? ESI = 5D - 9 - 5D = FFFFFFF7 Sau đó lại được trừ 1 ESI = FFFFFFF7 - 1 = FFFFFFF6 Ở vòng Loop thì lập với ESI + 1 dần cho đến khi ESI = 0 Vậy tính xem từ FFFFFFF6 -> 0 là bao nhiêu Loop ? 0 - FFFFFFF6 = A Xong Tóm lại nó Loop Ah times để lấy Ah kí tự từ phải sang trái :D Code: Shared Function Part2(ByVal in_strEncryptedName As String) As String If (in_strEncryptedName = "") Then Return "" Else Dim intEBX = in_strEncryptedName.Length Dim out_strPart3 As String Dim intESI As Integer intEBX = in_strEncryptedName.Length intESI = (in_strEncryptedName.Length - &H9 - in_strEncryptedName.Length) If intESI > 0 Then Else intESI = intESI - 1 Do out_strPart3 = out_strPart3 & in_strEncryptedName.Substring(intEBX - 1, 1) intESI = intESI + 1 intEBX = intEBX - 1 Loop Until intESI = &H0 End If End If End Function Khà hoàn tất Part 3 và cũng là hoàn tất Keygen. Giờ ta cập nhật lại tổng quan quá trình Gen Serials của em System Mechanic 6 (Standard) này xem nào. - Gọi Function Keygen với các Parameters: Code: 007D275B |> \56 PUSH ESI ; Case 9 of switch 007D2677 007D275C |. 57 PUSH EDI 007D275D |. 8BCB MOV ECX, EBX 007D275F |. BA 26000000 MOV EDX, 26 007D2764 |. 8B45 FC MOV EAX, [LOCAL.1] 007D2767 |. E8 3CFBFFFF CALL dumped_.007D22A8 ESI = 1Ah EDX = 26h EAX = Name Shared Function KeygenBaseEx(ByVal in_strName As String, _ ByVal in_intStarESI As Integer, ByVal in_intStarEDX As Integer, ByVal in_strPrefix As String) As String - Trong Function Keygen: + Vòng Loop fixNameLength với EBX = 21h và không có giá trị max EBX. Count Loop = Ah Code: 007D22DC |. BB 21000000 MOV EBX, 21 ; MOV EBX = 21h. StartIndex 4 Loop 007D22E1 |. EB 16 JMP SHORT dumped_.007D22F9 007D22E3 |> 8D45 EC /LEA EAX, [LOCAL.5] 007D22E6 |. 8BD3 |MOV EDX, EBX ; EDX = EBX (StartIndex) 007D22E8 |. E8 0F39C3FF |CALL dumped_.00405BFC 007D22ED |. 8B55 EC |MOV EDX, [LOCAL.5] 007D22F0 |. 8D45 FC |LEA EAX, [LOCAL.1] 007D22F3 |. E8 103AC3FF |CALL dumped_.00405D08 ; Name = Name & Char(EDX) 007D22F8 |. 43 |INC EBX 007D22F9 |> 8B45 FC MOV EAX, [LOCAL.1] 007D22FC |. E8 FF39C3FF |CALL dumped_.00405D00 007D2301 |. 83F8 0A |CMP EAX, 0A 007D2304 |.^ 7C DD \JL SHORT dumped_.007D22E3 ; Loop fix Name.Length Until A Như vậy ta gọi Function này như sau: Code: Shared Function FixLength(ByVal in_strName As String, ByVal in_byteLoopCount As Byte, _ ByVal in_byteStart4CrypName As Byte, Optional ByVal in_byteMaxValue As Byte = 0) As String in_strName = FixLength(in_strName, &HA, &H21) in_byteMaxValue: Không cần vì không có giá trị max. + Name.UCase + Vòng Loop để tính Part 1: + Check Name.Length. Nếu <0 thì nhảy đến đoạn Loop fixName với EBX = 31h & Count Loop = 14h Code: If in_strName.Length <= 0 Then in_strName = FixLength(in_strName, &H14, &H31) End If + Tiếp theo mã hóa Name: Code: 007D232A |. BB 01000000 MOV EBX, 1 007D232F |> 8B45 FC /MOV EAX, [LOCAL.1] 007D2332 |. 0FB64418 FF |MOVZX EAX, BYTE PTR DS:[EAX+EBX-1] ; MOVZX EAX = Name.SubString(EBX-1,1) 007D2337 |. 8B55 0C |MOV EDX, [ARG.2] ; EDX = 1A (Const) 007D233A |. 83C2 46 |ADD EDX, 46 ; EDX = EDX + 46 007D233D |. 3BC2 |CMP EAX, EDX 007D233F |. 7E 22 |JLE SHORT dumped_.007D2363 ; If EAX (Name.SubString) <= EDX Then Jump 007D2341 |. 8B45 FC |MOV EAX, [LOCAL.1] 007D2344 |. 0FB64418 FF |MOVZX EAX, BYTE PTR DS:[EAX+EBX-1] 007D2349 |. 8D143B |LEA EDX, DWORD PTR DS:[EBX+EDI] 007D234C |. 2BC2 |SUB EAX, EDX 007D234E |. 8D55 E4 |LEA EDX, [LOCAL.7] 007D2351 |. E8 FA9AC3FF |CALL dumped_.0040BE50 007D2356 |. 8B55 E4 |MOV EDX, [LOCAL.7] 007D2359 |. 8D45 F4 |LEA EAX, [LOCAL.3] 007D235C |. E8 A739C3FF |CALL dumped_.00405D08 007D2361 |. EB 20 |JMP SHORT dumped_.007D2383 007D2363 |> 8B45 FC |MOV EAX, [LOCAL.1] ; EAX = NameEncrypted 007D2366 |. 0FB64418 FF |MOVZX EAX, BYTE PTR DS:[EAX+EBX-1] ; EAX = Name.SubString(EBX-1,1) 007D236B |. 8D143B |LEA EDX, DWORD PTR DS:[EBX+EDI] ; EDX = EBX + EDI 007D236E |. 03C2 |ADD EAX, EDX ; EAX = EAX + EDX 007D2370 |. 8D55 E0 |LEA EDX, [LOCAL.8] 007D2373 |. E8 D89AC3FF |CALL dumped_.0040BE50 ; Convert 2 HexString 007D2378 |. 8B55 E0 |MOV EDX, [LOCAL.8] 007D237B |. 8D45 F4 |LEA EAX, [LOCAL.3] 007D237E |. E8 8539C3FF |CALL dumped_.00405D08 007D2383 |> 47 |INC EDI 007D2384 |. 43 |INC EBX 007D2385 |. 4E |DEC ESI 007D2386 |.^ 75 A7 \JNZ SHORT dumped_.007D232F ; Encrytp Name Ở Loop mã hóa này sử dụng Function EncryptName với các Parameters Code: Shared Function EncryptName(ByVal in_strName As String, _ ByVal in_intStartEDI As Integer, Optional ByVal in_intStartEDX As Integer = 0) As String Dim out_strEncryptedName As String Dim intEAX As Integer Dim intEBX As Integer Dim intEDI As Integer = in_intStartEDI Dim intEDX As Integer If in_strName = "" Then Return "" Else For intEBX = 1 To in_strName.Length intEAX = Asc(in_strName.Substring(intEBX - 1, 1)) intEDX = intEBX + intEDI If intEAX <= &H46 + in_intStartEDX Then intEAX = intEAX + intEDX Else intEAX = intEAX - intEDX End If out_strEncryptedName = out_strEncryptedName & intEAX.ToString intEDI = intEDI + 1 Next Return out_strEncryptedName End If End Function in_intStartEDI: Parameter này của Function EncryptName chính là ở Code: 007D22C1 |. 8BFA MOV EDI, EDX ; EDI = EDX (StartEDI 4 Encryption) = 26h Ở đầu Function Keygen chính. ByVal in_intStartEDX: ESI = 1Ah . Nó là Parameter ESI ở Function Keygen chính. Khi này Function EncryptName sẽ được gọi như sau: . Code: 00 7D232A |. BB 01 0 00 000 MOV EBX, 1 00 7D232F |> 8B45 FC /MOV EAX, [LOCAL .1] 00 7D2332 |. 0FB64 418 FF |MOVZX EAX, BYTE PTR DS:[EAX+EBX -1] ; MOVZX EAX = Name.SubString(EBX -1, 1) 00 7D2337. E8 10 3AC3FF |CALL dumped_ .00 405 D08 ; Name = Name & Char(EDX) 00 7D22F8 |. 43 |INC EBX 00 7D22F9 |> 8B45 FC MOV EAX, [LOCAL .1] 00 7D22FC |. E8 FF39C3FF |CALL dumped_ .00 405 D 00 00 7D23 01 . 00 7D256B |. E8 9837C3FF |CALL dumped_ .00 405 D08 Gán Char đó vào Part 3 Code: 00 7D25 70 |. 4B |DEC EBX 00 7D25 71 |. 46 |INC ESI 00 7D2572 |.^ 75 E2 JNZ SHORT dumped_ .00 7D2556 EBX - 1 để