MALICIOUS
170
Risk Score
Malware Insights
MITRE ATT&CK
T1059.005 Visual Basic
T1204.002 Malicious File
The sample is an OOXML document containing a VBA project with a Document_Open macro. This macro utilizes WScript.Shell and the Shell() function, indicating an intent to execute arbitrary commands. The specific commands executed are not fully visible due to truncation, but the presence of these functions strongly suggests the download and execution of a second-stage payload.
Heuristics 6
-
VBA project inside OOXML medium 4 related findings OOXML_VBADocument contains a VBA project — VBA macros present
-
WScript.Shell usage critical OLE_VBA_WSCRIPTWScript.Shell usageMatched line in script
Dim wScript Set wScript = CreateObject("WScript.Shell") -
CreateObject call high OLE_VBA_CREATEOBJCreateObject callMatched line in script
Dim wScript Set wScript = CreateObject("WScript.Shell") -
VBA p-code auto-exec with execution tokens high OLE_VBA_PCODE_AUTOEXEC_EXECCompiled VBA/cache stream contains an auto-execution token together with shell/download/object-execution tokens. This catches p-code-only or source-extraction-failure macro documents where visible source is unavailable.
-
Document_Open macro low OLE_VBA_DOCOPENDocument_Open macroMatched line in script
If Lingvo16_Installed Then Call Document_Open End If -
Embedded URL info EMBEDDED_URLOne or more URLs were extracted from the document. The URL itself is not a detection — see the per-URL labels for which channel (macro, JS, link annotation, document body, ...) reached each URL.URL http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas In document text (OOXML body / shared strings)
- http://schemas.openxmlformats.org/markup-compatibility/2006In document text (OOXML body / shared strings)
- http://schemas.openxmlformats.org/officeDocument/2006/relationshipsIn document text (OOXML body / shared strings)
- http://schemas.openxmlformats.org/officeDocument/2006/mathIn document text (OOXML body / shared strings)
- http://schemas.microsoft.com/office/word/2010/wordprocessingDrawingIn document text (OOXML body / shared strings)
- http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawingIn document text (OOXML body / shared strings)
- http://schemas.openxmlformats.org/wordprocessingml/2006/mainIn document text (OOXML body / shared strings)
- http://schemas.microsoft.com/office/word/2010/wordmlIn document text (OOXML body / shared strings)
- http://schemas.microsoft.com/office/word/2012/wordmlIn document text (OOXML body / shared strings)
- http://schemas.microsoft.com/office/word/2010/wordprocessingGroupIn document text (OOXML body / shared strings)
- http://schemas.microsoft.com/office/word/2010/wordprocessingInkIn document text (OOXML body / shared strings)
- http://schemas.microsoft.com/office/word/2006/wordmlIn document text (OOXML body / shared strings)
- http://schemas.microsoft.com/office/word/2010/wordprocessingShapeIn document text (OOXML body / shared strings)
- http://schemas.microsoft.com/office/2006/01/customuiIn document text (OOXML body / shared strings)
Extracted artifacts 2
Files carved from inside the sample during analysis.
| Filename | Kind | Source | Size |
|---|---|---|---|
macros.bas |
vba-macro | oletools.olevba.extract_macros (decoded VBA source from OOXML) | 80941 bytes |
SHA-256: de7e1e1350ca50616e30379bfdc6f600375642d54eed4fdd9b82e795bd758d2c |
|||
Preview scriptFirst 1,000 lines of the extracted script
Attribute VB_Name = "ThisDocument"
Attribute VB_Base = "0{00020906-0000-0000-C000-000000000046}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = True
Attribute VB_TemplateDerived = False
Attribute VB_Customizable = True
Private Lingvo16_Installed As Boolean
Private Lingvo16_LingvoRunning As Boolean
Private Lingvo16_Ribbon As IRibbonUI
Private Lingvo16_HeadingLanguage As Long
Private Lingvo16_ContentsLanguage As Long
Private Lingvo16_HeadingMenuLanguages
Private Lingvo16_ContentsMenuLanguages
Private Lingvo16_ShowTranslationSettings As Long
Private Lingvo16_ChangeSettings As Long
Private Lingvo16_ComboBoxValue As String
Private Lingvo16_LanguageIDs As New Collection
Private Lingvo16_LanguageNames As New Collection
Private Lingvo16_LanguageShortNames As New Collection
Private Lingvo16_WritingLog As Boolean
Private Lingvo16_LogName As String
Private Lingvo16_InterfaceLanguages As New Collection
Private Lingvo16_InterfaceLanguage As Long
'program strings
Private MSG_APPLICATION_TITLE As String
Private MSG_RUN_LINGVO_LABEL As String
Private MSG_RUN_LINGVO_SUPERTIP As String
Private MSG_HEADING_SCREENTIP As String
Private MSG_HEADING_SUPERTIP As String
Private MSG_REVERSE_SCREENTIP As String
Private MSG_REVERSE_SUPERTIP As String
Private MSG_CONTENTS_SCREENTIP As String
Private MSG_CONTENTS_SUPERTIP As String
Private MSG_COMBO_SCREENTIP As String
Private MSG_COMBO_SUPERTIP As String
Private MSG_TRANSLATE_SCREENTIP As String
Private MSG_TRANSLATE_SUPERTIP As String
Private MSG_TRANSLATE_SELECTED_LABEL As String
Private MSG_TRANSLATE_SELECTED_SUPERTIP As String
Private MSG_SETTINGS_LABEL As String
Private MSG_SETTINGS_SUPERTIP As String
Private MSG_RUN_LINGVO_FAILED As String
Private MSG_OPTIONS_MENU As String
Private MSG_OPTIONS_MENU_SHIFT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_CTRL_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_ALT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_WHEEL_CLICK As String
Private MSG_OPTIONS_MENU_CTRL_ALT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_ALT_SHIFT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_CTRL_SHIFT_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_CTRL_WIN_LEFT_CLICK As String
Private MSG_OPTIONS_MENU_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_SHIFT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_ALT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_ALT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_SHIFT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_ALT_SHIFT_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_WIN_MOUSE_OVER As String
Private MSG_OPTIONS_MENU_CTRL_INS_INS As String
Private MSG_OPTIONS_MENU_CTRL_C_C As String
Private MSG_CONTEXT_MENU_NAME As String
Private MSG_AnotherComCallInProgress As String
Private MSG_LingvoIsBusy As String
Private MSG_LingvoIsNotReady As String
Private MSG_LingvoComError As String
'languages
Private MSG_LANG_ARABIC As String
Private MSG_LANG_AFRIKAANS As String
Private MSG_LANG_BELARUSIAN As String
Private MSG_LANG_BULGARIAN As String
Private MSG_LANG_CZECH As String
Private MSG_LANG_DANISH As String
Private MSG_LANG_GERMAN As String
Private MSG_LANG_ENGLISH As String
Private MSG_LANG_SPANISH_TRADITIONAL_SORT As String
Private MSG_LANG_SPANISH_MODERN_SORT As String
Private MSG_LANG_BASQUE As String
Private MSG_LANG_FINNISH As String
Private MSG_LANG_FRENCH As String
Private MSG_LANG_HUNGARIAN As String
Private MSG_LANG_INDONESIAN As String
Private MSG_LANG_ITALIAN As String
Private MSG_LANG_DUTCH As String
Private MSG_LANG_NORWEGIAN_BOKMAL As String
Private MSG_LANG_NORWEGIAN_NYNORSK As String
Private MSG_LANG_POLISH As String
Private MSG_LANG_PORTUGUESE As String
Private MSG_LANG_RUSSIAN As String
Private MSG_LANG_SERBIAN_CYRILLIC As String
Private MSG_LANG_SWEDISH As String
Private MSG_LANG_SWAHILI As String
Private MSG_LANG_UKRAINIAN As String
Private MSG_LANG_TURKISH As String
Private MSG_LANG_CHINESEPRC As String
Private MSG_LANG_CHINESE As String
Private MSG_LANG_LATIN As String
Private MSG_LANG_ISLANDIC As String
Private MSG_LANG_LATVIAN As String
Private MSG_LANG_LITHUANIAN As String
Private MSG_LANG_ROMANIAN As String
Private MSG_LANG_SLOVAK As String
Private MSG_LANG_SLOVENIAN As String
Private MSG_LANG_GREEK As String
Private MSG_LANG_TATAR As String
Private MSG_LANG_KAZAKH As String
Private MSG_LANG_ARMENIAN_EAST As String
Private MSG_LANG_ARMENIAN_WEST As String
Private MSG_LANG_BASHKIR As String
Private MSG_LANG_ESTONIAN As String
Private MSG_LANG_GEORGIAN As String
Private MSG_LANG_MALAY As String
Private MSG_LANG_NA As String
Private Enum LV16_InterfaceLanguages
ilUnknown = -1
ilEnglish = 0
ilRussian = 1
ilGerman = 2
ilFrench = 3
ilUkrainean = 4
ilSpanish = 5
ilPolish = 15
ilKazakh = 42
ilChinese = 64
End Enum
Private Const LingvoComKey = "Lingvo.Application.16"
Private Const LingvoRegistryKey = "Software\ABBYY\Lingvo\16.0"
Private Const LingvoCustomPart = "{B9918612-9F25-4E16-9C35-CB6CC6F36488}"
Private Const STANDARD_RIGHTS_EXECUTE = &H20000
Private Const FILE_READ_ATTRIBUTES = &H80
Private Const FILE_EXECUTE = &H20
Private Const SYNCHRONIZE = &H100000
Private Const FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE Or FILE_READ_ATTRIBUTES Or FILE_EXECUTE Or SYNCHRONIZE
Private Const FILE_SHARE_READ = 1
Private Const FILE_SHARE_WRITE = 2
Private Const OPEN_EXISTING = 3
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const INVALID_HANDLE_VALUE = -1
Private Const ERROR_MORE_DATA = 234
Public TimerModule As New TimerClass
#If VBA7 Then
Private Declare PtrSafe Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, ByVal lpSecurityAttributes As LongPtr, ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As LongPtr) As LongPtr
Private Declare PtrSafe Function CloseHandle Lib "kernel32.dll" (ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function RegisterWindowMessage Lib "user32.dll" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare PtrSafe Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function IsWindow Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function IsIconic Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function IsWindowEnabled Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetLastActivePopup Lib "user32.dll" (ByVal hwndOwnder As LongPtr) As LongPtr
#Else
Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function IsWindowEnabled Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetLastActivePopup Lib "user32" (ByVal hwndOwnder As Long) As Long
#End If
Sub Lingvo16_RibbonLoaded(ribbon As IRibbonUI)
Set Lingvo16_Ribbon = ribbon
Lingvo16_Installed = False
Lingvo16_LingvoRunning = False
Lingvo16_HeadingLanguage = 0
Lingvo16_ContentsLanguage = 0
Lingvo16_WritingLog = False
Lingvo16_LogName = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\LogFile")
If Trim(Lingvo16_LogName) <> "" Then
Lingvo16_WritingLog = True
End If
'проверяем, можно ли писать в заданный файл
If Lingvo16_WritingLog Then
On Error GoTo Lingvo16_RibbonLoaded_error
Open Lingvo16_LogName For Append Access Write Lock Write As #1
Close #1
GoTo Lingvo16_RibbonLoaded_done_check
Lingvo16_RibbonLoaded_error:
Lingvo16_WritingLog = False
Lingvo16_RibbonLoaded_done_check:
End If
Call Lingvo16_writeLog("----------------------------------------------")
Call Lingvo16_writeLog("Loading ribbon")
Call Lingvo16_setInterfaceLanguage
Call Lingvo16_fillLanguages
Call Lingvo16_setContextMenus
' регистрируем сообщения для общения с Lingvo
Lingvo16_ShowTranslationSettings = RegisterWindowMessage("Lv16_Lingvo_Show_Translation_Settings")
Lingvo16_ChangeSettings = RegisterWindowMessage("Lv16_Agent_Options")
' проверяем наличие регистрации Lingvo в качестве COM-объекта,
' а также наличие исполняемого файла в соответствии с параметрами регистрации
Dim clsid As String, lingvoFile As String
clsid = Lingvo16_ReadRegistryKey("HKCR\" + LingvoComKey + "\CLSID\")
Call Lingvo16_writeLog("Lingvo CLSID is: " + clsid)
If clsid <> "" Then
#If Win64 Then
lingvoFile = Lingvo16_ReadRegistryKey("HKCR\Wow6432Node\CLSID\" + clsid + "\LocalServer32\")
#Else
lingvoFile = Lingvo16_ReadRegistryKey("HKCR\CLSID\" + clsid + "\LocalServer32\")
#End If
Call Lingvo16_writeLog("Lingvo EXE is: " + lingvoFile)
If lingvoFile <> "" Then
If Lingvo16_exeFileExists(lingvoFile) Then
Lingvo16_Installed = True
Call Lingvo16_writeLog("Lingvo EXE found")
End If
End If
End If
' запускаем мониторинг запуска Лингво, только если Лингво найдена
If Lingvo16_Installed Then
Call Document_Open
End If
Call Lingvo16_writeLog("Ribbon loaded")
End Sub
Private Sub Document_Open()
Call Lingvo16_writeLog("Starting timer")
Call TimerModule.Lingvo16_StartTimer(Me)
End Sub
Private Sub Document_Close()
Call Lingvo16_writeLog("Stopping timer")
Call TimerModule.Lingvo16_StopTimer
End Sub
Sub Lingvo16_DetectLingvoApplication()
Dim found As Boolean
If Lingvo16_FindMainWindow() <> 0 Then
found = True
Else
found = False
End If
' если Lingvo только что была запущена или остановлена, то перерисовываем ribbon
If found <> Lingvo16_LingvoRunning Then
Call Lingvo16_Ribbon.Invalidate
Lingvo16_LingvoRunning = found
If Lingvo16_LingvoRunning Then
Call Lingvo16_writeLog("Lingvo start is detected")
Else
Call Lingvo16_writeLog("Lingvo stop is detected")
End If
End If
End Sub
Sub Lingvo16_getGroupLabel(control As IRibbonControl, ByRef label)
label = MSG_APPLICATION_TITLE
End Sub
Sub Lingvo16_runLingvoLabel(control As IRibbonControl, ByRef label)
label = MSG_RUN_LINGVO_LABEL
End Sub
Sub Lingvo16_runLingvoSupertip(control As IRibbonControl, ByRef supertip)
supertip = MSG_RUN_LINGVO_SUPERTIP
End Sub
Sub Lingvo16_headingSupertip(control As IRibbonControl, ByRef supertip)
supertip = MSG_HEADING_SUPERTIP
End Sub
Sub Lingvo16_reverseScreentip(control As IRibbonControl, ByRef screentip)
screentip = MSG_REVERSE_SCREENTIP
End Sub
Sub Lingvo16_reverseSupertip(control As IRibbonControl, ByRef supertip)
supertip = MSG_REVERSE_SUPERTIP
End Sub
Sub Lingvo16_contentsSupertip(control As IRibbonControl, ByRef supertip)
supertip = MSG_CONTENTS_SUPERTIP
End Sub
Sub Lingvo16_comboScreentip(control As IRibbonControl, ByRef screentip)
screentip = MSG_COMBO_SCREENTIP
End Sub
Sub Lingvo16_comboSupertip(control As IRibbonControl, ByRef supertip)
supertip = MSG_COMBO_SUPERTIP
End Sub
Sub Lingvo16_translateScreentip(control As IRibbonControl, ByRef screentip)
screentip = MSG_TRANSLATE_SCREENTIP
End Sub
Sub Lingvo16_translateSupertip(control As IRibbonControl, ByRef supertip)
supertip = MSG_TRANSLATE_SUPERTIP
End Sub
Sub Lingvo16_translateSelectedLabel(control As IRibbonControl, ByRef label)
label = MSG_TRANSLATE_SELECTED_LABEL
End Sub
Sub Lingvo16_translateSelectedSupertip(control As IRibbonControl, ByRef supertip)
supertip = MSG_TRANSLATE_SELECTED_SUPERTIP
End Sub
Sub Lingvo16_settingsLabel(control As IRibbonControl, ByRef label)
label = MSG_SETTINGS_LABEL
End Sub
Sub Lingvo16_settingsSupertip(control As IRibbonControl, ByRef supertip)
supertip = MSG_SETTINGS_SUPERTIP
End Sub
Sub Lingvo16_TabIsAvailable(control As IRibbonControl, ByRef visible)
' если Lingvo не найдено, то ribbon вообще не показываем
If Lingvo16_Installed Then
visible = True
Call Lingvo16_writeLog("Tab is visible")
Else
visible = False
Call Lingvo16_writeLog("Tab is not visible")
End If
End Sub
' если Lingvo не запущено, показываем панель с кнопкой "Запустить",
' все остальное скрыто
Sub Lingvo16_startBarVisible(control As IRibbonControl, ByRef visible)
visible = Not Lingvo16_LingvoRunning
If visible Then
Call Lingvo16_writeLog("Start button is visible")
End If
End Sub
' если Lingvo запущено, убираем кнопку "Запустить" и показываем все остальное
Sub Lingvo16_languageBarVisible(control As IRibbonControl, ByRef visible)
visible = Lingvo16_LingvoRunning
If visible Then
Call Lingvo16_writeLog("Lingvo panel is visible")
End If
End Sub
' запуск Lingvo
Sub Lingvo16_runLingvoAction(control As IRibbonControl)
Call Lingvo16_writeLog("Running Lingvo")
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
End Sub
' тултип
Sub Lingvo16_headingScreentip(control As IRibbonControl, ByRef tip)
Call Lingvo16_writeLog("Getting full heading language")
If Not Lingvo16_LingvoRunning Then
label = ""
Exit Sub
End If
' сначала вызываем Lingvo16_getHeadingLabel, т.к. там задается язык
Call Lingvo16_getHeadingLabel(control, tip)
If Lingvo16_HeadingLanguage <> -1 Then
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
tip = Lingvo16_getFullLanguage(Lingvo16_HeadingLanguage)
Else
tip = "NA"
End If
Call Lingvo16_writeLog("Full heading language is: " + tip)
End Sub
' заголовок меню языков, с которых переводим (короткая строка типа 'en')
Sub Lingvo16_getHeadingLabel(control As IRibbonControl, ByRef label)
Call Lingvo16_writeLog("Getting short heading language")
If Not Lingvo16_LingvoRunning Then
label = ""
Exit Sub
End If
Dim langString As String
langString = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\HeadingLanguage")
Call Lingvo16_writeLog("Heading language in registry: " + langString)
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
If langString = "" Then
Lingvo16_HeadingLanguage = Lingvo16_getDefaultHeadingLanguage
Call Lingvo16_writeLog("Default heading language is set: " + CStr(Lingvo16_HeadingLanguage))
Else
' проверяем, присутствует ли по-прежнему нужный язык в списке
Lingvo16_HeadingLanguage = CLng(langString)
Dim headingLanguages
headingLanguages = Lingvo.GetHeadingLanguages
Dim i As Integer, found As Boolean
found = False
For i = LBound(headingLanguages) To UBound(headingLanguages)
If headingLanguages(i) = Lingvo16_HeadingLanguage Then
found = True
Exit For
End If
Next i
If found Then
Call Lingvo16_writeLog("Heading language is found: " + CStr(Lingvo16_HeadingLanguage))
Else
Lingvo16_HeadingLanguage = Lingvo16_getDefaultHeadingLanguage
Call Lingvo16_writeLog("Default heading language is set: " + CStr(Lingvo16_HeadingLanguage))
End If
End If
Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\HeadingLanguage", CStr(Lingvo16_HeadingLanguage))
Call Lingvo16_writeLog("Heading language saved in registry")
If Lingvo16_ContentsLanguage = 0 Or Lingvo16_ContentsLanguage = -1 Then
' нужно гарантировать, что перед обновлением других контролов заданы оба языка
Dim tmpLabel
Call Lingvo16_getContentsLabel(control, tmpLabel)
End If
Call Lingvo16_Ribbon.InvalidateControl("reverseLanguages")
Call Lingvo16_Ribbon.InvalidateControl("translate")
Call Lingvo16_Ribbon.InvalidateControl("translateSelected")
If Lingvo16_HeadingLanguage <> -1 Then
label = Lingvo16_getShortLanguage(Lingvo16_HeadingLanguage)
Else
label = "NA"
End If
Call Lingvo16_writeLog("Short heading language is: " + label)
End Sub
' строим меню как XML-строку
Sub Lingvo16_getHeadingMenu(control As IRibbonControl, ByRef menu)
Call Lingvo16_writeLog("Creating heading menu")
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
Lingvo16_HeadingMenuLanguages = Lingvo.GetHeadingLanguages
Call Lingvo16_sortLanguages(Lingvo16_HeadingMenuLanguages)
menu = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
Dim i As Integer
For i = LBound(Lingvo16_HeadingMenuLanguages) To UBound(Lingvo16_HeadingMenuLanguages)
menu = menu + "<toggleButton id=""button" + CStr(i) + """ label=""" + Lingvo16_getFullLanguage(Lingvo16_HeadingMenuLanguages(i)) + """ getPressed=""Lingvo16_headingPressed"" onAction=""Lingvo16_headingAction"" />"
Next i
menu = menu + "</menu>"
Call Lingvo16_writeLog("Heading menu is created: " + menu)
End Sub
' нужно ли ставить галку у языка в меню
Sub Lingvo16_headingPressed(control As IRibbonControl, ByRef checked)
Dim id As Integer
id = CInt(Right(control.id, Len(control.id) - 6))
Call Lingvo16_writeLog("Checking heading menu item: " + CStr(id))
If Lingvo16_HeadingMenuLanguages(id) = Lingvo16_HeadingLanguage Then
checked = True
Call Lingvo16_writeLog("Item is checked")
Else
checked = False
Call Lingvo16_writeLog("Item is not checked")
End If
End Sub
' выбран язык, с которого переводим
Sub Lingvo16_headingAction(control As IRibbonControl, isPressed As Boolean)
Dim id As Integer
id = CInt(Right(control.id, Len(control.id) - 6))
Call Lingvo16_writeLog("Heading menu item is clicked: " + CStr(id))
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
' пытаемся подобрать язык, на который переводим (т.к. в новом списке он может отсутствовать)
Dim oldHeadingLanguage As Long, oldContentsLanguage As Long
oldHeadingLanguage = Lingvo16_HeadingLanguage
oldContentsLanguage = Lingvo16_ContentsLanguage
Lingvo16_HeadingLanguage = Lingvo16_HeadingMenuLanguages(id)
Lingvo16_ContentsLanguage = Lingvo.GetBestLanguageMatch(oldHeadingLanguage, oldContentsLanguage, Lingvo16_HeadingLanguage)
Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\HeadingLanguage", CStr(Lingvo16_HeadingLanguage))
Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage", CStr(Lingvo16_ContentsLanguage))
Call Lingvo16_Ribbon.InvalidateControl("headingLanguage")
Call Lingvo16_Ribbon.InvalidateControl("contentsLanguage")
Call Lingvo16_Ribbon.InvalidateControl("reverseLanguages")
Call Lingvo16_writeLog("New heading language is: " + CStr(Lingvo16_HeadingLanguage))
Call Lingvo16_writeLog("New contents language is: " + CStr(Lingvo16_ContentsLanguage))
End Sub
' тултип
Sub Lingvo16_contentsScreentip(control As IRibbonControl, ByRef tip)
Call Lingvo16_writeLog("Getting full contents language")
If Not Lingvo16_LingvoRunning Then
label = ""
Exit Sub
End If
' сначала вызываем Lingvo16_getHeadingLabel и Lingvo16_getContentsLabel, т.к. там задается язык
Call Lingvo16_getHeadingLabel(control, tip)
Call Lingvo16_getContentsLabel(control, tip)
If Lingvo16_ContentsLanguage <> -1 Then
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
tip = Lingvo16_getFullLanguage(Lingvo16_ContentsLanguage)
Else
tip = "NA"
End If
Call Lingvo16_writeLog("Full contents language is: " + tip)
End Sub
' заголовок меню языков, на которые переводим (короткая строка типа 'en')
Sub Lingvo16_getContentsLabel(control As IRibbonControl, ByRef label)
Call Lingvo16_writeLog("Getting short contents language")
If Not Lingvo16_LingvoRunning Then
label = ""
Exit Sub
End If
Dim langString As String
langString = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage")
Call Lingvo16_writeLog("Contents language in registry: " + langString)
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
If langString = "" Then
Lingvo16_ContentsLanguage = Lingvo16_getDefaultContentsLanguage
Call Lingvo16_writeLog("Default contents language is set: " + CStr(Lingvo16_ContentsLanguage))
Else
' проверяем, присутствует ли по-прежнему нужный язык в списке
Lingvo16_ContentsLanguage = CLng(langString)
Dim contentLanguages
contentLanguages = Lingvo.GetContentLanguages(Lingvo16_HeadingLanguage)
Dim i As Integer, found As Boolean
found = False
For i = LBound(contentLanguages) To UBound(contentLanguages)
If contentLanguages(i) = Lingvo16_ContentsLanguage Then
found = True
Exit For
End If
Next i
If found Then
Call Lingvo16_writeLog("Contents language is found: " + CStr(Lingvo16_ContentsLanguage))
Else
Lingvo16_ContentsLanguage = Lingvo16_getDefaultContentsLanguage
Call Lingvo16_writeLog("Default contents language is set: " + CStr(Lingvo16_ContentsLanguage))
End If
End If
Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage", CStr(Lingvo16_ContentsLanguage))
Call Lingvo16_writeLog("Contents language saved in registry")
Call Lingvo16_Ribbon.InvalidateControl("reverseLanguages")
Call Lingvo16_Ribbon.InvalidateControl("translate")
Call Lingvo16_Ribbon.InvalidateControl("translateSelected")
If Lingvo16_ContentsLanguage <> -1 Then
label = Lingvo16_getShortLanguage(Lingvo16_ContentsLanguage)
Else
label = "NA"
End If
Call Lingvo16_writeLog("Short contents language is: " + label)
End Sub
' строим меню как XML-строку
Sub Lingvo16_getContentsMenu(control As IRibbonControl, ByRef menu)
Call Lingvo16_writeLog("Creating contents menu")
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
Lingvo16_ContentsMenuLanguages = Lingvo.GetContentLanguages(Lingvo16_HeadingLanguage)
Call Lingvo16_sortLanguages(Lingvo16_ContentsMenuLanguages)
menu = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
Dim i As Integer
For i = LBound(Lingvo16_ContentsMenuLanguages) To UBound(Lingvo16_ContentsMenuLanguages)
menu = menu + "<toggleButton id=""button" + CStr(i) + """ label=""" + Lingvo16_getFullLanguage(Lingvo16_ContentsMenuLanguages(i)) + """ getPressed=""Lingvo16_contentsPressed"" onAction=""Lingvo16_contentsAction"" />"
Next i
menu = menu + "</menu>"
Call Lingvo16_writeLog("Contents menu is created: " + menu)
End Sub
' нужно ли ставить галку у языка в меню
Sub Lingvo16_contentsPressed(control As IRibbonControl, ByRef checked)
Dim id As Integer
id = CInt(Right(control.id, Len(control.id) - 6))
Call Lingvo16_writeLog("Checking contents menu item: " + CStr(id))
If Lingvo16_ContentsMenuLanguages(id) = Lingvo16_ContentsLanguage Then
checked = True
Call Lingvo16_writeLog("Item is checked")
Else
checked = False
Call Lingvo16_writeLog("Item is not checked")
End If
End Sub
' выбран язык, на который переводим
Sub Lingvo16_contentsAction(control As IRibbonControl, isPressed As Boolean)
Dim id As Integer
id = CInt(Right(control.id, Len(control.id) - 6))
Call Lingvo16_writeLog("Contents menu item is clicked: " + CStr(id))
Lingvo16_ContentsLanguage = Lingvo16_ContentsMenuLanguages(id)
Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage", CStr(Lingvo16_ContentsLanguage))
Call Lingvo16_Ribbon.InvalidateControl("contentsLanguage")
Call Lingvo16_Ribbon.InvalidateControl("reverseLanguages")
Call Lingvo16_writeLog("New contents language is: " + CStr(Lingvo16_ContentsLanguage))
End Sub
Sub Lingvo16_reverseEnabled(control As IRibbonControl, ByRef enabled)
Call Lingvo16_writeLog("Checking reverse button")
If Lingvo16_FindMainWindow() = 0 Then
enabled = False
Call Lingvo16_writeLog("Reverse button is not enabled")
Exit Sub
End If
If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
enabled = False
Call Lingvo16_writeLog("Reverse button is not enabled")
Exit Sub
End If
If Lingvo16_HeadingLanguage = Lingvo16_ContentsLanguage Then
enabled = False
Call Lingvo16_writeLog("Reverse button is not enabled")
Exit Sub
End If
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
enabled = False
Call Lingvo16_writeLog("Reverse button is not enabled")
Exit Sub
End If
enabled = Lingvo.IsLanguagePairEnabled(Lingvo16_ContentsLanguage, Lingvo16_HeadingLanguage)
If enabled Then
Call Lingvo16_writeLog("Reverse button is enabled")
Else
Call Lingvo16_writeLog("Reverse button is not enabled")
End If
End Sub
' меняем языки местами
Sub Lingvo16_reverseAction(control As IRibbonControl)
Call Lingvo16_writeLog("Reverse button is clicked")
If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
Exit Sub
End If
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
If Not Lingvo.IsLanguagePairEnabled(Lingvo16_ContentsLanguage, Lingvo16_HeadingLanguage) Then
Exit Sub
End If
Dim tmp As Long
tmp = Lingvo16_HeadingLanguage
Lingvo16_HeadingLanguage = Lingvo16_ContentsLanguage
Lingvo16_ContentsLanguage = tmp
Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\HeadingLanguage", CStr(Lingvo16_HeadingLanguage))
Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\ContentsLanguage", CStr(Lingvo16_ContentsLanguage))
Call Lingvo16_Ribbon.InvalidateControl("headingLanguage")
Call Lingvo16_Ribbon.InvalidateControl("contentsLanguage")
Call Lingvo16_writeLog("New heading language is: " + CStr(Lingvo16_HeadingLanguage))
Call Lingvo16_writeLog("New contents language is: " + CStr(Lingvo16_ContentsLanguage))
End Sub
' количество слов в истории переводов
Sub Lingvo16_getComboItemCount(control As IRibbonControl, ByRef count)
Call Lingvo16_writeLog("Getting item count in combo-box")
Dim itemString As String
itemString = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\WordCount")
If itemString <> "" Then
count = CInt(itemString)
Else
count = 0
End If
Call Lingvo16_writeLog("Items in combo-box: " + CStr(count))
End Sub
' элементы истории переводов
Sub Lingvo16_getComboItemLabel(control As IRibbonControl, index As Integer, ByRef item)
Call Lingvo16_writeLog("Getting item in combo-box: " + CStr(index))
Dim wordNo As String
wordNo = "Word" + CStr(index)
item = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Office2007\" + wordNo)
Call Lingvo16_writeLog("Item is: " + item)
End Sub
' ввели новое слово для перевода
Sub Lingvo16_getComboChanged(control As IRibbonControl, text As String)
Lingvo16_ComboBoxValue = Trim(text)
Call Lingvo16_writeLog("Item entered in combo-box: " + Lingvo16_ComboBoxValue)
End Sub
' можно ли переводить
Sub Lingvo16_translateEnabled(control As IRibbonControl, ByRef enabled)
Call Lingvo16_writeLog("Checking Translate button")
If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
enabled = False
Call Lingvo16_writeLog("Button is not enabled")
Else
enabled = True
Call Lingvo16_writeLog("Button is enabled")
End If
End Sub
' переводим слово из комбо-бокса
Sub Lingvo16_translateAction(control As IRibbonControl)
Call Lingvo16_writeLog("Translate button is clicked")
' в Lingvo нет доступных языков, перевод невозможен
If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
Exit Sub
End If
' вызываем на случай, если пользователь не нажал Enter,
' т.е. слово не считается еще введенным в комбо-бокс
Call Lingvo16_Ribbon.InvalidateControl("translationBox")
If Lingvo16_ComboBoxValue = "" Then
Exit Sub
End If
Call Lingvo16_addWordToHistory(Lingvo16_ComboBoxValue)
Call Lingvo16_Ribbon.InvalidateControl("translationBox")
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
If Lingvo16_FindAppWindow() <> 0 Then
Call Lingvo16_PopupWindow
On Error GoTo lingvoComError
Call Lingvo.TranslateTextInDirection(Lingvo16_ComboBoxValue, Lingvo16_HeadingLanguage, Lingvo16_ContentsLanguage)
On Error GoTo 0
End If
Call Lingvo16_writeLog("Translated in Lingvo: " + Lingvo16_ComboBoxValue)
Exit Sub
lingvoComError:
Call Lingvo16_processError("Lingvo16_translateAction", Err.Number, Err.Description)
End Sub
' можно ли переводить
Sub Lingvo16_translateSelectedEnabled(control As IRibbonControl, ByRef enabled)
Call Lingvo16_writeLog("Checking Translate Selected button")
If Lingvo16_HeadingLanguage = -1 Or Lingvo16_ContentsLanguage = -1 Then
enabled = False
Call Lingvo16_writeLog("Button is not enabled")
Else
enabled = True
Call Lingvo16_writeLog("Button is enabled")
End If
End Sub
Sub Lingvo16_TranslateContextMenu()
Call Lingvo16_writeLog("Translating from context menu")
Dim word As String
word = Lingvo16_GetSelectedText()
If word = "" Then
Exit Sub
End If
Call Lingvo16_addWordToHistory(word)
Dim Lingvo As Object
If Not Lingvo16_runLingvo(Lingvo) Then
Exit Sub
End If
If Lingvo16_FindAppWindow() <> 0 Then
Call Lingvo16_PopupWindow
On Error GoTo lingvoComError
If Lingvo16_LingvoRunning And Lingvo16_HeadingLanguage > 0 And Lingvo16_ContentsLanguage > 0 Then
Call Lingvo.TranslateTextInDirection(word, Lingvo16_HeadingLanguage, Lingvo16_ContentsLanguage)
Else
Call Lingvo.TranslateText(word)
End If
On Error GoTo 0
End If
Call Lingvo16_writeLog("Translated in Lingvo: " + word)
Exit Sub
lingvoComError:
Call Lingvo16_processError("Lingvo16_TranslateContextMenu", Err.Number, Err.Description)
End Sub
' переводим выделенное слово
Sub Lingvo16_translateSelectedAction(control As IRibbonControl)
Call Lingvo16_writeLog("Translate Selected button is clicked")
Lingvo16_TranslateContextMenu
End Sub
' строим меню настроек как XML-строку
Sub Lingvo16_getSettingsMenu(control As IRibbonControl, ByRef menu)
Dim hoverLabel As String, clickLabel As String
hoverLabel = Lingvo16_getHoverLabel()
clickLabel = Lingvo16_getClickLabel()
menu = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">"
menu = menu + "<toggleButton id=""button1"" label=""" + hoverLabel + """ getEnabled=""Lingvo16_settingsEnabled"" getPressed=""Lingvo16_settingsPressed"" onAction=""Lingvo16_settingsAction"" />"
menu = menu + "<toggleButton id=""button2"" label=""" + clickLabel + """ getEnabled=""Lingvo16_settingsEnabled"" getPressed=""Lingvo16_settingsPressed"" onAction=""Lingvo16_settingsAction"" />"
menu = menu + "<toggleButton id=""button3"" label=""" + MSG_OPTIONS_MENU_CTRL_INS_INS + """ getEnabled=""Lingvo16_settingsEnabled"" getPressed=""Lingvo16_settingsPressed"" onAction=""Lingvo16_settingsAction"" />"
menu = menu + "<toggleButton id=""button4"" label=""" + MSG_OPTIONS_MENU_CTRL_C_C + """ getEnabled=""Lingvo16_settingsEnabled"" getPressed=""Lingvo16_settingsPressed"" onAction=""Lingvo16_settingsAction"" />"
menu = menu + "<menuSeparator id=""sep1"" />"
menu = menu + "<button id=""button5"" label=""" + MSG_OPTIONS_MENU + """ getEnabled=""Lingvo16_settingsEnabled"" onAction=""Lingvo16_optionsAction"" />"
menu = menu + "</menu>"
End Sub
Function Lingvo16_getHoverLabel() As String
Dim hoverTypeString As String, hoverKey As String
hoverTypeString = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseCoverType")
If hoverTypeString = "coverOnly" Then
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_MOUSE_OVER
ElseIf hoverTypeString = "coverPlusClick" Then
hoverKey = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseCoverVirtualKey")
Select Case hoverKey
Case "ctrl"
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_MOUSE_OVER
Case "shift"
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_SHIFT_MOUSE_OVER
Case "alt"
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_ALT_MOUSE_OVER
Case "ctrl-alt"
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_ALT_MOUSE_OVER
Case "ctrl-shift"
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_SHIFT_MOUSE_OVER
Case "alt-shift"
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_ALT_SHIFT_MOUSE_OVER
Case "ctrl-win"
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_WIN_MOUSE_OVER
Case Else
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_CTRL_MOUSE_OVER
End Select
Else
Lingvo16_getHoverLabel = MSG_OPTIONS_MENU_MOUSE_OVER
End If
End Function
Function Lingvo16_getClickLabel() As String
Dim clickType As String
clickType = Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseClickType")
Select Case clickType
Case "leftKeyPlusMenu"
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_ALT_LEFT_CLICK
Case "leftKeyPlusCtrl"
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_CTRL_LEFT_CLICK
Case "leftKeyPlusShift"
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_SHIFT_LEFT_CLICK
Case "middleKey"
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_WHEEL_CLICK
Case "leftKeyPlusCtrlAlt"
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_CTRL_ALT_LEFT_CLICK
Case "leftKeyPlusAltShift"
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_ALT_SHIFT_LEFT_CLICK
Case "leftKeyPlusCtrlShift"
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_CTRL_SHIFT_LEFT_CLICK
Case "leftKeyPlusCtrlWin"
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_CTRL_WIN_LEFT_CLICK
Case Else
Lingvo16_getClickLabel = MSG_OPTIONS_MENU_ALT_LEFT_CLICK
End Select
End Function
' доступность настроек
Sub Lingvo16_settingsEnabled(control As IRibbonControl, ByRef enabled)
Call Lingvo16_writeLog("Checking Settings menu item: " + control.id)
If control.id = "button1" Or control.id = "button5" Then
enabled = True
If Lingvo16_FindMainWindow() = 0 Then
enabled = False
End If
ElseIf control.id = "button2" Or control.id = "button3" Or control.id = "button4" Then
enabled = True
End If
If enabled Then
Call Lingvo16_writeLog("Item is enabled")
Else
Call Lingvo16_writeLog("Item is not enabled")
End If
End Sub
' расстановка галок в меню настроек
Sub Lingvo16_settingsPressed(control As IRibbonControl, ByRef checked)
Call Lingvo16_writeLog("Checking Settings menu item: " + control.id)
If control.id = "button1" Then
checked = True
If Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseCover") = "false" Then
checked = False
End If
ElseIf control.id = "button2" Then
checked = True
If Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseClick") = "false" Then
checked = False
End If
ElseIf control.id = "button3" Then
checked = True
If Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useCtrlInsIns") = "false" Then
checked = False
End If
ElseIf control.id = "button4" Then
checked = True
If Lingvo16_ReadRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useCtrlCC") = "false" Then
checked = False
End If
End If
If checked Then
Call Lingvo16_writeLog("Item is checked")
Else
Call Lingvo16_writeLog("Item is not checked")
End If
End Sub
' изменение настроек
Sub Lingvo16_settingsAction(control As IRibbonControl, isPressed As Boolean)
Call Lingvo16_writeLog("Settings menu item is clicked: " + control.id)
Dim value As String
If isPressed Then
value = "true"
Else
value = "false"
End If
If control.id = "button1" Then
Call Lingvo16_WriteRegistryKey("HKCU\" + LingvoRegistryKey + "\Launcher\useMouseCover", value)
…
|
|||
vbaProject_00.bin |
vba-project | OOXML VBA project: word/vbaProject.bin | 199168 bytes |
SHA-256: d1ba57cbfa8139dace4670f2f03dc6f4ceb48ee9e7b7b82a6310bbfee1998001 |
|||
Open this report in the interactive analyzer, or submit your own file for analysis.