Reverse IDM Silient – Bản nghi nghờ là Keylogger.

Tình cờ phát hiện ra file này chạy trên rất nhiều máy, có lẽ là do sử dụng IDM nên nhiễm phải file này. Copy về để RE thử xem thế nào.

File này được lưu tại: C:\\windows\\system32\\IDMSL Auto Update.exe sau khi cài đặt IDM Silient “không cần crack”. Có nhiều bản trên internet, không kiểm soát được nên các bạn chú ý khi sử dụng, tôi không chắc chắn rằng bản chạy trên máy tính của bạn là một keylogger, nhưng trên máy tính của một người tôi thì là nó. Các bạn nên đề phòng vẫn hơn, thêm nữa. Các bản cập nhật này thường không cần sử dụng. xóa đi cũng không sao, lại càng an toàn.

Đầu tiên, ta detect xem nó được viết bằng gì?.

anh1

như vậy là,được nén bằng UPX. tiến hành Unpack đã.

Tôi thường sử dụng CFF Explorer để unpack nhưng file được nén bằng UPX, bản thân thấy sử dụng khá được.

anh2

Tiếp đến, xem được viết bằng gì nào?.
anh3

hum, được viết = C++ 8 cơ à, Load vào PE Explorer để view string xem sao nào.

anh4

Lại là AutoIT rồi, nhưng cha này có vẻ không dùng Ofuscate để giấu mã nguồn. Thử download exe2aut về xem sao.
Ok!. hô la hấp. ra mã nguồn rồi. hehe. Xem có gì trong đó không nhé.

anh5

save ra cái notepaad ++ xem cho dễ nào.
————————


Func _inetmail($s_mailto, $s_mailsubject, $s_mailbody)
Local $prev = Opt("ExpandEnvStrings", 1)
Local $var, $dflt = RegRead("HKCU\Software\Clients\Mail", "")
If $dflt = "Windows Live Mail" Then
$var = RegRead("HKCR\WLMail.Url.Mailto\Shell\open\command", "")
Else
$var = RegRead("HKCR\mailto\shell\open\command", "")
EndIf
Local $ret = Run(StringReplace($var, "%1", _inetexplorercapable("mailto:" & $s_mailto & "?subject=" & $s_mailsubject & "&body=" & $s_mailbody)))
Local $nerror = @error, $nextended = @extended
Opt("ExpandEnvStrings", $prev)
Return SetError($nerror, $nextended, $ret)
EndFunc

thêm nữa nhé.


Func _inetsmtpmail($s_smtpserver, $s_fromname, $s_fromaddress, $s_toaddress, $s_subject = "", $as_body = "", $s_helo = "", $s_first = " ", $b_trace = 0)
If $s_smtpserver = "" OR $s_fromaddress = "" OR $s_toaddress = "" OR $s_fromname = "" OR StringLen($s_fromname) > 256 Then Return SetError(1, 0, 0)
If $s_helo = "" Then $s_helo = @ComputerName
If TCPStartup() = 0 Then Return SetError(2, 0, 0)
Local $s_ipaddress, $i_count
StringRegExp($s_smtpserver, "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
If @extended Then
$s_ipaddress = $s_smtpserver
Else
$s_ipaddress = TCPNameToIP($s_smtpserver)
EndIf
If $s_ipaddress = "" Then
TCPShutdown()
Return SetError(3, 0, 0)
EndIf
Local $v_socket = TCPConnect($s_ipaddress, 25)
If $v_socket = -1 Then
TCPShutdown()
Return SetError(4, 0, 0)
EndIf
Local $s_send[6], $s_replycode[6]
$s_send[0] = "HELO " & $s_helo & @CRLF
If StringLeft($s_helo, 5) = "EHLO " Then $s_send[0] = $s_helo & @CRLF
$s_replycode[0] = "250"
$s_send[1] = "MAIL FROM: " & @CRLF
$s_replycode[1] = "250"
$s_send[2] = "RCPT TO: " & @CRLF
$s_replycode[2] = "250"
$s_send[3] = "DATA" & @CRLF
$s_replycode[3] = "354"
Local $aresult = _date_time_gettimezoneinformation()
Local $bias = -$aresult[1] / 60
Local $biash = Int($bias)
Local $biasm = 0
If $biash $bias Then $biasm = Abs($bias - $biash) * 60
$bias = StringFormat(" (%+.2d%.2d)", $biash, $biasm)
$s_send[4] = "From:" & $s_fromname & "" & @CRLF & "To:" & "" & @CRLF & "Subject:" & $s_subject & @CRLF & "Mime-Version: 1.0" & @CRLF & "Date: " & _datedayofweek(@WDAY, 1) & ", " & @MDAY & " " & _datetomonth(@MON, 1) & " " & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & $bias & @CRLF & "Content-Type: text/plain; charset=US-ASCII" & @CRLF & @CRLF
$s_replycode[4] = ""
$s_send[5] = @CRLF & "." & @CRLF
$s_replycode[5] = "250"
If __smtpsend($v_socket, $s_send[0], $s_replycode[0], $b_trace, "220", $s_first) Then Return SetError(50, 0, 0)
For $i_count = 1 To UBound($s_send) - 2
If __smtpsend($v_socket, $s_send[$i_count], $s_replycode[$i_count], $b_trace) Then Return SetError(50 + $i_count, 0, 0)
Next
For $i_count = 0 To UBound($as_body) - 1
If StringLeft($as_body[$i_count], 1) = "." Then $as_body[$i_count] = "." & $as_body[$i_count]
If __smtpsend($v_socket, $as_body[$i_count] & @CRLF, "", $b_trace) Then Return SetError(500 + $i_count, 0, 0)
Next
$i_count = UBound($s_send) - 1
If __smtpsend($v_socket, $s_send[$i_count], $s_replycode[$i_count], $b_trace) Then Return SetError(5000, 0, 0)
TCPCloseSocket($v_socket)
TCPShutdown()
Return 1
EndFunc

Đoạn
StringRegExp($s_smtpserver, "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)") Chính là máy chủ email mà con này sử dụng, nó không dùng các máy chủ mail thông thường như Gmail, Yahoo, hay hotmail. Sử dụng các kết nối TCP đến cổng 25 như trong mã nguồn.

Thêm vào đó, nó còn sử dụng để ăn cắp các thông tin khác của người dùng, tôi chưa biết làm như vậy có dụng ý gì, nhưng chắc chắn là không tốt cho người sử dụng. Làm chậm mạng, tốn bộ nhớ, tốn RAM,… Nên dù nó là của ai, tốt hay xấu, tốt nhất là xóa nó đi.

Func __smtpsend($v_socket, $s_send, $s_replycode, $b_trace, $s_intreply = "", $s_first = "")
Local $s_receive, $i, $timer
If $b_trace Then __smtptrace($s_send)
If $s_intreply "" Then
If $s_first -1 Then
If TCPSend($v_socket, $s_first) = 0 Then
TCPCloseSocket($v_socket)
TCPShutdown()
Return 1
EndIf
EndIf
$s_receive = ""
$timer = TimerInit()
While StringLeft($s_receive, StringLen($s_intreply)) $s_intreply AND TimerDiff($timer) < 45000
$s_receive = TCPRecv($v_socket, 1000)
If $b_trace AND $s_receive "" Then __smtptrace("intermediate->" & $s_receive)
WEnd
EndIf
If TCPSend($v_socket, $s_send) = 0 Then
TCPCloseSocket($v_socket)
TCPShutdown()
Return 1
EndIf
$timer = TimerInit()
$s_receive = ""
While $s_receive = "" AND TimerDiff($timer) < 45000
$i += 1
$s_receive = TCPRecv($v_socket, 1000)
If $s_replycode = "" Then ExitLoop
WEnd
If $s_replycode "" Then
If $b_trace Then __smtptrace($i & " <- " & $s_receive)
If StringLeft($s_receive, StringLen($s_replycode)) $s_replycode Then
TCPCloseSocket($v_socket)
TCPShutdown()
If $b_trace Then __smtptrace(" " & $s_replycode, 5)
Return 2
EndIf
EndIf
Return 0
EndFunc

Func _tcpiptoname($sip, $ioption = Default, $hdll_ws2_32 = Default)
Local $inaddr_none = -1, $af_inet = 2, $sseparator = @CR
If $ioption = Default Then $ioption = 0
If $hdll_ws2_32 = Default Then $hdll_ws2_32 = "ws2_32.dll"
Local $vadllcall = DllCall($hdll_ws2_32, "ulong", "inet_addr", "STR", $sip)
If @error Then Return SetError(1, 0, "")
Local $vbinip = $vadllcall[0]
If $vbinip = $inaddr_none Then Return SetError(2, 0, "")
$vadllcall = DllCall($hdll_ws2_32, "ptr", "gethostbyaddr", "ptr*", $vbinip, "int", 4, "int", $af_inet)
If @error Then Return SetError(3, 0, "")
Local $vptrhostent = $vadllcall[0]
If $vptrhostent = 0 Then
$vadllcall = DllCall($hdll_ws2_32, "int", "WSAGetLastError")
If @error Then Return SetError(5, 0, "")
Return SetError(4, $vadllcall[0], "")
EndIf
Local $vhostent = DllStructCreate("ptr;ptr;short;short;ptr", $vptrhostent)
Local $shostnames = __tcpiptoname_szstringread(DllStructGetData($vhostent, 1))
If @error Then Return SetError(6, 0, $shostnames)
If $ioption = 1 Then
Local $vh_aliases
$shostnames &= $sseparator
For $i = 0 To 63
$vh_aliases = DllStructCreate("ptr", DllStructGetData($vhostent, 2) + ($i * 4))
If DllStructGetData($vh_aliases, 1) = 0 Then ExitLoop
$shostnames &= __tcpiptoname_szstringread(DllStructGetData($vh_aliases, 1))
If @error Then
SetError(7)
ExitLoop
EndIf
Next
Return StringSplit(StringStripWS($shostnames, 2), @CR)
Else
Return $shostnames
EndIf
EndFunc

Đây là mã nguồn, file gốc, file unpack để các bạn có thể đổi chiếu hoặc tập RE.

https://www.dropbox.com/s/17ae5rh3f0k0ec7/Desktop.rar

Advertisements

6 thoughts on “Reverse IDM Silient – Bản nghi nghờ là Keylogger.”

    1. mình ko dùng các công cụ để Scan. Do mình nghi ngờ tiến trình này là mã độc, nên sử dụng các kỹ thuật dịch ngược để phân tích mã của nó.

  1. Chào bạn, bài viết khá hay, mình cũng thu nhập được thêm một số kiến thức.
    Mình đã theo vết các phân tích của bạn, đọc source code chương trình này thì thấy các hàm bạn nêu thực chất là các hàm thư viện chứ ko được sử dụng.
    Hàm chính của nó
    Opt(“GUIOnEventMode”, 1)
    If _singleton(@ScriptName, 1) = 0 Then
    MsgBox(16, “Warning”, “IDM Auto update ã °ãc ch¡y !”)
    Exit
    EndIf
    Global $path = idm_path()
    If FileExists($path) = 1 Then
    _startupregistry_install(“IDMSL autoUpdate”)
    _autocheck()
    Else
    MsgBox(48, “L×i”, “Không thà tìm th¥y IDM trong máy !”)
    Exit
    EndIf

    Từ phần này mình lần ngược lại những gì chương trình làm. Tóm lại thì phần mềm này nó không có keylog.

    Rất mong có những trao đổi thêm với bạn

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s