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.. E8 3CFBFFFF CALL dumped_.007D22A8 ESI = 1Ah EDX = 26h EAX = Name Shared Function Keyge
Trang 1007D256B | 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
Trang 2intEBX = 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
Trang 3- 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
Trang 4Code:
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]
Trang 5007D237B | 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
Trang 6in_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: