На создание данного скрипта меня натолкнула эта тема.
Вкратце, там выделен тезис о том, что Rapogliff (а, вероятно, и не только он) обходит AS от Darkpixel'я и цепляется к левым сайтам. Все эти действия, естественно, проходят от процесса gta_sa.exe.
Взлом жопы предлагал кинуть в hosts некоторые домены, к которым цепляется Rapogliff, мы же немного улучшим этот способ, динамически создавая для процесса gta_sa.exe вайтлист только из тех IP'шников, к которым он подключается для игры.
Windows Firewall Control. Неплохая оболочка для стандартного виндоского брандмауэра, позволяющая быстро настроить вайт и блек листы программ (посредством правил брандмауэра), которым можно обращаться в сеть. Но речь сейчас не о ней (все гуглится), а об одном из режимов ее работы, когда доступ в сеть имеют только программы из вайтлиста.
Исходные данные: gta_sa.exe не должно быть в блек или вайтлисте.
Описание работы: только для internal стиллеров, с external и сам WFC справится. Среди всех процесов gta_sa.exe смотрим ip сервера samp, к которому он подключается (аргумент -h командной строки) и добавляем в вайтлист правило с gta_sa.exe и соответствующим ip адресом. При закрытии процесса gta соответствующее правило удаляется.
Особенности: скрипт должен быть запущен с правами администратора. Скрипты/плагины gta'шки не смогут удалить/модифицировать правила файрволла, т.к. на это требуются привелегии администратора => они не смогут подключиться никуда кроме ip-адресов игровых серверов samp, на которые вы в данный момент зашли.
Да, можно было бы создавать правила не через powershell, а через COM объекты и брать путь к gta_sa.exe из запущенного exe'шника, а не из реестра, но так как реализовано - хоть и медленнее, но проще и вероятность ошибки в данных моментах довольно мала.
Вкратце, там выделен тезис о том, что Rapogliff (а, вероятно, и не только он) обходит AS от Darkpixel'я и цепляется к левым сайтам. Все эти действия, естественно, проходят от процесса gta_sa.exe.
Взлом жопы предлагал кинуть в hosts некоторые домены, к которым цепляется Rapogliff, мы же немного улучшим этот способ, динамически создавая для процесса gta_sa.exe вайтлист только из тех IP'шников, к которым он подключается для игры.
Windows Firewall Control. Неплохая оболочка для стандартного виндоского брандмауэра, позволяющая быстро настроить вайт и блек листы программ (посредством правил брандмауэра), которым можно обращаться в сеть. Но речь сейчас не о ней (все гуглится), а об одном из режимов ее работы, когда доступ в сеть имеют только программы из вайтлиста.
Всплывающее окно при попытке подключения программы, которой нет в вайт/блеклисте.
Главное окно
Главное окно
Исходные данные: gta_sa.exe не должно быть в блек или вайтлисте.
Описание работы: только для internal стиллеров, с external и сам WFC справится. Среди всех процесов gta_sa.exe смотрим ip сервера samp, к которому он подключается (аргумент -h командной строки) и добавляем в вайтлист правило с gta_sa.exe и соответствующим ip адресом. При закрытии процесса gta соответствующее правило удаляется.
Особенности: скрипт должен быть запущен с правами администратора. Скрипты/плагины gta'шки не смогут удалить/модифицировать правила файрволла, т.к. на это требуются привелегии администратора => они не смогут подключиться никуда кроме ip-адресов игровых серверов samp, на которые вы в данный момент зашли.
Да, можно было бы создавать правила не через powershell, а через COM объекты и брать путь к gta_sa.exe из запущенного exe'шника, а не из реестра, но так как реализовано - хоть и медленнее, но проще и вероятность ошибки в данных моментах довольно мала.
AutoHotKey:
#SingleInstance force
#Persistent
SetBatchLines -1
global prevIPs := []
global mainrulename := "ahk_antistealer_autocreated_rule"
OnExit("ExitFunc") ; Удалит все созданные за время работы правила
SetTimer, mainloop, 1000
return
mainloop()
{
currentIPs := []
for proc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
if ( proc.name == "gta_sa.exe" && RegExMatch(proc.commandline, "-h (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", ip) )
currentIPs.push(ip1)
for k, v in getObjDifference(currentIPs, prevIPs)
{
if ( v.action == "del" )
deleteFirewallRule("'" mainrulename " " v.value "'")
else if ( v.action == "add" )
addFirewallRule("'" mainrulename " " v.value "'", v.value, sampGetGamePath() "\gta_sa.exe")
}
prevIPs := currentIPs.clone()
}
ExitFunc(ExitReason, ExitCode)
{
SetTimer, mainloop, Off
for k, v in prevIPs
deleteFirewallRule("'" mainrulename " " v "'")
return 0
}
sampGetGamePath()
{
RegRead, exePath, HKEY_CURRENT_USER\Software\SAMP, gta_sa_exe
if ( !exePath )
{
; throw Exception("Not found path to gta_sa.exe.")
return ""
}
if ( RegExMatch(exePath, "(.+)\\gta_sa.exe", folderPath) )
return folderPath1
else
{
; throw Exception("Unknown error")
return ""
}
}
getObjDifference(current, prev)
{
result := []
for k, v in current
if ( !isInObj(prev, v) )
result.push({"action":"add", "value":v})
for k, v in prev
if ( !isInObj(current, v) )
result.push({"action":"del", "value":v})
return result
}
isInObj(ByRef obj, needle)
{
if ( !IsObject(obj) )
return false
for k, v in obj
if ( v == needle )
return true
return false
}
deleteFirewallRule(rulename)
{
psScript := "Remove-NetFirewallRule -DisplayName " rulename
runPowershellCmd(psScript)
}
addFirewallRule(rulename, ip := "", programPath := "", action := "Allow", Direction := "Outbound")
{
psScript := "New-NetFirewallRule -DisplayName " rulename (programPath ? " -Program '" programPath "'" : "") " -Action " action " -Direction " Direction (ip ? " -RemoteAddress " ip : "")
runPowershellCmd(psScript)
}
runPowershellCmd(cmd)
{
Run PowerShell.exe -Command & {%cmd%},, hide
}
Последнее редактирование: