Co : Tarantula 1.99 Gdzie : WWW CD (IX 99),http://NostrumIndia.com/ Czym : SoftICE 3.2 (w dalszej czesci nazywany SI)
Na poczatek krótki wstep....Programista Tarantuli 1.99 uslyszal gdzies o SI i postanowil utrudnic nam prace. Zapewne myslisz juz o tym standardowym, szeroko rozpowszechnionym sposobie wykrywania SI,ale nic z tego. Na dzialanie Tarantuli nie wplywa obecnosc debuggera. Program wyswietla w linii komend SI nastepujacy komunikat:
aayyyy.....What's up,doc?Lookin' for something?aayyyy.....What's up,doc?Lookin' for something?aayyyy.....What's up,doc?Lookin' for something?aayyyy.....What's up,doc?
Nie wiem czemu ma to sluzyc - mnie to wprost zachecilo. Mówi sie, ze najwazniejsze w crackowaniu jest zrozumienie zamiarów programisty. Tak wiec na koniec wstepu spójrzmy mu w oczy (zamiescil on swoja fotografie w pomocy - About Tarantula).
Do rzeczy !
Pierwsze co wpada w oko to wylaczony przycisk REGISTER. Program wiec bedzie wczytywal nasze dane na biezaco, przy wpisywaniu kazdego znaku. Tak wiec ustawiamy breakpoint'a w SI:
bpx hmemcpy
i wystukujemy nasze ulubione dane ( sIR tHomasRE , 1122334455 ). SI zatrzymuje Tarantule przy wywolaniu funkcji hmempcy. Teraz tylko kilka razy F11 i F10 i widzimy cos takiego :
:004D9904 8B55FC mov edx, dword ptr [ebp-04] :004D9907 B85C994D00 mov eax, 004D995C :004D990C E897A9F2FF call 004042A8 :004D9911 85C0 test eax, eax :004D9913 7E0F jle 004D9924
Zobaczmy co zawiera "call 004042A8" :
:004042A8 85C0 test eax, eax :004042AA 7440 je 004042EC :004042AC 85D2 test edx, edx :004042AE 7431 je 004042E1 :004042B0 53 push ebx :004042B1 56 push esi :004042B2 57 push edi :004042B3 89C6 mov esi, eax :004042B5 89D7 mov edi, edx :004042B7 8B4FFC mov ecx, dword ptr [edi-04] :004042BA 57 push edi :004042BB 8B56FC mov edx, dword ptr [esi-04] :004042BE 4A dec edx :004042BF 781B js 004042DC :004042C1 8A06 mov al, byte ptr [esi] <--- mov al,2D :004042C3 46 inc esi :004042C4 29D1 sub ecx, edx :004042C6 7E14 jle 004042DC :004042C8 F2 repnz <--- sprawdz czy w naszym kodzie jest '-' :004042C9 AE scasb :004042CA 7510 jne 004042DC :004042CC 89CB mov ebx, ecx :004042CE 56 push esi :004042CF 57 push edi :004042D0 89D1 mov ecx, edx :004042D2 F3 repz :004042D3 A6 cmpsb :004042D4 5F pop edi :004042D5 5E pop esi :004042D6 740C je 004042E4 :004042D8 89D9 mov ecx, ebx :004042DA EBEC jmp 004042C8 :004042DC 5A pop edx :004042DD 31C0 xor eax, eax :004042DF EB08 jmp 004042E9 :004042E1 31C0 xor eax, eax :004042E3 C3 ret
Tak wiec program najpierw sprawdza czy wpisalismy myslnik. Teraz tylko zmiana kodu na 1122334455-123 i pojawia sie przycisk REGISTER. Po nacisnieciu go Tarantula dokonuje wywolania funkcji hmemcpy. Zobaczmy co zostalo wczytane. Zatem :
d ax
i w oknie danych SI pojawia sie nasz numer. Po powrocie do kodu programu ( ponownie kilka razy F10 i F11 ) pojawia sie cos takiego :
:004D8D39 8B83E8010000 mov eax, dword ptr [ebx+000001E8] :004D8D3F E814E2F4FF call 00426F58 :004D8D44 8B45EC mov eax, dword ptr [ebp-14] :004D8D47 E874B2F2FF call 00403FC0 :004D8D4C 83F80C cmp eax, 0000000C <--- porównanie dlugosci kodu :004D8D4F 7D1C jge 004D8D6D :004D8D51 B80F000000 mov eax, 0000000F :004D8D56 E81DA1F2FF call 00402E78 :004D8D5B 33D2 xor edx, edx :004D8D5D 8B83E8010000 mov eax, dword ptr [ebx+000001E8] :004D8D63 E820E2F4FF call 00426F88 :004D8D68 E994090000 jmp 004D9701 :004D8D6D 8D55EC lea edx, dword ptr [ebp-14] :004D8D70 8B83E8010000 mov eax, dword ptr [ebx+000001E8] :004D8D76 E8DDE1F4FF call 00426F58 :004D8D7B 8B45EC mov eax, dword ptr [ebp-14] :004D8D7E E83DB2F2FF call 00403FC0 :004D8D83 83F80E cmp eax, 0000000E <--- porównanie dlugosci kodu :004D8D86 7E1C jle 004D8DA4 :004D8D88 B80F000000 mov eax, 0000000F
A wiec nasz numer musi miec od 12 do 14 znaków. Dalej natykamy sie na cos takiego :
:004D8F61 B806000000 mov eax, 00000006 :004D8F66 E80D9FF2FF call 00402E78 :004D8F6B 83F806 cmp eax, 00000006 <--- porównywanie dlugosci nicku :004D8F6E 0F87C6000000 ja 004D903A :004D8F74 8A80818F4D00 mov al, byte ptr [eax+004D8F81] :004D8F7A FF2485888F4D00 jmp dword ptr [4*eax+004D8F88]
W koncu dochodzimy do takiego miejsca :
:004D907B 8B83E4010000 mov eax, dword ptr [ebx+000001E4] :004D9081 E8D2DEF4FF call 00426F58 :004D9086 8B45E8 mov eax, dword ptr [ebp-18] :004D9089 5A pop edx :004D908A E8B5680700 call 0054F944 :004D908F 83F809 cmp eax, 00000009 :004D9092 7F20 jg 004D90B4 :004D9094 0F8404010000 je 004D919E :004D909A 83E801 sub eax, 00000001 :004D909D 7239 jb 004D90D8 :004D909F 48 dec eax :004D90A0 0F84BE010000 je 004D9264 :004D90A6 83E802 sub eax, 00000002 :004D90A9 0F847B020000 je 004D932A :004D90AF E9DB050000 jmp 004D968F
Nastepuje tutaj dosc wiele skoków, a wiec prawdopodobnie "call 0054F944" bedzie zawieral sprawdzenie poprawnosci naszego numeru. Sprawdzmy :
:0054F944 55 push ebp :0054F945 8BEC mov ebp, esp :0054F947 81C4BCFEFFFF add esp, FFFFFEBC :0054F94D 53 push ebx :0054F94E 56 push esi :0054F94F 57 push edi :0054F950 33C9 xor ecx, ecx :0054F952 894DC8 mov dword ptr [ebp-38], ecx :0054F955 898DC0FEFFFF mov dword ptr [ebp+FFFFFEC0], ecx :0054F95B 898DBCFEFFFF mov dword ptr [ebp+FFFFFEBC], ecx :0054F961 898DC4FEFFFF mov dword ptr [ebp+FFFFFEC4], ecx :0054F967 894DDC mov dword ptr [ebp-24], ecx :0054F96A 8955F8 mov dword ptr [ebp-08], edx :0054F96D 8945FC mov dword ptr [ebp-04], eax :0054F970 8B45FC mov eax, dword ptr [ebp-04] :0054F973 E8FC47EBFF call 00404174 :0054F978 8B45F8 mov eax, dword ptr [ebp-08] :0054F97B E8F447EBFF call 00404174 :0054F980 8D5DF4 lea ebx, dword ptr [ebp-0C] :0054F983 33C0 xor eax, eax :0054F985 55 push ebp :0054F986 68FBFC5400 push 0054FCFB :0054F98B 64FF30 push dword ptr fs:[eax] :0054F98E 648920 mov dword ptr fs:[eax], esp :0054F991 E8CA9CEBFF call 00409660 :0054F996 DD5DD4 fstp qword ptr [ebp-2C] :0054F999 9B wait :0054F99A 83CEFF or esi, FFFFFFFF :0054F99D 8D55C8 lea edx, dword ptr [ebp-38] :0054F9A0 8B45FC mov eax, dword ptr [ebp-04] :0054F9A3 E89484EBFF call 00407E3C :0054F9A8 8B55C8 mov edx, dword ptr [ebp-38] :0054F9AB 8D45FC lea eax, dword ptr [ebp-04] :0054F9AE E82944EBFF call 00403DDC :0054F9B3 8B45FC mov eax, dword ptr [ebp-04] :0054F9B6 BA14FD5400 mov edx, 0054FD14 :0054F9BB E81047EBFF call 004040D0 <---| :0054F9C0 0F84EF020000 je 0054FCB5 | porównaie z :0054F9C6 8B45FC mov eax, dword ptr [ebp-04] |> poprzednikami :0054F9C9 BA28FD5400 mov edx, 0054FD28 | ( Nell Lang, :0054F9CE E8FD46EBFF call 004040D0 <---| Alton G. Arndell ) :0054F9D3 0F84DC020000 je 0054FCB5 :0054F9D9 813D745157008F236900 cmp dword ptr [00575174], 0069238F :0054F9E3 0F85CC020000 jne 0054FCB5 :0054F9E9 8B45FC mov eax, dword ptr [ebp-04] :0054F9EC E8CF45EBFF call 00403FC0 :0054F9F1 83F81F cmp eax, 0000001F <--- porównanie dlugosci nicku :0054F9F4 7F16 jg 0054FA0C :0054F9F6 8903 mov dword ptr [ebx], eax :0054F9F8 8D45FC lea eax, dword ptr [ebp-04] :0054F9FB BA44FD5400 mov edx, 0054FD44 :0054FA00 E8C345EBFF call 00403FC8 :0054FA05 FF03 inc dword ptr [ebx] :0054FA07 833B20 cmp dword ptr [ebx], 00000020 :0054FA0A 75EC jne 0054F9F8 :0054FA0C 8D55C8 lea edx, dword ptr [ebp-38] :0054FA0F 8B45F8 mov eax, dword ptr [ebp-08] :0054FA12 E82584EBFF call 00407E3C :0054FA17 8B55C8 mov edx, dword ptr [ebp-38] :0054FA1A 8D45F8 lea eax, dword ptr [ebp-08] :0054FA1D E8BA43EBFF call 00403DDC :0054FA22 8B45F8 mov eax, dword ptr [ebp-08] :0054FA25 E89645EBFF call 00403FC0 :0054FA2A 83F80D cmp eax, 0000000D :0054FA2D 7F16 jg 0054FA45 :0054FA2F 8903 mov dword ptr [ebx], eax :0054FA31 8D45F8 lea eax, dword ptr [ebp-08] :0054FA34 BA50FD5400 mov edx, 0054FD50 :0054FA39 E88A45EBFF call 00403FC8 :0054FA3E FF03 inc dword ptr [ebx] :0054FA40 833B0E cmp dword ptr [ebx], 0000000E :0054FA43 75EC jne 0054FA31 :0054FA45 8D45F8 lea eax, dword ptr [ebp-08] :0054FA48 50 push eax :0054FA49 B90E000000 mov ecx, 0000000E :0054FA4E BA01000000 mov edx, 00000001 :0054FA53 8B45F8 mov eax, dword ptr [ebp-08] :0054FA56 E86947EBFF call 004041C4 :0054FA5B 8B45F8 mov eax, dword ptr [ebp-08] :0054FA5E E82147EBFF call 00404184 :0054FA63 E80C91EBFF call 00408B74 :0054FA68 8D45C8 lea eax, dword ptr [ebp-38] :0054FA6B 50 push eax :0054FA6C B906000000 mov ecx, 00000006 :0054FA71 BA01000000 mov edx, 00000001 :0054FA76 8B45F8 mov eax, dword ptr [ebp-08] :0054FA79 E84647EBFF call 004041C4 :0054FA7E 8B55C8 mov edx, dword ptr [ebp-38] :0054FA81 8D85C8FEFFFF lea eax, dword ptr [ebp+FFFFFEC8] :0054FA87 B9FF000000 mov ecx, 000000FF :0054FA8C E80B45EBFF call 00403F9C :0054FA91 8D95C8FEFFFF lea edx, dword ptr [ebp+FFFFFEC8] :0054FA97 8D45E5 lea eax, dword ptr [ebp-1B] :0054FA9A B106 mov cl, 06 :0054FA9C E89332EBFF call 00402D34 :0054FAA1 8D45F8 lea eax, dword ptr [ebp-08] :0054FAA4 B906000000 mov ecx, 00000006 :0054FAA9 BA01000000 mov edx, 00000001 :0054FAAE E85147EBFF call 00404204 :0054FAB3 8B55F8 mov edx, dword ptr [ebp-08] :0054FAB6 B85CFD5400 mov eax, 0054FD5C :0054FABB E8E847EBFF call 004042A8 :0054FAC0 8945F0 mov dword ptr [ebp-10], eax :0054FAC3 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4] :0054FAC9 50 push eax :0054FACA 8B55F0 mov edx, dword ptr [ebp-10] :0054FACD 42 inc edx :0054FACE B903000000 mov ecx, 00000003 :0054FAD3 8B45F8 mov eax, dword ptr [ebp-08] :0054FAD6 E8E946EBFF call 004041C4 :0054FADB 8B85C4FEFFFF mov eax, dword ptr [ebp+FFFFFEC4] :0054FAE1 8D55C8 lea edx, dword ptr [ebp-38] :0054FAE4 E85383EBFF call 00407E3C :0054FAE9 8B45C8 mov eax, dword ptr [ebp-38] :0054FAEC 8BD3 mov edx, ebx :0054FAEE E80934EBFF call 00402EFC :0054FAF3 8945F0 mov dword ptr [ebp-10], eax :0054FAF6 8B55F8 mov edx, dword ptr [ebp-08] :0054FAF9 B85CFD5400 mov eax, 0054FD5C :0054FAFE E8A547EBFF call 004042A8 :0054FB03 8BD0 mov edx, eax :0054FB05 8D45F8 lea eax, dword ptr [ebp-08] :0054FB08 B905000000 mov ecx, 00000005 :0054FB0D E8F246EBFF call 00404204 :0054FB12 33C0 xor eax, eax :0054FB14 8A45E9 mov al, byte ptr [ebp-17] :0054FB17 33D2 xor edx, edx :0054FB19 8A55E8 mov dl, byte ptr [ebp-18] :0054FB1C C1E208 shl edx, 08 :0054FB1F 03C2 add eax, edx :0054FB21 33D2 xor edx, edx :0054FB23 8A55E7 mov dl, byte ptr [ebp-19] :0054FB26 C1E210 shl edx, 10 :0054FB29 03C2 add eax, edx :0054FB2B 33D2 xor edx, edx :0054FB2D 8A55E6 mov dl, byte ptr [ebp-1A] :0054FB30 C1E218 shl edx, 18 :0054FB33 03C2 add eax, edx :0054FB35 8945EC mov dword ptr [ebp-14], eax :0054FB38 8D45DC lea eax, dword ptr [ebp-24] :0054FB3B E80442EBFF call 00403D44 :0054FB40 8D95C0FEFFFF lea edx, dword ptr [ebp+FFFFFEC0] :0054FB46 A1EC635500 mov eax, dword ptr [005563EC] :0054FB4B 8B00 mov eax, dword ptr [eax] :0054FB4D 8B80E8010000 mov eax, dword ptr [eax+000001E8] :0054FB53 E80074EDFF call 00426F58 :0054FB58 8B85C0FEFFFF mov eax, dword ptr [ebp+FFFFFEC0] :0054FB5E E85D44EBFF call 00403FC0 :0054FB63 8BF0 mov esi, eax :0054FB65 85F6 test esi, esi :0054FB67 7E4A jle 0054FBB3 :0054FB69 C70301000000 mov dword ptr [ebx], 00000001 :0054FB6F 8D85C0FEFFFF lea eax, dword ptr [ebp+FFFFFEC0] :0054FB75 50 push eax :0054FB76 8D95BCFEFFFF lea edx, dword ptr [ebp+FFFFFEBC] :0054FB7C A1EC635500 mov eax, dword ptr [005563EC] :0054FB81 8B00 mov eax, dword ptr [eax] :0054FB83 8B80E8010000 mov eax, dword ptr [eax+000001E8] :0054FB89 E8CA73EDFF call 00426F58 :0054FB8E 8B85BCFEFFFF mov eax, dword ptr [ebp+FFFFFEBC] :0054FB94 B901000000 mov ecx, 00000001 :0054FB99 8B13 mov edx, dword ptr [ebx] :0054FB9B E82446EBFF call 004041C4 :0054FBA0 8B95C0FEFFFF mov edx, dword ptr [ebp+FFFFFEC0] :0054FBA6 8D45DC lea eax, dword ptr [ebp-24] :0054FBA9 E81A44EBFF call 00403FC8 :0054FBAE FF03 inc dword ptr [ebx] :0054FBB0 4E dec esi :0054FBB1 75BC jne 0054FB6F :0054FBB3 B80D000000 mov eax, 0000000D :0054FBB8 E8BB32EBFF call 00402E78 :0054FBBD 50 push eax :0054FBBE 8B45DC mov eax, dword ptr [ebp-24] :0054FBC1 E8FA43EBFF call 00403FC0 :0054FBC6 5A pop edx :0054FBC7 02D0 add dl, al :0054FBC9 8855E3 mov byte ptr [ebp-1D], dl :0054FBCC 8A45EA mov al, byte ptr [ebp-16] :0054FBCF 8845E4 mov byte ptr [ebp-1C], al :0054FBD2 B80D000000 mov eax, 0000000D :0054FBD7 E89C32EBFF call 00402E78 :0054FBDC 8845E4 mov byte ptr [ebp-1C], al :0054FBDF 8A45EA mov al, byte ptr [ebp-16] :0054FBE2 8845E3 mov byte ptr [ebp-1D], al :0054FBE5 8A45EB mov al, byte ptr [ebp-15] :0054FBE8 8845E4 mov byte ptr [ebp-1C], al :0054FBEB 33F6 xor esi, esi :0054FBED 8D45C8 lea eax, dword ptr [ebp-38] :0054FBF0 8B4DF8 mov ecx, dword ptr [ebp-08] :0054FBF3 BA68FD5400 mov edx, 0054FD68 :0054FBF8 E80F44EBFF call 0040400C :0054FBFD 8B45C8 mov eax, dword ptr [ebp-38] :0054FC00 8BD3 mov edx, ebx :0054FC02 E8F532EBFF call 00402EFC :0054FC07 8BF8 mov edi, eax :0054FC09 C70320000000 mov dword ptr [ebx], 00000020 :0054FC0F 8B0B mov ecx, dword ptr [ebx] | :0054FC11 49 dec ecx | :0054FC12 8B45EC mov eax, dword ptr [ebp-14] | :0054FC15 D3E8 shr eax, cl | :0054FC17 83E001 and eax, 00000001 | :0054FC1A 8B55FC mov edx, dword ptr [ebp-04] | petla, w :0054FC1D 8B0B mov ecx, dword ptr [ebx] | której :0054FC1F 8A540AFF mov dl, byte ptr [edx+ecx-01] |> generowany :0054FC23 325405E3 xor dl, byte ptr [ebp+eax-1D] | jest wlasciwy :0054FC27 33C0 xor eax, eax | fragment :0054FC29 8AC2 mov al, dl | kodu :0054FC2B F72B imul dword ptr [ebx] | :0054FC2D 03F0 add esi, eax | :0054FC2F FF0B dec dword ptr [ebx] | :0054FC31 833B00 cmp dword ptr [ebx], 00000000 | :0054FC34 75D9 jne 0054FC0F | :0054FC36 C705745157008F236900 mov dword ptr [00575174], 0069238F :0054FC40 8B45EC mov eax, dword ptr [ebp-14] :0054FC43 03C7 add eax, edi :0054FC45 33D2 xor edx, edx :0054FC47 8A55E3 mov dl, byte ptr [ebp-1D] :0054FC4A 03C2 add eax, edx :0054FC4C 33D2 xor edx, edx :0054FC4E 8A55E4 mov dl, byte ptr [ebp-1C] :0054FC51 03C2 add eax, edx :0054FC53 2B45F0 sub eax, dword ptr [ebp-10] :0054FC56 B964000000 mov ecx, 00000064 :0054FC5B 99 cdq :0054FC5C F7F9 idiv ecx :0054FC5E 8BC2 mov eax, edx :0054FC60 84C0 test al, al :0054FC62 7407 je 0054FC6B :0054FC64 BE07000000 mov esi, 00000007 :0054FC69 EB29 jmp 0054FC94 :0054FC6B 3BFE cmp edi, esi :0054FC6D 7520 jne 0054FC8F :0054FC6F BE3A346900 mov esi, 0069343A :0054FC74 B888130000 mov eax, 00001388 :0054FC79 E8FA31EBFF call 00402E78 :0054FC7E A374515700 mov dword ptr [00575174], eax :0054FC83 C705745157003A346900 mov dword ptr [00575174], 0069343A :0054FC8D EB05 jmp 0054FC94 :0054FC8F BE01000000 mov esi, 00000001 :0054FC94 E8C799EBFF call 00409660 :0054FC99 DD5DCC fstp qword ptr [ebp-34] :0054FC9C 9B wait :0054FC9D DD45CC fld qword ptr [ebp-34] :0054FCA0 DC65D4 fsub qword ptr [ebp-2C] :0054FCA3 DB2D6CFD5400 fld tbyte ptr [0054FD6C] :0054FCA9 DED9 fcompp :0054FCAB DFE0 fstsw ax :0054FCAD 9E sahf :0054FCAE 7305 jnb 0054FCB5 :0054FCB0 E80FB8FEFF call 0053B4C4 :0054FCB5 33C0 xor eax, eax :0054FCB7 5A pop edx :0054FCB8 59 pop ecx :0054FCB9 59 pop ecx :0054FCBA 648910 mov dword ptr fs:[eax], edx :0054FCBD 6802FD5400 push 0054FD02 :0054FCC2 8D85BCFEFFFF lea eax, dword ptr [ebp+FFFFFEBC] :0054FCC8 BA02000000 mov edx, 00000002 :0054FCCD E89640EBFF call 00403D68 :0054FCD2 8D85C4FEFFFF lea eax, dword ptr [ebp+FFFFFEC4] :0054FCD8 E86740EBFF call 00403D44 :0054FCDD 8D45C8 lea eax, dword ptr [ebp-38] :0054FCE0 E85F40EBFF call 00403D44 :0054FCE5 8D45DC lea eax, dword ptr [ebp-24] :0054FCE8 E85740EBFF call 00403D44 :0054FCED 8D45F8 lea eax, dword ptr [ebp-08] :0054FCF0 BA02000000 mov edx, 00000002 :0054FCF5 E86E40EBFF call 00403D68 :0054FCFA C3 ret
Procedura jest dluga, wiec nie zamierzam opisywac jej dokladnie. Przyjrzyjmy sie uwazniej temu fragmentowi :
:0054FC40 8B45EC mov eax, dword ptr [ebp-14] :0054FC43 03C7 add eax, edi :0054FC45 33D2 xor edx, edx :0054FC47 8A55E3 mov dl, byte ptr [ebp-1D] :0054FC4A 03C2 add eax, edx :0054FC4C 33D2 xor edx, edx :0054FC4E 8A55E4 mov dl, byte ptr [ebp-1C] :0054FC51 03C2 add eax, edx :0054FC53 2B45F0 sub eax, dword ptr [ebp-10] :0054FC56 B964000000 mov ecx, 00000064 :0054FC5B 99 cdq :0054FC5C F7F9 idiv ecx :0054FC5E 8BC2 mov eax, edx :0054FC60 84C0 test al, al :0054FC62 7407 je 0054FC6B :0054FC64 BE07000000 mov esi, 00000007 :0054FC69 EB29 jmp 0054FC94 :0054FC6B 3BFE cmp edi, esi :0054FC6D 7520 jne 0054FC8F
Zacznijmy od konca. Program porównuje edi z esi. W edi znajduja sie 4 cyfry z naszego kodu, natomiast esi wygenerowane jest na podstawie w pierwszych 6 znaków. Tak wiec nasz kod powinien miec postac : 112233xxxx-123, gdzie xxxx jest równe esi. W moim przypadku bylo to : 1122333CD7-123.
Byc moze juz teraz twój kod zostanie przyjety ( masz szanse jak 1:10 ). Ja nie mialem tego szczescia. Tarantula wykonuje jeszcze jedno porównanie. Najpierw dodaje kolejne czesci kodu, a nastepnie sprawdza podzielnosc przez 100 (64h). U mnie wygladalo to mniej wiecej tak :
mov eax,31313232h 31313232h='1122' add 31313232h,3CD7h add 31316F09h,33h 33h='3' add 31316F3Ch,33h 33h='3' sub 31316F6Fh,7Bh 7Bh=123 eax = 31316EF4h = 825323252
Uzyskana liczba musi byc podzielna przez 100 (lub 64h). Mój wynik (825323252) nie jest. Jedynym fragmentem kodu, który mozna zmienic nie wplywajac na jego reszte, jest koncówka '123'. Wiemy,ze 31316F6Fh = 825323375, a wiec musimy odjac na przyklad 177h (375). Otrzymamy wtedy 31316DF8h (825323000), czyli liczbe podzielna przez 64h (100).
Oto mój ostateczny kod : 1122333CD7-375
Na koniec dorzucam jeszcze keygen (gdyby nie SI, nigdy nie udaloby mi sie napisac go w asmie):
.model tiny
.386
.code
org 100h
start:
mov ah,09h
mov dx,offset inscrip
int 21h
;read name
mov dx,[offset maxlen]
mov ah, 0ah
int 21h
cmp [maxlen+1],07h
jb short_end
mov eax,offset spaces
mov ecx,offset regname+1
xor edx,edx
mov dl,[maxlen+1]
sub edx,03h
k1:
mov ebx,[ecx]
mov [eax],ebx
inc eax
inc ecx
dec dl
jnz k1
;generate
mov ah,09h
mov dx,offset regcode
int 21h
mov ebx,offset spaces-1
add ebx,20h
mov ecx,20h
xor esi,esi
k2:
xor eax,eax
mov al,byte ptr[ebx]
xor al,30h
mul ecx
add esi,eax
dec ebx
dec ecx
jnz k2
mov ebx,esi
xor eax,eax
mov al,bh
call write
xor eax,eax
mov ebx,esi
mov al,bl
call write
mov ah,09h
mov dx,offset oper
int 21h
mov eax,37373737h
add eax,60h
add eax,esi
mov edi,eax
mov ecx,64h
xor edx,edx
div ecx
mul ecx
sub edi,eax
mov eax,edi
xor edx,edx
mov ecx,10
div ecx
mov ebx,edx
mov ecx,10h
mul ecx
add eax,ebx
call write
jmp halt
write:
xor edx,edx
mov ecx,10h
div ecx
call print
mov eax,edx
call print
ret
print:
cmp al,09h
jg k3
add al,30h
mov ah,0Eh
mov bx,0
int 10h
jmp k4
k3:
add al,37h
mov ah,0Eh
mov bx,0
int 10h
k4:
ret
short_end:
mov ah,09h
mov dx,offset badname
int 21h
halt:
mov ah,4Ch
int 21h
spaces db ' '
inscrip db '_ _ _ _ _ _ _ _ _ _ _ _',0dh,0ah
db '_ Tarantula 1.99 - KeyGen _',0dh,0ah
db '_ by sIR tHomasRE _',0dh,0ah
db '_ _ _ _ _ _ _ _ _ _ _ _',0dh,0ah
db 'GREETZ to Monter,Maks & <<EMO>>',0dh,0ah
db 'Enter your name : $'
regcode db 0dh,0ah,'Your key : 777700$'
oper db '-9$'
maxlen db 1Ch
regname db 10h dup (0)
badname db 0dh,0ah,'Name too short(7).$'
end start
Jesli macie jeszcze jakies pytanie dotyczace zabezpieczenia programu, piszcie : sirthoma@box43.gnet.pl
GREETZ to Monter,Maks & <<EMO>>