home *** CD-ROM | disk | FTP | other *** search
/ The Elite Hackers Toolkit / TheEliteHackersToolkitVolume1_1998.rar / HACKERS.BIN / appcraks / HSRSRC.ZIP / HSR.ASM < prev    next >
Assembly Source File  |  1998-01-26  |  32KB  |  1,187 lines

  1. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2. ;
  3. ;   HackStop Unpacker v1.14 - (C)Copyright 1997 by Stefan Esser
  4. ;
  5. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  6.  
  7. ; History
  8. ; ~~~~~~~
  9. ;   v1.13 - v1.14    Ralph's Entrypoint-CRC does no longer work...
  10. ;   v1.12 - v1.13    Stonehead passed me an old version, that did not work
  11. ;   v1.11 - v1.12    Hehe, Ralph changed HS again... v1.18 seems to be added.
  12. ;   v1.10 - v1.11    HS v1.17ß63 added! 
  13. ;   v1.01 - v1.10    HS v1.17ß5 is bugfixed! The unpacking routine does
  14. ;                    not work anymore... Wrote a new routine!
  15. ;   v1.00 - v1.01    HS v1.14-v1.16 signature is also valid for
  16. ;                    the early betas of HS v1.17. Fixed that!
  17.  
  18. ;
  19. ; NOTE   after compilation you have to adjust the max value in
  20. ; NOTE   the MZ exe header...
  21. ;
  22.  
  23.  
  24. .286
  25. .model small
  26. .code
  27. .386
  28.  
  29. db 13,10,13,10
  30. db "| | .-- ,-, |     --+-- | | .--    |   | ,-, ,-, |   |\ ",13,10
  31. db "| | |   | | |       |   | | |      | . | | | | | |   | |",13,10
  32. db "|-| |-- |-| |       |   |-| |--    | | | | | |/  |   | |",13,10
  33. db "| | |   | | |       |   | | |      | | | | | |\  |   | |",13,10
  34. db "| | `-- | | `--     |   | | `--     ~ ~  `-' | \ `-- |/ ",13,10
  35. db 13,10,13,10
  36.  
  37. ;-----------------------------------------------------------------------------
  38. ; MACRO: saveregs - saves register in code-segment variables
  39. ;-----------------------------------------------------------------------------
  40.  
  41. saveregs macro
  42.       PUSHF
  43.       MOV       CS:[_oldAX_], AX
  44.       MOV       CS:[_oldBX_], BX
  45.       MOV       CS:[_oldCX_], CX
  46.       MOV       CS:[_oldDX_], DX
  47.       MOV       CS:[_oldDI_], DI
  48.       MOV       CS:[_oldSI_], SI
  49.       MOV       CS:[_oldBP_], BP
  50.       MOV       CS:[_oldSP_], SP
  51.       MOV       CS:[_oldDS_], DS
  52.       MOV       CS:[_oldES_], ES
  53.       MOV       CS:[_oldSS_], SS
  54.       ADD       SP, 2
  55.       POP       AX
  56.       POP       BX
  57.       MOV       CS:[_oldIP_], AX
  58.       MOV       CS:[_oldCS_], BX
  59.       PUSH      BX
  60.       PUSH      AX
  61.       SUB       SP, 2
  62.       MOV       AX, CS:[_oldAX_]
  63.       MOV       BX, CS:[_oldBX_]
  64. endm
  65.  
  66. ;-----------------------------------------------------------------------------
  67. ; MACRO: restoreregs - restores registers from code-segment variables
  68. ;-----------------------------------------------------------------------------
  69.  
  70. restoreregs macro
  71.       MOV       AX, CS:[_oldAX_]
  72.       MOV       BX, CS:[_oldBX_]
  73.       MOV       CX, CS:[_oldCX_]
  74.       MOV       DX, CS:[_oldDX_]
  75.       MOV       SI, CS:[_oldSI_]
  76.       MOV       DI, CS:[_oldDI_]
  77.       MOV       SP, CS:[_oldSP_]
  78.       MOV       BP, CS:[_oldBP_]
  79.       MOV       DS, CS:[_oldDS_]
  80.       MOV       ES, CS:[_oldES_]
  81.       MOV       SS, CS:[_oldSS_]
  82.       POPF
  83. endm
  84.  
  85. ;-----------------------------------------------------------------------------
  86. ; PROCEDURE: procedure PRINT HEX NUM
  87. ;-----------------------------------------------------------------------------
  88.  
  89. hexstring db "0123456789ABCDEF"
  90.  
  91. print_hex_num proc
  92.       PUSH      BX
  93.       MOV       BX, AX
  94.       XOR       BH, BH
  95.       PUSH      BX
  96.       MOV       AH, 0Eh
  97.       SHR       BL, 4
  98.       MOV       AL, CS:[hexstring+BX]
  99.       XOR       BX, BX
  100.       INT       10h
  101.       POP       BX
  102.       AND       BL, 15
  103.       MOV       AL, CS:[hexstring+BX]
  104.       XOR       BX, BX
  105.       INT       10h
  106.       MOV       AX, 0E20h
  107.       INT       10h
  108.       POP       BX
  109.       RET
  110. endp
  111.  
  112. ;-----------------------------------------------------------------------------
  113. ; PROCEDURE: procedure PRINT STRING
  114. ;-----------------------------------------------------------------------------
  115.  
  116. print_string proc
  117.       XOR       BX, BX
  118. startofprint:
  119.       DB        2Eh  ; <-- CS prefix
  120.       LODSB
  121.       OR        AL, AL
  122.       JZ        endofprint
  123.       MOV       AH, 14
  124.       INT       10h
  125.       JMP       startofprint
  126. endofprint:
  127.       RET
  128. endp
  129.  
  130. ;-----------------------------------------------------------------------------
  131. ; PROCEDURE: procedure SAVE EXE
  132. ;-----------------------------------------------------------------------------
  133.  
  134. save_exe proc
  135.       MOV       SI, offset msg10
  136.       CALL      print_string
  137.  
  138.       ; <-- write CS,IP
  139.  
  140.       MOV       EAX, 14h
  141.       CALL      fileseekb
  142.  
  143.       MOV       AH, 40h
  144.       MOV       BX, CS:[_filehandle_]
  145.       PUSH      CS
  146.       POP       DS
  147.       MOV       DX, offset _origIP_
  148.       MOV       CX, 4
  149.       INT       21h
  150.       JC        failed1
  151.  
  152.       ; <-- write SS,SP
  153.  
  154.       MOV       EAX, 0eh
  155.       CALL      fileseekb
  156.  
  157.       MOV       AH, 40h
  158.       MOV       BX, CS:[_filehandle_]
  159.       PUSH      CS
  160.       POP       DS
  161.       MOV       DX, offset _origSS_
  162.       MOV       CX, 4
  163.       INT       21h
  164.       JC        failed1
  165.  
  166.       ; <-- write SIZE
  167.  
  168.       MOV       EAX, 2
  169.       CALL      fileseekb
  170.  
  171.       MOV       EAX, CS:[origsize]
  172.       MOV       BX, AX
  173.       SHR       EAX, 9
  174.       AND       BX, 1ffh
  175.       MOV       CS:[rest], BX
  176.       OR        BX, BX
  177.       JZ        donotinc
  178.       INC       EAX
  179. donotinc:
  180.       MOV       CS:[pages], AX
  181.       
  182.  
  183.       MOV       AH, 40h
  184.       MOV       BX, CS:[_filehandle_]
  185.       PUSH      CS
  186.       POP       DS
  187.       MOV       DX, offset rest
  188.       MOV       CX, 4
  189.       INT       21h
  190.       JC        failed1
  191.  
  192.       MOV       EAX, CS:[origsize]
  193.       CALL      fileseekb
  194.  
  195.       MOV       AH, 40h
  196.       MOV       BX, CS:[_filehandle_]
  197.       MOV       CX, 0
  198.       INT       21h
  199.       JC        failed1
  200.       JMP       ok1
  201. endp
  202.  
  203. msg1    DB        "HackStop Remover V1.14                                               14 Dec 1997"
  204.         DB        "Copyright (c) 1997 by Stefan Esser                           All Rights Reserved"
  205.         DB        "Copy registered to: PUBLIC!",13,10,0
  206. strich  DB        "────────────────────────────────────────────────────────────────────────────────",0
  207. msgu    DB  13,10,"Usage: HSREMOVE FileName.ext",13,10,0
  208. msg2    DB        "  ■ Opening File.                     ",0
  209. msg3    DB        "  ■ Retrieving File Date&Time.        ",0
  210. msg4    DB        "  ■ Checking for .EXE Format.         ",0
  211. msg5    DB        "  ■ Checking for HS generic id.       ",0
  212. msg6    DB        "  ■ Detecting HS version.             ",0
  213. msg7p1  DB        "  ■   => [",0
  214. msg7p2  DB                  "/2] Signatures Found.      ",0
  215. msgmod  DB        "  ■ Maybe modified. Continue? (y/n).",0
  216. msg8    DB        "  ■ Reading Hackstop loader.          ",0
  217. msg9    DB        "  ■ Retrieving encrypted information. ",0
  218. msg10   DB        "  ■ Writing deprotected file.         ",0
  219. msg11a  DB        "  ■ Restoring File Date&Time.         ",0
  220. msg11   DB        "  ■ Closing File.                     ",0
  221. msgGTab DW        offset msgG0
  222.         DW        offset msgG1
  223.         DW        offset msgG2
  224. msgG0   DB        "BAD",13,10,0
  225. msgG2   DB        "VERY "
  226. msgG1   DB        "GOOD",13,10,0
  227. msgOK   DB        "OK",13,10,0
  228. msgOK1  DB        "OK, reports v",0
  229. msgFAIL DB        "FAILED",13,10,0
  230. msgFAIL2 DB    13,"  ■ ERROR: unexpected error!          ",13,10,0
  231. msgID   DB        "  ■ ID= ",0
  232. msgRET  DB        13,10,0
  233.  
  234. ; HS nametable
  235. hstable:
  236.         dw offset sig093s, offset sig093
  237.         dw offset sig100s, offset sig100
  238.         dw offset sig110s, offset sig110
  239.         dw offset sig111s, offset sig111
  240.         dw offset sig111iss, offset sig111is
  241.         dw offset sig112s, offset sig112
  242.         dw offset sig113s, offset sig113
  243.         dw offset sig114s, offset sig114
  244.         dw offset sig117s, offset sig117
  245.         dw offset sig1176s, offset sig1176
  246.         dw offset sig118s, offset sig118
  247.         dw offset sig118s2, offset sig1182
  248.         dw 0
  249.  
  250. ; HS names
  251. sig093s db        "OK, v0.9?",0
  252. sig093  db        0B4h,30h,0cdh,21h,86h,0e0h,3dh,0h,3,73h,2h,0cdh,020h,050h,0b8h, 0ebh
  253.  
  254. sig100s db        "OK, v1.0?",0
  255. sig100  db        0B4h,30h,0cdh,21h,86h,0e0h,3dh,0h,3,73h,6h,0b0h,0ffh,0b4h,4ch, 0cdh
  256.  
  257. sig110s DB        "OK, v1.10α",0
  258. sig110  DB        0B4h,30h,0cdh,21h,86h,0e0h,3dh,0h,3,73h,12h,0b4h,02fh,0cdh,21h,0b4h
  259.  
  260. sig111s DB        "OK, v1.11",0
  261. sig111  DB        0B4h,30h,0cdh,21h,86h,0e0h,3dh,0h,3,73h,0ah,0b4h,02fh,0cdh,21h,0b0h
  262.  
  263. sig111iss DB      "OK, v1.11is",0
  264. sig111is  DB      52h,1eh,0b4h,30h,0cdh,21h,86h,0e0h,3dh,0ffh,2,73h,2,0cdh,20h,0eh
  265.  
  266. sig112s DB        "OK, v1.12",0
  267. sig112  DB        0B8h,0,30h,52h,1eh,0cdh,21h,86h,0e0h,3dh,0feh,2,73h,2,0cdh,20h
  268.  
  269. sig113s DB        "OK, v1.12hs - v1.13",0
  270. sig113  DB        52h,0b8h,0,30h,1eh,0cdh,21h,86h,0e0h,3dh,0ffh,2,73h,2,0cdh,20h
  271.  
  272. sig114s DB        "OK, v1.14 - v1.17ß",0
  273. sig114  DB        52h,0b8h,2,30h,1eh,0cdh,21h,86h,0e0h,3dh,0feh,2,73h,2,0cdh,20h
  274.  
  275. sig117s DB        "OK, v1.17ß3",0
  276. sig117  DB        3ah,0dbh,74h,7,0b8h,1,4ch,0cdh,21h,0ebh,1eh,0b4h,30h,0cdh,21h,0fah
  277.  
  278. sig1176s DB       "OK, v1.17ß63",0
  279. sig1176  DB       1eh,0b4h,30h,0cdh,21h,03ch,002h,073h,005h,033h,0c0h,006h,050h,0cbh,0bfh,066h
  280.  
  281. sig118s  DB       "OK, v1.18",0
  282. sig118   DB       1eh,52h,0b8h,4dh,30h,0cdh,21h,86h,0c4h,3dh,0feh,2,73h,2,0cdh,20h
  283.  
  284. sig118s2 DB       "OK, v1.18 Build 66-69",0
  285. sig1182  DB       52h,0bah,0ebh,04h,05ah,0ebh,0fbh,09ah
  286.          DB       1eh,52h,0b8h,42h,30h,0cdh,21h,86h
  287.                  
  288.  
  289. sigf    DB        " signature found",13,10,0
  290.  
  291. interrupt14h proc
  292.       saveregs
  293.       mov       ax, cs:[_oldSS_]
  294.       mov       cs:[_origSS_], ax
  295.       mov       ah, 62h
  296.       int       21h
  297.       sub       cs:[_origSS_], bx
  298.       sub       word ptr cs:[_origSS_], 10h
  299.       
  300.       mov       ax, cs:[_oldSP_]
  301.       mov       cs:[_origSP_], ax
  302.       add       word ptr cs:[_origSP_], 8
  303.       mov       ax, cs:[stackadjust]
  304.       add       word ptr cs:[_origSP_], ax
  305.       mov       bp, sp
  306.       mov       es, [bp+4]
  307.       mov       di, [bp+2]
  308.       mov       word ptr es:[di], 4cb4h
  309.       mov       word ptr es:[di+2], 21cdh
  310.       restoreregs
  311.       iret
  312. endp
  313.  
  314.  
  315. ;-----------------------------------------------------------------------------
  316. ; INTERRUPT: interrupt21h - new interrupt 21h
  317. ;-----------------------------------------------------------------------------
  318.  
  319. interrupt21h proc
  320.       saveregs
  321.       CMP       byte ptr CS:[done], 0
  322.       JNE       endh
  323.       MOV       AX, CS:[_oldCS_]  ; Still in HS code
  324.       OR        AX, AX
  325.       JE        endh
  326.       CMP       AX, CS:[validCS]
  327.       JE        endh              ; <-- then exit handler
  328.       ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  329.       ;██▓ search for decrypted values ▓██
  330.       ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  331.       MOV       byte ptr CS:[done], 1  ; <-- nur einmal!!!
  332.       
  333.       MOV       ES, CS:[validCS]
  334. MOV  DI, 30
  335.    ;   XOR       DI, DI
  336.       MOV       CX, CS:[hstopsize]
  337. search_loop0:
  338.       MOV       AL, 0eah          ; <-- search for "call near" opcode
  339.       REPNE     SCASB
  340.       JNE       not_found      ; if nothing found then leave
  341.       CMP       byte ptr ES:[DI-2], 0eah
  342.       JZ        search_loop0
  343.       
  344.       CMP       byte ptr ES:[DI-4], 0e9h
  345.       MOV       BX, -1
  346.       JNZ       maches
  347.       MOV       BX, -4
  348. maches:
  349. suber:      
  350.       SUB       BX, 2
  351.       CMP       BX, -21
  352.       JE        oldfrage2
  353.       CMP       byte ptr ES:[DI+BX], 02bh    ; IS SUB?
  354.       JE        suber
  355.       CMP       byte ptr ES:[DI+BX], 033h    ; IS XOR?
  356.       JE        suber
  357.       CMP       word ptr ES:[DI+BX], 0fae2h  ; IS LOOP?
  358.       JE        nuke
  359.       CMP       word ptr ES:[DI+BX], 0f9e2h
  360.       JNE       oldfrage2
  361. nuke:      
  362.       JMP       storevalues0
  363. oldfrage2:
  364.  
  365. oldfrage4:
  366.       CMP       word ptr ES:[DI+4], 'OR'
  367.       JNE       oldfrage 
  368.       CMP       word ptr ES:[DI+6], 'ES'
  369.       JE        storevalues0
  370.    
  371. oldfrage:
  372.       MOV       AX, es:[DI]
  373.       CMP       ES:[DI+6], AX
  374.       JNE       search_loop0
  375.       MOV       AH, 62h
  376.       PUSHF
  377.       CALL      dword ptr CS:[_oldoff_]
  378.       MOV       AX, ES:[DI+4]
  379.       ADD       AX, 10h
  380.       ADD       AX, BX
  381.       CMP       ES:[DI+2], AX
  382.       JE        storevalues0
  383.       JMP       search_loop0
  384. storevalues0:
  385.       MOV       byte ptr CS:[found], 1  ; <-- nur einmal!!!
  386.       MOV       byte ptr CS:[newrout], 1  ; <-- new routine used
  387.                                           ;     need second pass !!!
  388.  
  389.       CMP       byte ptr ES:[DI-4], 0e9h
  390.       JNZ       nixzumachen
  391.       ADD       DI, ES:[DI-3]
  392. nixzumachen:
  393.       MOV       AX, ES:[DI]     ; <-- get original IP
  394.       MOV       CS:[_origIP_], AX ; <-- store
  395.       MOV       AX, ES:[DI+2]     ; <-- get original CS
  396.       MOV       CS:[_origCS_], AX ; <-- store
  397.       
  398.       MOV       AH, 62h
  399.       PUSHF
  400.       CALL      dword ptr CS:[_oldoff_]
  401.       SUB       CS:[_origCS_], BX
  402.       SUB       word ptr CS:[_origCS_], 10h
  403.       JMP       not_found
  404.       
  405.       
  406. not_found:
  407.       MOV       word ptr CS:[_oldAX_], 4C00h
  408. endh: restoreregs
  409.  
  410.       ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  411.       ;██▓ jmp back to the old handler ▓██
  412.       ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  413.          db        234   ; <-- opcode for "jmp far"
  414. _oldoff_ dw        0     ; <-- offset of the old handler
  415. _oldseg_ dw        0     ; <-- segment of the old handler
  416. endp
  417.  
  418. ;-----------------------------------------------------------------------------
  419. ; REGISTER VARIABLES
  420. ;-----------------------------------------------------------------------------
  421.  
  422. _oldAX_    dw  0
  423. _oldBX_    dw  0
  424. _oldCX_    dw  0
  425. _oldDX_    dw  0
  426. _oldSI_    dw  0
  427. _oldDI_    dw  0
  428. _oldSP_    dw  0
  429. _oldBP_    dw  0
  430. _oldIP_    dw  0
  431. _oldCS_    dw  0
  432. _oldDS_    dw  0
  433. _oldES_    dw  0
  434. _oldSS_    dw  0
  435.  
  436. ;-----------------------------------------------------------------------------
  437. ; VARIABLES
  438. ;-----------------------------------------------------------------------------
  439.  
  440. _origIP_   dw  0    ; <-- *** DO NOT CHANGE ORDER ***
  441. _origCS_   dw  0
  442. _origSS_   dw  0
  443. _origSP_   dw  0
  444.  
  445. eh_id      dw  0    ; <-- EXE Header
  446. eh_rest    dw  0
  447. eh_pages   dw  0
  448. eh_reloc   dw  0
  449. eh_hsize   dw  0
  450. eh_min     dw  0
  451. eh_max     dw  0
  452. eh_ss      dw  0
  453. eh_sp      dw  0
  454. eh_csum    dw  0
  455. eh_ip      dw  0
  456. eh_cs      dw  0
  457.  
  458. hsid       dw  0    ; <-- HS - Signature
  459. hsverhi    db  0
  460. hsverlo    db  0
  461. hsvdef     db  'MsDos'
  462.  
  463. hsheader   db  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  464.            db  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  465.            db  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  466.            db  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  467.  
  468. rest       dw  0
  469. pages      dw  0
  470. sfsize     dd  0  ; <-- stored filesize
  471. rfsize     dd  0  ; <-- real filesize
  472. fileip     dw  0
  473. filecs     dw  0
  474.  
  475. FCB1       db  0,32,32,32,32,32,32,32,32, 32,32,32, 0,0,0,0
  476. FCB2       db  0,32,32,32,32,32,32,32,32, 32,32,32, 0,0,0,0
  477. CTAIL      db  1,32,0d
  478.  
  479. paraENV    dw  0
  480. paraCT     dw  offset CTAIL
  481.            dw  0
  482. paraFCB1   dw  offset FCB1
  483.            dw  0
  484. paraFCB2   dw  offset FCB2
  485.            dw  0
  486. paraSP     dw  0
  487. paraSS     dw  0
  488. paraIP     dw  0
  489. paraCS     dw  0
  490.  
  491. origsize   dd  0  ; <-- filesize before hackstoped (for <HS17)
  492.  
  493. stackadjust dw 0
  494.  
  495. _filehandle_  dw  0
  496. hstopsize     dw  0
  497. filenameoffset dw 0
  498. startupseg dw 0
  499. filedate dw 0
  500. filetime dw 0
  501. validcs  dw 0
  502. done     db 0
  503. found    db 0
  504. newrout  db 0
  505. ownSP    dw 0
  506. ownSS    dw 0
  507.  
  508. getparameter proc
  509.       MOV       SI, 81h
  510.       MOV       DS, CS:[startupseg]
  511.       MOV       CS:[filenameoffset],0
  512. gploop1:      
  513.       LODSB
  514.       CMP       AL, 0
  515.       JZ        exitgp
  516.       CMP       AL, 32
  517.       JZ        gploop1
  518.       CMP       AL, 13
  519.       JZ        exitgp
  520.       DEC       SI
  521.       MOV       CS:[filenameoffset],SI
  522. gploop2:
  523.       LODSB
  524.       CMP       AL, 0
  525.       JZ        exitgp
  526.       CMP       AL, 32
  527.       JZ        exitloop2
  528.       CMP       AL, 13
  529.       JZ        exitloop2
  530.       JMP       gploop2
  531. exitloop2:
  532.       MOV       byte ptr DS:[SI-1],0
  533. exitgp:
  534.       RET
  535. endp
  536.  
  537. background proc
  538.       MOV       CS:[startupseg], DS
  539.       MOV       SI, offset strich
  540.       CALL      print_string
  541.       MOV       SI, offset msg1
  542.       CALL      print_string
  543.       CALL      getparameter
  544.       CMP       CS:[filenameoffset],0
  545.       JNZ       continue
  546.       MOV       SI, offset msgu
  547.       CALL      print_string
  548.       MOV       SI, offset strich
  549.       CALL      print_string
  550.       MOV       AX, 4C00h
  551.       INT       21h
  552. continue:
  553.       MOV       SI, offset strich
  554.       CALL      print_string
  555.       RET
  556. endp
  557.  
  558. failed1 proc
  559.       MOV       SI, offset msgFAIL
  560.       CALL      print_string
  561.       STC
  562.       RET
  563. endp
  564.  
  565. failed2 proc
  566.       MOV       SI, offset msgFAIL2
  567.       CALL      print_string
  568.       MOV       AX, 4C00h
  569.       INT       21h
  570.       RET
  571. endp
  572.  
  573. ok1 proc
  574.       MOV       SI, offset msgOK
  575.       CALL      print_string
  576.       CLC
  577.       RET
  578. endp
  579.  
  580. closefile proc
  581.       MOV       SI, offset msg11
  582.       CALL      print_string
  583.       MOV       AH, 3Eh
  584.       MOV       BX, CS:[_filehandle_]
  585.       INT       21h
  586.       JC        failed1
  587.       JMP       ok1
  588. endp
  589.  
  590. savedt proc
  591.       MOV       SI, offset msg3
  592.       CALL      print_string
  593.       MOV       AX, 5700h
  594.       MOV       BX, CS:[_filehandle_]
  595.       JC        failed1
  596.       MOV       CS:[filedate], DX
  597.       MOV       CS:[filetime], CX
  598.       JMP       ok1
  599. endp
  600.  
  601. restoredt proc
  602.       MOV       SI, offset msg11a
  603.       CALL      print_string
  604.       MOV       AX, 5701h
  605.       MOV       BX, CS:[_filehandle_]
  606.       MOV       DX, CS:[filedate]
  607.       MOV       CX, CS:[filetime]
  608.       JC        failed1
  609.       JMP       ok1
  610. endp
  611.  
  612. checkexe proc
  613.       MOV       SI, offset msg4
  614.       CALL      print_string
  615.       MOV       AH, 3Fh
  616.       MOV       CX, 18h
  617.       MOV       BX, CS:[_filehandle_]
  618.       MOV       DX, offset eh_id
  619.       PUSH      CS
  620.       POP       DS
  621.       INT       21h
  622.       JC        failed1
  623.       CMP       AX, 18h
  624.       JNE       failed1
  625.       CMP       CS:[eh_id], 'MZ'
  626.       JE        check1
  627.       CMP       CS:[eh_id], 'ZM'
  628.       JE        check1
  629.       JMP       failed1
  630.  
  631. check1:
  632.       ; <-- from here on get stored filesize
  633.       MOVZX     EAX, CS:[eh_pages]
  634.       CMP       CS:[eh_rest],0
  635.       JE        last_page_is_filled_up
  636.       DEC       EAX
  637. last_page_is_filled_up:
  638.       SHL       EAX, 9
  639.       MOVZX     EBX, CS:[eh_rest]
  640.       ADD       EAX, EBX            ; <-- calculate stored filesize
  641.       MOV       CS:[sfsize], EAX
  642.       ; <-- from here on get actual filesize
  643.       MOV       AX, 4202h
  644.       XOR       CX, CX
  645.       XOR       DX, DX
  646.       MOV       BX, CS:[_filehandle_]
  647.       INT       21h
  648.       JC        failed1 ; <-- positioning error
  649.       ROL       EAX, 16
  650.       MOV       AX, DX
  651.       ROL       EAX, 16
  652.       MOV       CS:[rfsize], EAX
  653.       CMP       EAX, CS:[sfsize]
  654.       JB        failed1 ; <-- real filesize<store filesize then error in .EXE
  655.       MOVSX     EAX, CS:[eh_cs]
  656.       SAL       EAX, 4
  657.       MOVZX     EBX, CS:[eh_ip]
  658.       ADD       EAX, EBX  ; <-- relative entrypoint to image start
  659.       MOVZX     EBX, CS:[eh_hsize]
  660.       SHL       EBX, 4
  661.       ADD       EAX, EBX  ; <-- relative entrypoint to filestart
  662.       CMP       EAX, CS:[sfsize]
  663.       JA        failed1
  664.       MOV       CS:[origsize], EAX ; <-- ATTENTION: not for HS17
  665.       
  666.       JMP       ok1
  667. endp
  668.  
  669. idcheck proc
  670.       MOV       SI, offset msg5
  671.       CALL      print_string
  672.       MOV       EAX, CS:[sfsize]
  673.       SUB       EAX, 9
  674.       MOV       DX, AX
  675.       ROL       EAX, 16
  676.       MOV       CX, AX
  677.       MOV       BX, CS:[_filehandle_]
  678.       MOV       AX, 4200h
  679.       INT       21h
  680.       JC        failed1
  681.  
  682.       MOV       AH, 3Fh
  683.       MOV       CX, 9
  684.       MOV       BX, CS:[_filehandle_]
  685.       MOV       DX, offset hsID
  686.       PUSH      CS
  687.       POP       DS
  688.       INT       21h
  689.       JC        failed1
  690.       CMP       AX, 9
  691.       JNE       failed1
  692.  
  693.       CMP       word ptr CS:[hsVDef], 'sM'
  694.       JNE       failed1
  695.       CMP       word ptr CS:[hsVDef+2], 'oD'
  696.       JNE       failed1
  697.       CMP       byte ptr CS:[hsVDef+4], 's'
  698.       JNE       failed1
  699.       INC       CS:[numids]
  700.       CMP       CS:[hsID], 'SH'
  701.       JNE       ok1
  702.       
  703.       MOV       SI, offset msgok1
  704.       CALL      print_string
  705.  
  706.       XOR       BX, BX
  707.       MOV       AL, CS:[hsverhi]
  708.       XOR       AH, AH
  709.       MOV       BL, 10
  710.       DIV       BL
  711.       MOV       AH, 14
  712.       OR        AL, AL
  713.       JZ        keine0
  714.       ADD       AL, '0'
  715.       INT       10h
  716. keine0:      
  717.       MOV       AL, CS:[hsverhi]
  718.       MOV       BL, 10
  719.       XOR       AH, AH
  720.       DIV       BL
  721.       ROL       AX, 8
  722.       MOV       AH, 14
  723.       ADD       AL, '0'
  724.       INT       10h
  725.       
  726.       MOV       AX, 0e2eh
  727.       INT       10h
  728.       MOV       AL, CS:[hsverlo]
  729.       MOV       BL, 10
  730.       XOR       AH, AH
  731.       DIV       BL
  732.       MOV       AH, 14
  733.       ADD       AL, '0'
  734.       INT       10h
  735.  
  736.       MOV       AL, CS:[hsverlo]
  737.       MOV       BL, 10
  738.       XOR       AH, AH
  739.       DIV       BL
  740.       ROL       AX, 8
  741.       MOV       AH, 14
  742.       ADD       AL, '0'
  743.       INT       10h
  744.       
  745.       MOV       AX, 0e0dh
  746.       INT       10h
  747.       MOV       AX, 0e0ah
  748.       INT       10h
  749.  
  750.       RET
  751.       numids    db  0
  752. endp
  753.  
  754. readheader proc
  755.       MOV       AH, 3Fh
  756.       MOV       CX, 16*4
  757.       MOV       BX, CS:[_filehandle_]
  758.       MOV       DX, offset hsheader
  759.       PUSH      CS
  760.       POP       DS
  761.       INT       21h
  762.       JC        failed2
  763.       CMP       AX, 16*4
  764.       JNE       failed2
  765.       RET
  766. endp
  767.  
  768. fileseek proc
  769.       MOV       DX, AX
  770.       ROL       EAX, 16
  771.       MOV       CX, AX
  772.       MOV       BX, CS:[_filehandle_]
  773.       MOV       AX, 4200h
  774.       INT       21h
  775.       JC        failed2
  776.       RET
  777. endp
  778.  
  779. fileseekb proc
  780.       MOV       DX, AX
  781.       ROL       EAX, 16
  782.       MOV       CX, AX
  783.       MOV       BX, CS:[_filehandle_]
  784.       MOV       AX, 4200h
  785.       INT       21h
  786.       JC        failed1
  787.       RET
  788. endp
  789.  
  790. detecthsversion proc
  791.       MOV       SI, offset msg6
  792.       CALL      print_string
  793.       MOV       EAX, CS:[origsize]
  794.       CALL      fileseek
  795.       CALL      readheader
  796.  
  797.       MOV       SI, offset hsheader
  798.       CMP       BYTE PTR CS:[SI], 0e8h
  799.       JNZ       fourthcont
  800.       MOVSX     EBX, word ptr CS:[SI+1]
  801.       MOV       EAX, CS:[origsize]
  802.       ADD       EAX, 3
  803.       ADD       EAX, EBX
  804.       MOV       CS:[origsize], EAX
  805.       CALL      fileseek
  806.       CALL      readheader
  807. fourthcont:
  808.  
  809.       MOV       BX, offset hstable
  810.       SUB       BX, 4
  811.       ; old signature
  812. oki:
  813.       ADD       BX, 4
  814.       MOV       SI, offset hsheader
  815.       MOV       DI, CS:[BX+2]
  816.       OR        DI, DI
  817.       JZ        failed1
  818.       PUSH      CS
  819.       POP       ES
  820.       MOV       CX, 16
  821.       REP       CMPSB
  822.       JNE       oki
  823.       
  824.       CMP       word ptr CS:[BX], offset sig118s
  825.       JB        newestHS
  826.       
  827.       PUSH      BX
  828.       MOVSX     EBX, CS:[eh_ip]
  829.       MOV       EAX, CS:[origsize]
  830.       SUB       EAX, EBX
  831.       MOV       CS:[origsize], EAX
  832.       CALL      fileseek
  833.       CALL      readheader
  834.       POP       BX
  835.       MOV       SI, 56
  836. searchanfang:      
  837.       DEC       SI
  838.       JS        oki
  839.       CMP       word ptr CS:[SI+hsheader], 0b41eh
  840.       JNE       searchanfang
  841.       CMP       word ptr CS:[SI+4+hsheader], 03c21h
  842.       JNE       searchanfang
  843.  
  844.       XOR       EAX, EAX
  845.       MOV       AX, SI
  846.       ADD       CS:[origsize], eax
  847.  
  848. newestHS:
  849.       MOV       SI, CS:[BX]
  850.       CALL      print_string
  851.       MOV       SI, offset sigf
  852.       CALL      print_string
  853.  
  854.       
  855.  
  856.       
  857.       INC       CS:[numids]
  858.       RET
  859. endp
  860.  
  861. openfile proc
  862.       MOV       SI, offset msg2
  863.       CALL      print_string
  864.       MOV       AX, 3D02h
  865.       MOV       DS, CS:[startupseg]
  866.       MOV       DX, CS:[filenameoffset]
  867.       INT       21h
  868.       JNC       openfile1
  869.       JMP       failed1
  870. openfile1:
  871.       MOV       CS:[_filehandle_], AX
  872.       JMP       ok1
  873. endp
  874.  
  875. siganalysing proc
  876.       MOV       SI, offset msg7p1
  877.       CALL      print_string
  878.       XOR       BH, BH
  879.       MOV       BL, CS:[numids]
  880.       MOV       AL, CS:[hexstring+BX]
  881.       MOV       AH, 14
  882.       INT       10h
  883.       MOV       SI, offset msg7p2
  884.       CALL      print_string
  885.       XOR       BH, BH
  886.       MOV       BL, CS:[numids]
  887.       SHL       BX, 1
  888.       MOV       SI, CS:[msgGTab+BX]
  889.       CALL      print_string
  890.       CMP       CS:[numids], 0
  891.       JNE       do_not_ask
  892.       MOV       SI, offset MSGmod
  893.       CALL      print_string
  894. getkey:      
  895.       XOR       AX, AX
  896.       INT       16h
  897.       CMP       AL, 'y'
  898.       JE        keyyes
  899.       CMP       AL, 'Y'
  900.       JE        keyyes
  901.       CMP       AL, 'n'
  902.       JE        keyno       
  903.       CMP       AL, 'N'
  904.       JE        keyno
  905.       JMP       getkey
  906. keyyes:
  907.       MOV       AX, 0e0dh
  908.       INT       10h
  909.       CLC
  910.       RET
  911. keyno:
  912.       MOV       AX, 0e0dh
  913.       INT       10h
  914.       STC
  915.       RET
  916. do_not_ask:
  917.       CLC
  918.       RET
  919. endp
  920.  
  921. readhsloader proc
  922.       MOV       SI, offset msg8
  923.       CALL      print_string
  924.       
  925.       MOV       EAX, CS:[sfsize]
  926.       MOVSX     ECX, CS:[eh_cs]
  927.       SAL       ECX, 4
  928.       MOVZX     EBX, CS:[eh_hsize]
  929.       SHL       EBX, 4
  930.       ADD       ECX, EBX
  931.       SUB       EAX, ECX
  932.       MOV       CS:[hstopsize], AX
  933.       ADD       EAX, 16
  934.       SHR       EAX, 4
  935.       PUSH      AX
  936.       PUSH      AX
  937.       MOV       BX, 0ffffh
  938.       MOV       AH, 48h
  939.       INT       21h
  940.       POP       AX
  941.       SUB       BX, AX
  942.       SUB       BX, 1005h
  943.       MOV       AH, 48h
  944.       INT       21h
  945.       JC        failed1
  946.       POP       BX
  947.       PUSH      AX
  948.       MOV       AH, 48h
  949.       MOV       BX, 1000h
  950.       INT       21h
  951.       JC        failed1
  952.  
  953.       MOV       CS:[validcs], AX
  954.       POP       ES
  955.       MOV       AH, 49h
  956.       INT       21h
  957.       JC        failed1
  958.  
  959.       MOV       word ptr CS:[paraCT+2], CS
  960.       MOV       word ptr CS:[paraFCB1+2], CS
  961.       MOV       word ptr CS:[paraFCB2+2], CS
  962.       MOV       AX, CS
  963.       MOV       ES, AX
  964.       MOV       DS, AX
  965.       MOV       AX, 4B01h
  966.       MOV       BX, offset paraENV
  967.       MOV       DS, CS:[startupseg]
  968.       MOV       DX, CS:[filenameoffset]
  969.       
  970.       INT       21H
  971.       JC        failed1
  972.       ADD       CS:[paraSP], 2
  973.       CLI
  974.       MOV       CX, CS:[hstopsize]
  975.       MOV       ES, CS:[validcs]
  976.       MOV       DS, CS:[paraCS]
  977.       XOR       SI, SI
  978.       XOR       DI, DI
  979.       REP       MOVSB
  980.       STI
  981.       JMP       ok1
  982. endp
  983.  
  984.  
  985. readhsloader2 proc
  986.       MOV       word ptr CS:[paraCT+2], CS
  987.       MOV       word ptr CS:[paraFCB1+2], CS
  988.       MOV       word ptr CS:[paraFCB2+2], CS
  989.       MOV       AX, CS
  990.       MOV       ES, AX
  991.       MOV       DS, AX
  992.       MOV       AX, 4B01h
  993.       MOV       BX, offset paraENV
  994.       MOV       DS, CS:[startupseg]
  995.       MOV       DX, CS:[filenameoffset]
  996.       
  997.       INT       21H
  998.       JC        failed1
  999.       ADD       CS:[paraSP], 2
  1000.       RET
  1001. endp
  1002.  
  1003. retriever2 proc
  1004.       MOV       AX, 3514h
  1005.       INT       21h
  1006.       MOV       CS:[_oldoff_], BX
  1007.       MOV       CS:[_oldseg_], ES
  1008.       MOV       AH, 62h
  1009.       INT       21h
  1010.       PUSH      BX
  1011.       MOV       AX, 2514h
  1012.       PUSH      CS
  1013.       POP       DS
  1014.       MOV       DX, offset interrupt14h
  1015.       INT       21h
  1016.       POP       BX
  1017.       MOV       DS, BX
  1018.       MOV       AX, BX
  1019.       ADD       AX, 10h
  1020.       ADD       AX, CS:[_origCS_]
  1021.       MOV       ES, AX
  1022.       MOV       DI, CS:[_origIP_]
  1023.       CALL      vorbereiten
  1024.       MOV       word ptr ES:[DI], 14cdh
  1025.       MOV       ES, BX
  1026.       MOV       word ptr DS:[12], CS
  1027.       MOV       word ptr DS:[10], offset returnpoint2
  1028.  
  1029.       MOV       AX, CS:[paraCS]
  1030.       MOV       CS:[Jseg2], AX
  1031.       MOV       AX, CS:[paraIP]
  1032.       MOV       CS:[Jofs2], AX
  1033.       JMP       l986
  1034. l986:
  1035.       CLI
  1036.       MOV       CS:[ownSS], SS
  1037.       MOV       CS:[ownsp], SP
  1038.       MOV       SS, CS:[paraSS]
  1039.       MOV       SP, CS:[paraSP]
  1040.       STI
  1041.       XOR       AX, AX
  1042.       MOV       BX, AX
  1043.       MOV       CX, AX
  1044.       MOV       DX, AX
  1045.       MOV       BP, AX
  1046.       MOV       SI, AX
  1047.       MOV       DI, AX
  1048.       db 0eah  
  1049. jofs2 dw 0
  1050. jseg2 dw 0
  1051. returnpoint2: 
  1052.       CLI
  1053.       MOV       SS, CS:[ownSS]
  1054.       MOV       SP, CS:[ownSP]
  1055.       STI
  1056.       MOV       DS, CS:[_oldseg_]
  1057.       MOV       DX, CS:[_oldoff_]
  1058.       MOV       byte ptr CS:[done], 1  ; <-- nur einmal!!!
  1059.       MOV       AX, 2514h
  1060.       INT       21h
  1061.       MOV       AH, 50h
  1062.       MOV       BX, CS:[startupseg]
  1063.       INT       21h
  1064.       CMP       CS:[found],0
  1065.       JE        failed1
  1066.       JMP       ok1
  1067.  
  1068. endp
  1069.  
  1070. include opcodes.asm
  1071.  
  1072. vorbereiten proc
  1073.       PUSH      AX
  1074.       PUSH      BX
  1075.       PUSH      CX
  1076.       PUSH      DX
  1077.  
  1078.       XOR       BX, BX
  1079.       MOV       CS:stackadjust, Bx
  1080.       MOV       BL, ES:[DI]
  1081.       SHL       BX, 1
  1082.       CALL      word ptr cs:[opcodetable+BX]
  1083.  
  1084.       POP       DX
  1085.       POP       CX
  1086.       POP       BX
  1087.       POP       AX
  1088.       RET
  1089. endp
  1090.  
  1091. retriever proc
  1092.       MOV       SI, offset msg9
  1093.       CALL      print_string
  1094.       MOV       AX, 3521h
  1095.       INT       21h
  1096.       MOV       CS:[_oldoff_], BX
  1097.       MOV       CS:[_oldseg_], ES
  1098.       MOV       AH, 62h
  1099.       INT       21h
  1100.       PUSH      BX
  1101.       MOV       AX, 2521h
  1102.       PUSH      CS
  1103.       POP       DS
  1104.       MOV       DX, offset interrupt21h
  1105.       INT       21h
  1106.       POP       BX
  1107.       MOV       DS, BX
  1108.       MOV       ES, BX
  1109.       MOV       word ptr DS:[12], CS
  1110.       MOV       word ptr DS:[10], offset returnpoint
  1111.  
  1112.       MOV       AX, CS:[validcs]
  1113.       MOV       CS:[Jseg], AX
  1114.       MOV       AX, CS:[paraIP]
  1115.       MOV       CS:[Jofs], AX
  1116.       JMP       l1050
  1117. l1050:
  1118.       CLI
  1119.       MOV       CS:[ownSS], SS
  1120.       MOV       CS:[ownsp], SP
  1121.       MOV       SS, CS:[paraSS]
  1122.       MOV       SP, CS:[paraSP]
  1123.       STI
  1124.       XOR       AX, AX
  1125.       MOV       BX, AX
  1126.       MOV       CX, AX
  1127.       MOV       DX, AX
  1128.       MOV       BP, AX
  1129.       MOV       SI, AX
  1130.       MOV       DI, AX
  1131.       db 0eah  
  1132. jofs  dw 0
  1133. jseg  dw 0
  1134. returnpoint: 
  1135.       CLI
  1136.       MOV       SS, CS:[ownSS]
  1137.       MOV       SP, CS:[ownSP]
  1138.       STI
  1139.       MOV       DS, CS:[_oldseg_]
  1140.       MOV       DX, CS:[_oldoff_]
  1141.       MOV       byte ptr CS:[done], 1  ; <-- nur einmal!!!
  1142.       MOV       AX, 2521h
  1143.       INT       21h
  1144.       MOV       AH, 50h
  1145.       MOV       BX, CS:[startupseg]
  1146.       INT       21h
  1147.       CMP       CS:[found],0
  1148.       JE        failed1
  1149.       CMP       CS:[newrout], 1
  1150.       JE        soko
  1151.       JMP       ok1
  1152. soko: CALL      readhsloader2
  1153.       JC        soko2
  1154.       JMP       retriever2
  1155. soko2:
  1156.       RET
  1157. endp
  1158.  
  1159. main proc
  1160.       CALL      background
  1161.       CALL      openfile
  1162.       JC        normend      
  1163.       CALL      savedt
  1164.       JC        closeend
  1165.       CALL      checkexe 
  1166.       JC        closeend
  1167.       CALL      idcheck
  1168.       CALL      detecthsversion
  1169.       CALL      siganalysing
  1170.       JC        closeend
  1171.       CALL      readhsloader
  1172.       JC        closeend
  1173.       CALL      retriever
  1174.       JC        closeend
  1175.       CALL      save_exe
  1176.       CALL      restoredt
  1177. closeend:
  1178.       CALL      closefile
  1179. normend:      
  1180.       MOV       AX, 4C00h
  1181.       INT       21h
  1182. endp
  1183.  
  1184. .stack 200
  1185.  
  1186. END main
  1187.