⬆️ ⬇️

Looking for level codes in Prehistorik-2



The game Prehistorik 2 does not provide saves, but at each level there is (dangling in the air at some place in the level) level code. There are two modes of transmission, Beginner and Expert, the code also defines the mode. When you start the game, you can start from the first level, or you can enter a code and get immediately to the appropriate level. On the same computer with a constant environment, the codes do not change, but on different computers the codes, generally speaking, are different, so the codes found during the passage and carefully written out on a piece of paper will become completely useless in another environment. Therefore, instead of paper, it is better to have a program that writes codes for a particular environment. The finished result: genpass.com , is a DOS program that should run in the same environment as the game. An alternative way to get to the desired level from the code entry screen: enter three ADDE C0DE F00D codes or DEAD C0DE F00D, each of the three codes is incorrect in itself, but when you enter them in this order, the fourth code is the level number from 1 to 10, plus 10 for Expert mode, leads immediately to the requested level.



Under the cut - the process of research. Knowledge of x86 assembler is required at least at the “read with dictionary ” level.



Instruments



The main tool is the IDA Pro disassembler. For the study of DOS-programs is quite enough free version 5.0 .

')

There are many different DOS utilities here: http://www.exetools.com/ , some of them will be mentioned later in the text.



Optional tool - debugger. You can use any of the DOS debuggers (the choice is on the link above), their common drawback is the sharing of resources (at least the screen) with the program being debugged. Give all the resources of the program, but at the same time debug it allows the Bochs emulator with a built-in debugger. In addition, you can do without a debugger.



It also does not hurt the hex editor. From the open, apparently, the best - beye (former biew). But you can get by with hexdump to view and echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.

echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.

echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.

echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.

echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
     echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc   ( conv=notrunc   ). 
    





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.
echo -ne '\x..\x..' | dd of= seek= bs=1 conv=notrunc ( conv=notrunc ).





, old-games.ru: pre2orig.exe 52190 . ( ) Hybrid, .



exe' , : exe' , , . , . File Scanner LZEXE, unlzexe. unlzexe, pre2_1.exe 63728 .



pre2_1.exe , "INTRO CODED BY CYBER". :



seg002:5E48 start proc near seg002:5E48 mov cs:pspSeg, ds seg002:5E4D mov ax, cs seg002:5E4F mov es, ax seg002:5E51 assume es:seg002 seg002:5E51 mov cx, 20h seg002:5E54 mov si, 80h seg002:5E57 mov di, si seg002:5E59 rep movsb seg002:5E5B mov ds, ax seg002:5E5D assume ds:seg002 seg002:5E5D call loc_19960 seg002:5E60 mov ax, pspSeg seg002:5E63 add ax, 10h seg002:5E66 add nextCS, ax seg002:5E6A add nextSS, ax seg002:5E6E sub ax, 10h seg002:5E71 mov ds, ax seg002:5E73 assume ds:nothing seg002:5E73 mov es, ax seg002:5E75 assume es:nothing seg002:5E75 mov ax, cs:nextSS seg002:5E79 mov ss, ax seg002:5E7B assume ss:nothing seg002:5E7B mov sp, cs:nextSP seg002:5E80 mov bx, offset nextIP seg002:5E83 jmp dword ptr cs:[bx] seg002:5E83 start endp seg002:5E83 seg002:5E83 ; --------------------------------------------------------------------------- seg002:5E86 nextIP dw 3 ; DATA XREF: start+38 o seg002:5E88 nextCS dw 0 ; DATA XREF: start+1E w seg002:5E8A pspSeg dw 0 ; DATA XREF: start w seg002:5E8A ; start+18 r seg002:5E8C nextSS dw 1681h ; DATA XREF: start+22 w seg002:5E8C ; start+2D r seg002:5E8E nextSP dw 80h ; DATA XREF: start+33 r

DOS PSP 100h , - 80h ( Pascal-: - ). ds es PSP, ds:0+100h = (ds+10h):0. ds, 7 ( assume - , ) ds, es, - loc_19960. , , "" , DOS : ds es PSP, ss:sp , ( pspSeg+10h), , . loc_19960 , ; "This program requires an 80286 or higher", "This program requires a VGA card", "Intro skipped". :

seg002:082F cmp al, '/' seg002:0831 jnz short loc_1A08A seg002:0833 lodsb seg002:0834 and al, not 20h seg002:0836 cmp al, 'N' seg002:0838 jnz short loc_1A08B seg002:083A lodsb seg002:083B and al, not 20h seg002:083D cmp al, 'I' seg002:083F jnz short loc_1A08B

, loc_19960 , /ni . , , Hybrid . , seg002 - , exe'. cs:ip 0000:0003, ss:sp 1681:0080, 5E90h , .



pre2_2.exe 39520 . ( pre2_1.exe Hybrid), . File Scanner "Diet 1.00,1.20" . , diet : . ( ) diet, , , , diet, , , () .



diet cup386 . diet , cup386 pre2_2.exe pre2unp.exe /1 pre2unp.exe 91344 . , pre2unp.exe - , .







. . ( ; , ). , , , . , , , ( , , , ). - "ENTER CODE", . seg002:B171 (IDA exe'), 0B171h :

seg001:99C3 sub_19BC3 proc near ; DATA XREF: sub_1906F+A1 o seg001:99C3 call sub_19D1E seg001:99C6 mov byte_251D7, 3 seg001:99CB mov bx, offset aEnterCode ; "ENTER CODE" seg001:99CE mov word_251D2, 0AF2h seg001:99D4 call sub_19AC4 seg001:99D7 mov byte_251D7, 4 seg001:99DC mov bx, offset levelCode ; "[[[[" seg001:99DF mov word_251D2, 12C9h seg001:99E5 call sub_19AC4 sub_19D1E . sub_19AC4 , "ENTER CODE", 4 , ; , , - .

seg001:99E8 cmp byte_251D6, 1 seg001:99ED jnz short loc_19BF2 seg001:99EF jmp loc_19CF2 seg001:99F2 ; --------------------------------------------------------------------------- seg001:99F2 seg001:99F2 loc_19BF2: ; CODE XREF: sub_19BC3+2A j seg001:99F2 cmp byte_251D6, 2 seg001:99F7 jnz short loc_19BFC seg001:99F9 jmp loc_19D02 seg001:99FC ; --------------------------------------------------------------------------- ... seg001:9AF2 ; --------------------------------------------------------------------------- seg001:9AF2 seg001:9AF2 loc_19CF2: ; CODE XREF: sub_19BC3+2C j seg001:9AF2 inc word_251DC seg001:9AF6 mov bx, word_251DC seg001:9AFA sub bx, 8Ch seg001:9AFE jb short locret_19D1D seg001:9B00 jmp short loc_19D06 seg001:9B02 ; --------------------------------------------------------------------------- seg001:9B02 seg001:9B02 loc_19D02: ; CODE XREF: sub_19BC3+36 j seg001:9B02 ; sub_19BC3+4E j seg001:9B02 inc byte_251DE seg001:9B06 seg001:9B06 loc_19D06: ; CODE XREF: sub_19BC3+13D j seg001:9B06 mov bx, offset levelCode ; "[[[[" seg001:9B09 mov word ptr [bx], '[[' seg001:9B0D mov word ptr [bx+2], '[[' seg001:9B12 mov byte_251D6, 0 seg001:9B17 mov word_251D4, 0 seg001:9B1D seg001:9B1D locret_19D1D: ; CODE XREF: sub_19BC3+42 j seg001:9B1D ; sub_19BC3+60 j ... seg001:9B1D retn seg001:9B1D sub_19BC3 endp byte_251D6 == 1 word_251DC , 8Ch, byte_251D6 0, . , , . byte_251D6 == 2 , ; .

seg001:99FC seg001:99FC loc_19BFC: ; CODE XREF: sub_19BC3+34 j seg001:99FC mov bl, ScanCode seg001:9A00 test bl, 80h seg001:9A03 jz short loc_19C08 seg001:9A05 jmp locret_19D1D seg001:9A08 ; --------------------------------------------------------------------------- seg001:9A08 seg001:9A08 loc_19C08: ; CODE XREF: sub_19BC3+40 j seg001:9A08 mov al, KeysPressed+39h seg001:9A0B or al, KeysPressed+1Ch seg001:9A0F jz short loc_19C14 seg001:9A11 jmp loc_19D02 seg001:9A14 ; --------------------------------------------------------------------------- seg001:9A14 seg002:2870 . ( IDA) , , 60h. , - , - ; ScanCode . , : KeyPressed ( ) (0 = , 0FFh = ). : KeyPressed[39h] KeyPressed[1Ch] - Enter . Enter ( ) , , .

seg001:9A14 loc_19C14: ; CODE XREF: sub_19BC3+4C j seg001:9A14 mov ScanCode, 0 seg001:9A19 xor bh, bh seg001:9A1B mov al, byte ptr a1234567890AEADfCB[bx] ; "--1234567890----AE-----------A-DF-----"... seg001:9A1F cmp al, '-' seg001:9A21 jnz short loc_19C26 seg001:9A23 jmp locret_19D1D seg001:9A26 ; --------------------------------------------------------------------------- seg001:9A26 seg001:9A26 loc_19C26: ; CODE XREF: sub_19BC3+5E j seg001:9A26 mov ah, al seg001:9A28 sub ah, '0' seg001:9A2B cmp ah, 9 seg001:9A2E jbe short loc_19C33 seg001:9A30 sub ah, 7 seg001:9A33 seg001:9A33 loc_19C33: ; CODE XREF: sub_19BC3+6B j . "--1234567890----AE-----------A-DF------------CB-...-", ASCII- ( , , ASCII- 'A' A, Q - , AZERTY). ASCII- hex-, . , 0 0Fh.

seg001:9A33 mov dx, word_251E5 seg001:9A37 mov cl, 4 seg001:9A39 shl ah, cl seg001:9A3B shl ah, 1 seg001:9A3D rcl dx, 1 seg001:9A3F shl ah, 1 seg001:9A41 rcl dx, 1 seg001:9A43 shl ah, 1 seg001:9A45 rcl dx, 1 seg001:9A47 shl ah, 1 seg001:9A49 rcl dx, 1 seg001:9A4B mov word_251E5, dx seg001:9A4F mov bx, word_251D4 seg001:9A53 mov byte ptr levelCode[bx], al ; "[[[[" seg001:9A57 inc word_251D4 seg001:9A5B inc bl seg001:9A5D cmp bl, 4 seg001:9A60 jnb short loc_19C65 seg001:9A62 jmp locret_19D1D seg001:9A65 ; --------------------------------------------------------------------------- word_251E5 4 , , . , word_251D4 . 4 , . 4 word_251E5 16- , ("1234" -> 1234h), .

seg001:9A65 seg001:9A65 loc_19C65: ; CODE XREF: sub_19BC3+9D j seg001:9A65 push bp seg001:9A66 mov word_251DC, 0 seg001:9A6C mov di, word_251DF seg001:9A70 mov si, word_251E1 seg001:9A74 mov bp, word_251E3 seg001:9A78 mov ax, di seg001:9A7A rol ax, 1 seg001:9A7C rol ax, 1 seg001:9A7E mul ah seg001:9A80 xor ax, si seg001:9A82 mul bp seg001:9A84 mov bx, ax seg001:9A86 add bx, si seg001:9A88 ror bx, 1 seg001:9A8A rol bl, 1 seg001:9A8C xor bl, bh seg001:9A8E xor bx, bp seg001:9A90 pop bp seg001:9A91 cmp ax, 36C8h seg001:9A94 jnz short loc_19CAC seg001:9A96 cmp bx, 8BD1h seg001:9A9A jnz short loc_19CAC seg001:9A9C cmp dx, 8E71h seg001:9AA0 jnz short loc_19CAC seg001:9AA2 mov dx, word_251E5 seg001:9AA6 dec dx seg001:9AA7 cmp dx, 14h seg001:9AAA jbe short loc_19CD9 seg001:9AAC seg001:9AAC loc_19CAC: ; CODE XREF: sub_19BC3+D1 j seg001:9AAC ; sub_19BC3+D7 j ... word_251DC . , word_251E5 , 1 15h , loc_19CD9 dx , . , .

seg001:9AAC xor dx, dx seg001:9AAE seg001:9AAE loc_19CAE: ; CODE XREF: sub_19BC3+FA j seg001:9AAE mov ax, dx seg001:9AB0 call sub_19559 seg001:9AB3 cmp word_251E5, ax seg001:9AB7 jz short loc_19CD9 seg001:9AB9 inc dx seg001:9ABA cmp dx, 14h seg001:9ABD jbe short loc_19CAE seg001:9ABF mov si, offset word_251E1 seg001:9AC2 mov ax, [si] seg001:9AC4 mov [si-2], ax seg001:9AC7 mov ax, [si+2] seg001:9ACA mov [si], ax seg001:9ACC mov ax, [si+4] seg001:9ACF mov [si+2], ax seg001:9AD2 mov byte_251D6, 1 seg001:9AD7 jmp short locret_19D1D seg001:9AD9 ; --------------------------------------------------------------------------- . word_251E5 sub_19559 , dx 0 14h. loc_19CD9 dx , sub_19559 . , sub_19559 .



, byte_251D6 1 ( , ), . , , ; , .

seg001:9AD9 seg001:9AD9 loc_19CD9: ; CODE XREF: sub_19BC3+E7 j seg001:9AD9 ; sub_19BC3+F4 j seg001:9AD9 mov al, 0 seg001:9ADB cmp dl, 0Ah seg001:9ADE jb short loc_19CE4 seg001:9AE0 sub dl, 0Ah seg001:9AE3 inc ax seg001:9AE4 seg001:9AE4 loc_19CE4: ; CODE XREF: sub_19BC3+11B j seg001:9AE4 mov byte_1CDB6, dl seg001:9AE8 mov byte_251C3, al seg001:9AEB mov byte_251D6, 2 seg001:9AF0 jmp short locret_19D1D

: dx 10, byte_1CDB6 , byte_251C3 ; byte_1CDB6 dx-10 , byte_251C3 . byte_251D6 2, .



, , sub_19599 , / , . : word_2435F 10h BIOS F000:FFF0 ( BIOS) 80h BIOS C000:0000 F000:0000. :

; ax = zero-based level seg001:93C6 xor ax, 55A3h seg001:93C9 mul word_2435F seg001:93CD mov cl, cs:ProcessorType ; always 3 for 386+ seg001:93D2 rol ax, cl sub_19599 ( - 386+ 3), , : genpass.asm , genpass.com .



"" : , ( hex 1-based). , : dx:ax 8E7136C8h, bx 8BD1h. , , , dx:ax mul bp 8E7136C8h - 16- : . bx - . 8E7136C8h , 2 3 *7*4861*8779; 16- , 4861 8779 , 2 3 *7 - . (16 - 16-). ; - , , bx, 8- . 16- 8-, , , ( 8- ). : getmagic.c , : ADDE C0DE F00D DEAD C0DE F00D.

Source: https://habr.com/ru/post/187072/



All Articles