• Как обезопасить проект с полностью раздельным фронтендом и бекендом?

    Alex_Wells
    @Alex_Wells
    verycooldev, што, какие капчи на тостере? Только когда пишешь вопрос нужно галочку нажать, и все)

    Ты с windows xp на старом internet explorer сидишь что ли?)
  • Как обезопасить проект с полностью раздельным фронтендом и бекендом?

    Alex_Wells
    @Alex_Wells
    Только не нужно капчу на сайт вешать - лишь усложняет трем сторонам жизнь.

    Ну либо внешний, отдельный API без капчи делайте)
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, ура!) Удивительно, но оно не крашнулось, а запустилось!) Но там всего 600 строчек кода( Похоже на обычное внешнее АПИ, к сожалению совсем нету времени сейчас разбираться. Еще насторожило это:
    let mp = __setupMP();
    Но __setupMP нигде нету(
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, пока нет ( Я уже хукнул нужные методы, проверил на exe шной сборке ноды - работает. Далее восстановил три из четырех методов, по бесконечным суждениям в IDA. На один из них server.exe ругался, мол его не существует, при попытке подменить ноду - на сей раз такого нет. В общем сигнатура трех из четырех методов совпадает, код - тоже более менее похож, но я в функционале уверен.

    Но осталась еще одна, как раз та, которая возвращает неизвестную структуру. Опять же, я попытался и ее восстановить, но сигнатуры отличаются *__ тут должна была быть куча текста, но я заметил, что в оригинальном методе не char** а char** const __*.

    Скорее всего сейчас я смогу добиться одинаковых сигнатур, но проблема в том, что мой ::StartNode (метод, который мне нужен и в котором эта структура) совсем не похож на оригинальный.. Начало почти идентичное, а дальше идет куча кода, которого в оригинальной нету. К тому же в оригинальном методе, как я писал выше, возвращается переменная, которая является структурой - v8_platform, а в моем такого даже и близко нету, я просто создаю новую структуру и отдаю..
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, восстановил все четыре метода. Все равно не хватает ~68КБ, но не суть. Проблема в том, что главный недостающий метод, node::StartNode, возвращает непонятную структуру:
    struct node::initializeValues_t *

    А вот тут все упоминания этой структуры в server.exe:
    *(_QWORD *)(structure + 24) = node::Environment* // по адресу structure + 24 записывается node::Environment*
    *((_DWORD *) structure + 8) => int exec_argc // тут наоборот: передается аргумент такого типа из этого адреса
    *((_QWORD *) structure + 5) => const char* const* exec_argv // тут аналогично второму


    Насколько я понял, во втором и третьем случае мы берем адрес в памяти структуры (каст в d/qword), добавляем к нему нужный оффсет а потом достаем значение по этому адресу *(выражение). В первом случае мы делаем тоже самое, только с записью.

    В ближайшем коде я не нашел подходящей структуры, даже приблизительно. В коде функции node::StartNode это значение берется так:
    qword_1814D8FC0 = (__int64)v8_platform;
      result = (struct node::initializeValues_t *)&qword_1814D8FC0;
      return result;
    , где qword_1814D8FC0 - непонятно что, но не используется больше нигде, а значит равноценно локальной переменной. Подозреваю, что (__int64) - то, во что компилер превратил *, но VS ругается на такую запись. v8_platform - обьявленная вот так:
    static struct { 
    // код
    } v8_platform;

    структура. Это не тайпдеф, а статическая переменная такого типа.

    Но даже если тайпдефнуть, я не вижу в v8_platform нужных данных. Нету ни одного из трех нужных.

    Что это вообще такое? Подобную структуру в IDA node.dll не вижу, сейчас попробую экспортнуть в .c файл и там поискать. Если знаешь, что это может быть - дай знать) Это может быть структура, которую компилятор автоматически сгенерировал и дал ей такое имя? Или это 100% человеческая работа?
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, нода 9.2.0 весит 22010, оригинал - 22083. Значит кода там нету, а эти 73КБ занимают недостающие функции. Теперь все начинает прояснятся)
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, я обнаружил что в кастомной сборке ноды не хватает 4х методов:
    node::PulseNode(void)
    node::StartNodeInspector(node::Environment*, char const*)
    node::StartNode(int, char** const)
    node::SetIsolate(v8::Isolate*)

    Так же пытаясь понять, для чего они нужны, я понял что версия кастомной ноды - 9.2.0, а не 9.3.0, что очень странно, ибо я точно видел 9.3.0) В общем сейчас пересоберу 9.2.0, сравню ассембл и попробую ее использовать. Заодно на размер файла посмотрю, ну и попытаюсь восстановить эти методы.
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, ахха) Да ничего не делает server, только консольку открывает)))

    Я уже и через appInit пытался (оно вообще не работает, и нет, я не забыл его включить), и через debugger, тоже вчера (или позавчера, уже сбился со счета), там винда говорил, что "Приложение не поддерживается" :(

    А с загрузкой библиотеки, может как-то можно? server.exe залинкован статически, значит как-то этот node.dll подменить можно. Думаю проблема в том, что мой node.dll не экспортирует ничего. У LoadLibraryEx есть кучу флагов, но вроде ничего полезного( Может есть способ редиректнуть экспорты? Или вообще хоть как-то их загрузить?
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, )

    Попробовал совсем без ничего,
    BOOL APIENTRY DllMain( HMODULE hModule, DWORD  dwReason, LPVOID lpReserved) {
    	LoadLibrary(L"D:/node.dll");
    }

    По пути точно есть node.dll, я смог в тестовой программе ее загрузить и вытащил адрес нужной мне функции. Но при попытке сделать тоже самое тут, вылазит 0xc0000007b:
    5b0d3356d5722005628616.png

    Про MinHook, да, я еще вчера ее нашел, тоже приглянулась) Как раз вчера и хукал ею.
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, **disclaimer: у меня знания c++ на уровне школьника, все остальное я делаю методом тыка, гугла и догадок из других языков**

    Уже смотрел, у ноды DllMain не делает вообще ничего (только запрещает дальнейшие его вызовы). Концепт понятен, а реализация - не совсем. Про хук, примерно так?:
    HINSTANCE hGetProcIDDLL = LoadLibrary("C:\\Documents and Settings\\User\\Desktop\\test.dll");
    f_funci funci = (f_funci)GetProcAddress(hGetProcIDDLL, "funci");
    // тут хукнуть

    Если да, то разве server.exe увидит экспортированные методы из оригинальной ноды? Это было бы весьма странно, но если это так - прекрасно) Если нет - прошу подсказать как добится этого)

    Спасибо тебе за ответы и помощь. Я бы хотел скинуть тебе копеечку на чай, если это разрешено на Тостере)
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, именно так и сделано)

    typedef v8::MaybeLocal<v8::Script>(v8::Script::*CompileFunc)(v8::Local<v8::Context>, v8::Local<v8::String>, v8::ScriptOrigin*);
    
    uintptr_t AddressOfCompile = 0;
    
    v8::MaybeLocal<v8::Script> __fastcall HookedCompile(v8::Local<v8::Context> context, v8::Local<v8::String> source, v8::ScriptOrigin* origin)
    {
    	std::cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << std::endl;
    
    	v8::Script::CompileFunc originalCompile = (v8::Script::CompileFunc) AddressOfCompile;
    	return originalCompile(context, source, origin);
    }


    Есть вот такие функции для инжекта, причем они удачно инжектятся. Проблема в том, что сервер запускается моментально и заинжектить (даже автоматическим) не успеваю до любого вызова этого метода. Как то можно приостановить выполнение программы после загрузки node.dll, но до выполнения кода загрузки? Если ставлю брейкпоинты в IDA и инжекчу код, она начинает кидатся ексепшенами(
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, ну допустим что QWORD = int64, тогда почему IDA для моей ф-ии генерит __int64, а там _QWORD? Я сейчас еще сравню сигнатуры через SigMaker тот же, посмотрю.

    На счет линукса, да, есть файл и под линукс. Там нету .dll/.so, просто один большой файлик, но в нем невозможно ничего найти (половина кода не декомпилится, весь неймспейс v8:: тоже не находится, в общем одни только sub_ ). Через GDB тоже самое. Есть еще варианты?)
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, вот весь псевдокод из hex rays:
    const uint8_t* OUR_CODE_IN_UINT8 = sub_14001D570(&v134);
        if ( OUR_CODE_IN_UINT8[3] >= 0x10ui64 )
          OUR_CODE_IN_UINT8 = (_QWORD *)*OUR_CODE_IN_UINT8;
        v49 = (__int64 *)v8::String::NewFromOneByte(isolate, OUR_CODE_IN_UINT8, 0i64, v83);
        Local<String> OUR_CODE = *v49;
        if ( !*v49 )
        {
          v8::V8::ToLocalEmpty();
          OUR_CODE = *v49;
        }
        v52 = v8::Script::Compile(context, OUR_CODE);


    Там я подставил "const uint8_t* " что бы не забыть, на самом деле я понятия не имею, что там за тип.
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, смотри, в коде нашел такое: OUR_CODE_IN_UINT8 = sub_14001D570();

    Функция что-то делает с bt.dat файлом, без которого приложение не запускается и он идет в комплекте с ним. Весит всего 16КБ, так что всего кода там точно нету, но результат передается в v8::String::NewStringFromOneByte, а оттуда - в v8::Script::Compile. Собственно я могу инжектнуть ДЛЛку, найти адресс этой ф-ии в памяти и вызвать ее, верно? Собственно до адреса проблем нету, проблема в том, что я не знаю тип возвращаемого ею аргумента. В сигнатуре v8::String::NewStringFromOneByte нужно передать const uint8_t*, но при попытке скомпилить ДЛЛку я получаю __int64 на выходе моей хукнутой функции, в то время как в оригинале - _QWORD*. Собственно сигнатура должна совпадать, а у меня так не выходит.

    Вот что я имею в виду
    typedef int func(void);
    func* f = (func*)0xdeadbeef;
    int i = f();


    Только я не знаю, int там или что. Но точно что-то, что можно привести
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, что ты имеешь в виду под "запускать в консоли"? Сервер exe шный, он подтягивает сорцы "аддонов" на JS, но уже после загрузки нужного мне кода, так что перезапись мне не поможет( Да и к тому же, насколько я понял вызываются нативные плюсовые функции ноды и v8.
  • Как подменить данные о GPU с помощью MS Detours 3.0?

    Alex_Wells
    @Alex_Wells
    Здравствуйте. У меня вообще не собирается проект с detours, но подозреваю, что когда таки соберу, будет такая же проблема, как и у вас. Вы смогли решить ее?
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, пхха, ну я тоже не фанат. Но в любом случае же нужна винда для detours.

    Другие варианты хуукинга для меня, как для человека, знающего C++ на уровне догадок из опыта других языков и базовых знаний, недоступны(

    Чисто теоретичски можно было бы скомпилить .so с перезаписанным методом и подключить, но тогда метод не будет работать. В общем если у вас есть еще варианты, как хукнуть метод класса из .dll файла, был бы рад их послушать, ибо я в тупике =/
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, все таки заставил MinGW это компилить, теперь такой трабл:
    d:/programmingnew/win-builds/bin/../lib64/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: skipping incompatible D:/Detour-master/dll/detours.lib when searching for -ldetours

    Почему компилер не хочет использовать эту библиотеку? Я прямо конкретно на нее указал в CMakeLists
  • Как достать выполняемый JS из node?

    Alex_Wells
    @Alex_Wells Автор вопроса
    rustler2000, нашел такой, вместе с видео туториалом: https://github.com/Zer0Mem0ry/Detour/blob/master/d...

    Собственно переделал под себя, нашел сигнатуру метода, но не могу скомпилить: https://pastebin.com/AKxRbya1
    5b0addc3b7636537028438.png
    Хотя либа подключена. Я не использую VS в работе, как автор, а при попытке скомпилить вручную minGW - проблемы еще хуже.