• XSS.stack #1 – первый литературный журнал от юзеров форума

Обёртка над WinApi golang

Jeffs

(L1) cache
Забанен
Регистрация
28.12.2018
Сообщения
611
Реакции
358
Пожалуйста, обратите внимание, что пользователь заблокирован
Из интереса написал либу для динамического импорта win-api.
pkg/go_pe - парсер PE-формата. Основан на либе github.com/Velocidex/go-pe, правда я её чуток переписал - в ориг. либе все смещения высчитываются относительно файла, что, в моём случае, было не нужно. Ну и обрезал ненужные функции.
pe, err := go_pe.NewPEFile(reader io.ReadAt), где reader - интерфейс с методом ReadAt(buff []byte, offset int64) (countReaded int, err error) который просто читает данные по смещению offset и возвращает кол-во прочитанных байт, пример:
C:
type Module uintptr
func (m Module) ReadAt(p []byte, off int64) (n int, _ error) {
    if off == -1 {
        return 0, errors.New("negative offset")
    }
    n = len(p)
    m = Module(int64(m) + off)
    for i := 0; i < n; i++ {
        p[i] = *((*byte)(unsafe.Pointer(m + Module(i))))
    }
    return n, nil
}
pkg/dyn_win_api - кастомная реализация GetModuleHandle (парсинг PEB->Ldr) и GetProcAddress (парсинг экспорта загруженного модуля, форварды поддерживаются), ну и небольшая обёртка над всем этим делом.
internal/winapi - пример реализации конечного враппера для дальнейшего удобного использования.
internal/app - пример использования (простой месседж бокс):
C:
package app

import (
    "win/internal/winapi"
)

func Run() {
    w := winapi.NewWinApi()
    w.MessageBox(0, "text", "caption", 0)
}
Сборка - просто запускаем батник build_win32_gui.bat,.
В общем-то и всё. Пример забивания гвоздей тапком, но может кому пригодиться. Так же если кому-нибудь будет интересно - напишу простенькую малварку на го (по типу клиппера/криптора), если будет время. Так же исходники выложу.
 

Вложения

  • WinGo.zip
    10.2 КБ · Просмотры: 14
Пожалуйста, обратите внимание, что пользователь заблокирован
da очень интересно пиши обзательна
Клиппер сейчас пишу на том же го по аналогичному методу: xss.pro/threads/38965/
Чуть позже выложу.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Так же если кому-нибудь будет интересно - напишу простенькую малварку на го (по типу клиппера/криптора), если будет время.
https://xss.pro/threads/49756/
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Лучше криптор, главное с общем рассасыванием зелени как оно работает)
Хорошо, напишу чуть позже.
 
Хорошо, напишу чуть позже.
Будем с нетерпением ждать. Если не трудно еще было бы не плохо к статье прикрепить методы чистки стаба и сорцов от детектов, так как буквально вчера с несколькими людьми спорил, что чудо криптеры за 20 зелени не спасут от ран детектов)o_Oo_O
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Будем с нетерпением ждать. Если не трудно еще было бы не плохо к статье прикрепить методы чистки стаба и сорцов от детектов, так как буквально вчера с несколькими людьми спорил, что чудо криптеры за 20 зелени не спасут от ран детектов)o_Oo_O
Ни одним криптором ты рантайм детекты не уберёшь. Вся суть криптора - скрыть стататик детекты с твоего бинаря.
 
GetProcAddress это низачет, пиши парсинг apiset таблицы, она кстати для разных версий винды разная =)
 
Ни одним криптором ты рантайм детекты не уберёшь. Вся суть криптора - скрыть стататик детекты с твоего бинаря.
Так и есть. А вообще идей для статей много. Начиная от прогрузки малвари в видеопамять(Так можно, да, охуеть, через CUDA например) и до разброса тела малвари по библам фейковой софтины. Но опять-же, большинству людей это не надо. Лучше научить их прочищать детекты в коде. (Мне и самому очень интересно как это грамотно сделать)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вот, а потом спрашиваете, почему я не люблю голанг:
Код:
pText, _ := syscall.UTF16PtrFromString(text)
pCap, _ := syscall.UTF16PtrFromString(caption)
ret1, _, _ := syscall.Syscall6(w.funcs["MessageBoxW"], 4, uintptr(hWnd), uintptr(unsafe.Pointer(pText)), uintptr(unsafe.Pointer(pCap)), uintptr(uType), 0, 0)
Обертка на обертке и оберткой погоняет. Ладно в случае Раста это хоть как то оправдано мастурбацией на безопасный код, но тут... Как бы не хочу никого обидеть, но это какой-то стрём. Голанг явно не для этого инструмент.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вот, а потом спрашиваете, почему я не люблю голанг:
Код:
pText, _ := syscall.UTF16PtrFromString(text)
pCap, _ := syscall.UTF16PtrFromString(caption)
ret1, _, _ := syscall.Syscall6(w.funcs["MessageBoxW"], 4, uintptr(hWnd), uintptr(unsafe.Pointer(pText)), uintptr(unsafe.Pointer(pCap)), uintptr(uType), 0, 0)
Обертка на обертке и оберткой погоняет. Ладно в случае Раста это хоть как то оправдано мастурбацией на безопасный код, но тут... Как бы не хочу никого обидеть, но это какой-то стрём. Голанг явно не для этого инструмент.
Ну не знаю, в этом коде вроде ничего сверьестественного нет, кроме бесконечных кастов, наверное. Да, на го сложно в сис. кодинг, я из чистого интереса решил попробовать.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да, на го сложно в сис. кодинг, я из чистого интереса решил попробовать.
Да понятно, я как бы в принципе не против натягиваний совы на глобус, просто имхо куда практичнее взять более подходящий инструмент. Если не любишь пресловутую сишечку и плюсы, есть Rust, Nim, D, Zig, у которых есть свои крутые плюшки (метапрограммирование то же) и при этом не нужны будут такие жуткие церемонии проходить, чтобы winapi-функцию вызвать (ну кроме Раста, в нем тоже будут для этого долгие церемонии, не знаю правда, у кого из языков большие).
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да понятно, я как бы в принципе не против натягиваний совы на глобус, просто имхо куда практичнее взять более подходящий инструмент. Если не любишь пресловутую сишечку и плюсы, есть Rust, Nim, D, Zig, у которых есть свои крутые плюшки (метапрограммирование то же) и при этом не нужны будут такие жуткие церемонии проходить, чтобы winapi-функцию вызвать (ну кроме Раста, в нем тоже будут для этого долгие церемонии, не знаю правда, у кого из языков большие).
Я в основном на си с классами пишу, раст вот ещё интересен, но что-то всё не могу собраться выучить. Го мне как-то по душе, бэкэнд на нём писать одно удовольствие, вот и решил в сис. кодинг на нём попробовать. Что на си пишется в одну строчку - на го придётся городить целую либу. Каждый язык хорош по своему.
Лично мне как-то проще какую-либо бизнес логику реализовывать на го, чем на с/++. Когда пишу какой-либо проект на си/++ постоянно заморачиваюсь: писать целиком на чистом си (без классов и прочей лабуды) или с плюсовыми фишками. Всё никак не могу к единой структуре кода проекта прийти. Но думаю дело не в ЯП, а в каше в голове.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Так и есть. А вообще идей для статей много. Начиная от прогрузки малвари в видеопамять(Так можно, да, охуеть, через CUDA например) и до разброса тела малвари по библам фейковой софтины. Но опять-же, большинству людей это не надо. Лучше научить их прочищать детекты в коде. (Мне и самому очень интересно как это грамотно сделать)
Ну смотря конечно что за детекты. Какой-либо общей статьи для чистки всей малвари вряд ли выйдет написать, всё индивидуально.
В случае статик детектов аверы любят цепляться к статичным данным (строковым литералам/константам/...) - их нужно каким-либо образом убрать из кода (чтоб в явном виде не светились). С рантаймом всё гораздо сложнее. Нужно понять на что именно идёт детект (методом тыка), уже от этого отталкиваться. Та же авира когда-то детектила дроп исполняемого файла в %temp%, а если тот же файл положить в %appdata% - молчит, тот же аваст детектит чтение БД хрома - нужно заставить хром скопировать БД куда тебе удобно. К примеру, инжектом шеллкода, который тупо будет выполнять CopyFile() в контексте процесса хрома.
Касательно морфинга кода можешь почитать статью от Haunt на форуме, там много примеров и хорошо описана общая логика.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну смотря конечно что за детекты. Какой-либо общей статьи для чистки всей малвари вряд ли выйдет написать, всё индивидуально.
В случае статик детектов аверы любят цепляться к статичным данным (строковым литералам/константам/...) - их нужно каким-либо образом убрать из кода (чтоб в явном виде не светились). С рантаймом всё гораздо сложнее. Нужно понять на что именно идёт детект (методом тыка), уже от этого отталкиваться. Та же авира когда-то детектила дроп исполняемого файла в %temp%, а если тот же файл положить в %appdata% - молчит, тот же аваст детектит чтение БД хрома - нужно заставить хром скопировать БД куда тебе удобно. К примеру, инжектом шеллкода, который тупо будет выполнять CopyFile() в контексте процесса хрома.
Касательно морфинга кода можешь почитать статью от Haunt на форуме, там много примеров и хорошо описана общая логика.
Как говорил чукча: "моя твоя понимать". Я изучаю тематику крипторов очень много, и по рантайму уже пришел к некоторым выводам, которые просятся сами собой - аверы цепляются именно на функции NTAPI - например в начало функции "NtDelayExecution" они ставят RET, что бы она сразу пропускалась - я знаю что это Sleep из kernel32.dll - не просто аналог, а именно она и есть.
Тут либо вратарая нужно делать сразу, что бы патч этот снести, либо выдумывать самому какую то реализацию. Лушче выдумать реализацию свою думаю. Пока пишу свое.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
"NtDelayExecution" они ставят RET, что бы она сразу пропускалась
Вот никто из аверов в здравом уме так делать не будет. Пропускать слип для рандомного софта, это - сделать его неработоспособным для пользователя, тк софт может использовать этот слип для того, чтобы подождать поднятия каких-то своих сервисов. Нельзя просто брать и вырезать слипы рандомному софту. Это может быть актуально для всяких сендбоксов типа кукосендбокс, или для аверских эмуляторов. Но в сендбоксах это точно не будет RET, тк им еще надо увеличить счетчик тактов и время на то значение, на которое малварь должна была спать. В противном случае малварь может проверить эти значения и выйти, если обнаружит, что слип был пропущен. В эмуляторах та же вещь важна, но скорее всего в реализации эмулятора не будет патчей, а просто будет типа своя ntdll с необходимыми эмулятору стабами.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вот никто из аверов в здравом уме так делать не будет. Пропускать слип для рандомного софта, это - сделать его неработоспособным для пользователя, тк софт может использовать этот слип для того, чтобы подождать поднятия каких-то своих сервисов. Нельзя просто брать и вырезать слипы рандомному софту. Это может быть актуально для всяких сендбоксов типа кукосендбокс, или для аверских эмуляторов. Но в сендбоксах это точно не будет RET, тк им еще надо увеличить счетчик тактов и время на то значение, на которое малварь должна была спать. В противном случае малварь может проверить эти значения и выйти, если обнаружит, что слип был пропущен. В эмуляторах та же вещь важна, но скорее всего в реализации эмулятора не будет патчей, а просто будет типа своя ntdll с необходимыми эмулятору стабами.
Вот именно я вчера неправильно и выразился, именно о песке и говорил. Нужно что то придумать, сойдёт хг?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх