- http://rapidshare.com/files/62257714/learnwords_29_keygen_tum0rc0re.rar.html
- Ifolder
Generation of first part of registration number:
[ARM-listing]
.text:00029830 FromNameToFirst
.text:00029830 LDRB R3, [R0,R7]
.text:00029834 AND R2, R5, #0xFF
.text:00029838 ADD R0, R0, #1
.text:0002983C ADD R3, R2, R3
.text:00029840 AND R1, R3, #0xFF
.text:00029844 MOV R3, R1,LSL#1
.text:00029848 AND R3, R3, #0xFF
.text:0002984C AND R2, R1, #0xFF
.text:00029850 ORR R5, R3, R2,LSR#7
.text:00029854 CMP R0, R6
.text:00029858 BCC FromNameToFirst
So, in the end of cycle, R5 are keeping first part of registration number: 008 for tum0rc0re.
Generation of reverse ascii-codes of first four symbols of the owner's name.
For example, for a symbol "t" [ascii: 74h] the reverse ascii-code will be - 47h.
It is a constant for generation of reverse ascii-codes of symbols of a name "cnclgvldls". It is used only first four symbols of a constant, that is "cncl".
"tum0rc0re" -> "tum0"
c [ascii: 63h] - for a generation of reverse ascii-code of third symbol of name, that's "m"
n [ascii: 6Eh] - for a generation of reverse ascii-code of second symbol of name, that's "u"
c [ascii: 63h] - for a generation of reverse ascii-code of first symbol of name, that's "t"
l [ascii: 6Ch] - for a generation of reverse ascii-code of fourth symbol of name, that's "0"
[ARM-listing]
.text:000298A4 GenerationReverseASCII ; CODE XREF: CheckSerial+17Cj
.text:000298A4 LDRSB R3, [R8]
.text:000298A8 MOV R0, R8
.text:000298AC MOV R4, R6
.text:000298B0 ADD R5, SP, #0x68+var_4C
.text:000298B4 CMP R3, #0x2D
.text:000298B8 BNE loc_298D4
.text:000298BC MOV R1, #4
.text:000298C0 BL sub_264E0
.text:000298C4 ADD R8, R8, #4
.text:000298C8 B loc_298E0
.text:000298C8 ; ---------------------------------------------------------------------------
.text:000298CC off_298CC DCD aCnclgvldls ; DATA XREF: CheckSerial+BCr
.text:000298CC ; "cnclgvldls"
.text:000298D0 off_298D0 DCD off_68B28 ; DATA XREF: CheckSerial+14r
.text:000298D4 ; ---------------------------------------------------------------------------
.text:000298D4
.text:000298D4 loc_298D4 ; CODE XREF: CheckSerial+108j
.text:000298D4 MOV R1, #3
.text:000298D8 BL sub_264E0
.text:000298DC ADD R8, R8, #3
.text:000298E0
.text:000298E0 loc_298E0 ; CODE XREF: CheckSerial+118j
.text:000298E0 STRB R0, [R4,R5]!
.text:000298E4 ADD R0, SP, #0x68+var_5C
.text:000298E8 LDR R1, =aD
.text:000298EC LDRSB R5, [R4]
.text:000298F0 MOV R2, R5
.text:000298F4 BL sub_4298C
.text:000298F8 ADD R1, SP, #0x68+var_5C
.text:000298FC ADD R0, SP, #0x68+var_5C
.text:00029900 BL __YCString__QAAABV0_ABV0__Z ; CString::operator+=(CString const &)
.text:00029904 LDRSB R2, [R6,R11]
.text:00029908 MOV R3, R5,LSL#24
.text:0002990C CMP R6, #2
.text:00029910 ADD R6, R6, #1
.text:00029914 EOR R3, R2, R3,ASR#24
.text:00029918 STRB R3, [R4]
.text:0002991C MOVEQ R3, #1
.text:00029920 LDREQSB R9, [SP,#0x1E]
.text:00029924 STREQB R3, [R10,R7]
.text:00029928 CMP R6, #4
.text:0002992C BCC GenerationReverseASCII
CMP R3, #0x2D - check of the fourth symbol of entered serial number on equality "-" [ascii: 2Dh].
EOR R3, R2, R3,ASR#24 - xor-operation, r2 = the next symbol of a constant, r3 - the next three-value number which you have entered into a field of serial number, asr#24 - Arithmetic shift to the right on 24 bat.
As a result, R3 stores a reverse ascii-code of a symbol of a name.
[ARM-listing]
.text:00029954 MOV R0, R2
.text:00029958 ADD R1, SP, #0x68+var_4C
.text:0002995C LDRSB R1, [R0,R1]!
.text:00029960 ADD R2, R2, #1
.text:00029964 MOV LR, R1,LSL#4
.text:00029968 MOV R1, R1,LSL#24
.text:0002996C MOV R1, R1,ASR#24
.text:00029970 MOV R1, R1,ASR#4
.text:00029974 AND R1, R1, #0xF
.text:00029978 MOV LR, LR,LSL#24
.text:0002997C ORR R1, R1, LR,ASR#24
.text:00029980 STRB R1, [R0]
.text:00029984 MOV R1, R1,LSL#24
.text:00029988 LDRSB R0, [R3,R0]
.text:0002998C MOV R1, R1,ASR#24
.text:00029990 CMP R1, R0
.text:00029994 LDREQ R1, [SP,#0x68+var_64]
.text:00029998 ADDEQ R1, R1, #1
.text:0002999C STREQ R1, [SP,#0x68+var_64]
.text:000299A0 CMP R2, #4
.text:000299A4 BCC loc_29954
.text:000299A8 LDR R3, [SP,#0x68+var_64]
ORR R1, R1, LR,ASR#24 - conversion from a reverse code in true ascii-code.
That is, in order to get next true three-value of serial number, it is necessary to execute xor-operation of the next symbol of a constant and a reverse ascii-code of a owner's name.
t [ascii: 74] - a reverse ascii: 47 - xor 63h, 47h = 24h = 36d = "036"
u [ascii: 75] - a reverse ascii: 57 - xor 6Eh, 57h = 39h = 57d = "057"
m [ascii: 6D] - a reverse ascii: D6 - xor 63h, D6h = B5h, the first three-value number with a minus, that is it is necessary to use transformation from an additional code in a direct code - not (FFFFFFFFFFFFFFB5 - 1) = 4Bh = "075" - "-075"
0 [ascii: 30] - a reverse ascii: 03 - xor 6Ch, 03h = 6Fh = 111d = "111"
Thus, the serial number for "tum0rc0re" is "008-075057036111".
[Delphi-listing]
var
I, TempCode, CurCode, SummCode, TempCode1: Integer;
SummString, temp, CodeString, temp1: string;
third, second, fourth, first: string;
begin
if txtRegName.Text = '' then
begin
ShowMessage('Registration name is empty');
Exit;
end;
if length(txtRegName.Text) <>
begin
ShowMessage('Registration name will be > 3 symbols');
Exit;
end;
TempCode := 0;
CurCode := 0;
SummCode := 0;
CodeString := txtRegName.Text;
for I := 0 to Length(CodeString) - 1 do
begin
SummCode := Ord(CodeString[i+1]);
CurCode := TempCode and 255;
SummCode := SummCode + CurCode;
TempCode1 := SummCode and 255;
SummCode := TempCode1 shl 1;
SummCode := SummCode and 255;
CurCode := TempCode1 and 255;
TempCode := SummCode or (CurCode shr 7);
end;
SummCode := TempCode;
if Length(IntToStr(SummCode)) = 1 then temp := '00';
if Length(IntToStr(SummCode)) = 2 then temp := '0';
SummString := temp + IntToStr(SummCode);
SummString := SummString + '-';
temp := Copy(CodeString, 1, 1);
TempCode := ord(temp[1]);
temp := IntToHex(tempcode, 2);
temp := Copy(temp, 2, 1) + Copy(temp, 1, 1);
TempCode := StrToInt('$' + temp) xor 99;
temp := IntToStr(TempCode);
if Length(temp) = 1 then temp := '00' + temp;
if Length(temp) = 2 then temp := '0' + temp;
third := temp;
temp := Copy(CodeString, 2, 1);
TempCode := ord(temp[1]);
temp := IntToHex(tempcode, 2);
temp := Copy(temp, 2, 1) + Copy(temp, 1, 1);
TempCode := StrToInt('$' + temp) xor 110;
temp := IntToStr(TempCode);
if Length(temp) = 1 then temp := '00' + temp;
if Length(temp) = 2 then temp := '0' + temp;
second := temp;
temp := Copy(CodeString, 4, 1);
TempCode := ord(temp[1]);
temp := IntToHex(tempcode, 2);
temp := Copy(temp, 2, 1) + Copy(temp, 1, 1);
TempCode := StrToInt('$' + temp) xor 108;
temp := IntToStr(TempCode);
if Length(temp) = 1 then temp := '00' + temp;
if Length(temp) = 2 then temp := '0' + temp;
fourth := temp;
temp := Copy(CodeString, 3, 1);
TempCode := ord(temp[1]);
temp := IntToHex(tempcode, 2);
temp := Copy(temp, 2, 1) + Copy(temp, 1, 1);
TempCode1 := StrToInt('$' + temp) xor 99;
temp := IntTohex(not TempCode1, 2);
temp := copy(temp, 7, 2);
TempCode := StrToInt('$' + temp);
temp := IntToStr(TempCode + 1);
if Length(temp) = 1 then temp := '00' + temp;
if Length(temp) = 2 then temp := '0' + temp;
first := temp;
txtRegNumber.Text := SummString + first + second + third + fourth;
end;

