Исходник Shadow_syscall | C++20 Syscalls & Runtime DLL Utils

Залил фикс с мобилы, проверь пожалуйста осталась ли ошибка
пропала,но лично у меня в дебаге
1728150991744.png
.Хз может только у меня так
 
Тоже есть ошибка. Появляется только с мсвц в дебаге. В остальных режиах, и с клангом(оба режима) всё гуд
1728199871108.png
 
MessageBoxA примеру с хаба, вызов проходит,текст вижу далее ошибка выше
Тоже есть ошибка. Появляется только с мсвц в дебаге. В остальных режиах, и с клангом(оба режима) всё гуд
Посмотреть вложение 287321
спасибо за инфу, всё зафиксил, проблема была в самом примере
upd: теперь другая проблема для Debug x86 :NotLikeThis:, сейчас займусь фиксом

зафиксил
 
Последнее редактирование:
Достаточно удобный в использовании враппер сискола.
мой первый (но не последний) гитхаб репо:
Пожалуйста, авторизуйтесь для просмотра ссылки.

в будущем будет обновляться.

буду рад адекватному фидбэку и советам.
добавь поддержку xor для export_name пожалуйста
1728207545541.png
 
добавь поддержку xor для export_name пожалуйста Посмотреть вложение 287324
тебе не нужно ксорить эти строки, эти строки на этапе компиляции со 100% гарантией превращаются в число из-за consteval конструктора hash**_t, у тебя после компиляции эта строка будет чем-то вроде unsigned long long v1 = 438239898534892398

upd: вот как это выглядит:
1728211030822.png

1728210954096.png


более детально:
1728210791153.png

в таком случае строка "This will not be tranformed in compiletime" останется в бинаре после компиляции, потому что оператор () перегружен на хэширование объектов в рантайме, в то время как конструктор hash**_t работает только на этапе компиляции, с "сырыми" строками
 
Последнее редактирование:
выше у чувака была иссуе - он запихнул ксорстринговый ввод в конструктор что строку ожидает.

просто подчеркнуть контракт функции - к тому же, концепты тебе дают способ указать кастомные сообщения об ошибках.
 
к тому же, концепты тебе дают способ указать кастомные сообщения об ошибках.
не видел такого, можешь пожалуйста дать ссылку или пример подобного фьючера? видел пропозал
Пожалуйста, авторизуйтесь для просмотра ссылки.
, но у него с 2018 висит пустой disposition (а ведь предложение было толковым, даже если не в таком виде, то в любом случае это не было бы лишним)
или ты подразумеваешь какой-то workaround со static_assert-ом?
 
Последнее редактирование:
не видел такого, можешь пожалуйста дать ссылку или пример подобного фьючера? видел пропозал
Пожалуйста, авторизуйтесь для просмотра ссылки.
, но у него с 2018 висит пустой disposition (а ведь предложение было толковым, даже если не в таком виде, то в любом случае это не было бы лишним)
или ты подразумеваешь какой-то workaround со static_assert-ом?
я имел ввиду вот такой прикол какой-то:
Пожалуйста, авторизуйтесь для просмотра ссылки.


не совсем элегантно, но вроде бы работает
 
добавил чмаке-листы
добавил тесты

отрефакторил чуток кода:
- добавил новые методы в address_t

Пожалуйста, авторизуйтесь для просмотра ссылки.
 
зафиксил неприятную проблему связанную с кэшом в разных единицах трансляции (ошибка была довольно глупой :D), сорян если кто-то уже успел испытать её на своём коде

подробнее можно почитать
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Вопрос, что это?
Какую функцию оно выполняет?
 
Вопрос, что это?
Какую функцию оно выполняет?
привет вся библиотека рассчитана на платформу Windows, она будет полезной если перед тобой стоит задача как-либо распарсить загруженную в твой процесс DLL, их экспорт-таблицы, заголовки и прочую информацию PE файла (через функцию image(), спасибо linuxpe) в коде C++

вот пара примеров из реального кода, который решает реальные проблемы в C++ стиле, которое можно было бы реализовать через C-style WinAPI

C Style:
Expand Collapse Copy
void find_export() {
  static NTSTATUS(__stdcall * NtSetTimerResolution)(ULONG, BOOLEAN, PULONG);
  NtSetTimerResolution = reinterpret_cast<decltype(NtSetTimerResolution)>(
      GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtSetTimerResolution"));
}
С++ Style:
Expand Collapse Copy
void find_export() {
  static NTSTATUS(__stdcall * NtSetTimerResolution)(ULONG, BOOLEAN, PULONG);
  NtSetTimerResolution = shadow::dll_export("NtSetTimerResolution", "ntdll.dll")
                              .address()
                              .as<decltype(NtSetTimerResolution)>();
}


Old RunPE Windows 11 problem solving:
Expand Collapse Copy
const auto system = shadow::shared_data().system();
// 22631 || 26100
if ( system.build_number() >= 26100 && system.major_version() == 10 ) {
    // https://www.unknowncheats.me/forum/general-programming-and-reversing/667623-win11-24h2-hollowing-process-error-2.html
    const auto ntdll = shadow::dll( "ntdll.dll" );
    const auto patch_address = ntdll.base_address().offset( 0x7BE0 );
    const auto second_patch_address = ntdll.base_address().offset( 0x161A40 );
    const auto thrid_patch_address = ntdll.base_address().offset( 0x5610 );
    const auto fourth_patch_address = shadow::dll_export( "ZwManageHotPatch" ).address();

    const uint8_t patch[4] = { 0x48, 0x31, 0xC0, 0xC3 };

    shadowcall( "WriteProcessMemory", child_process, patch_address.ptr(), patch, 4, 0 );
    shadowcall( "WriteProcessMemory", child_process, second_patch_address.ptr(), patch, 4, 0 );
    shadowcall( "WriteProcessMemory", child_process, thrid_patch_address.ptr(), patch, 4, 0 );
    shadowcall( "WriteProcessMemory", child_process, fourth_patch_address.ptr(), patch, 4, 0 );
}


так же для кого-то будет плюсом то что каждая строка которую ты отдаёшь этой библиотеке (к примеру "NtSetTimerResolution", "ntdll.dll") перестанут быть строками после компиляции, что сделает невозможным статический анализ в целях узнать какой экспорт всё таки ищет функция dll_export

весь IDA 7.5 Pseudo ниже представлен в билде (Debug, loaded with PDB) для упрощения понимания:

C++:
Expand Collapse Copy
int (__fastcall *find_export())(unsigned int, unsigned __int8, unsigned int *)
{
  int (__fastcall *v0)(unsigned int, unsigned __int8, unsigned int *); // rax
  shadow::detail::dll_export result; // [rsp+38h] [rbp-20h] BYREF

  shadow::dll_export(
    &result,
    (shadow::detail::basic_hash<unsigned long long>)0xDF704B8A8D360572ui64,
    (shadow::detail::basic_hash<unsigned long long>)0x98C947DC3D0ED9ACui64);
  shadow::detail::dll_export::address(&result.m_address);
  v0 = shadow::address_t::as<long (*)(unsigned long,unsigned char,unsigned long *)>();
  NtSetTimerResolution = v0;
  return v0;
}

функционал в честь которого названа библиотека (хотя её функционал уже давно расширился, имя репозитория уже явно устарело) позволяет вызывать в коде Nt экспорты через syscallы, что это такое здесь пытаться объяснять не буду, слишком много текста, если хочешь то можешь почитать в интернете "how windows syscalls works".

C++:
Expand Collapse Copy
shadowsyscall<NTSTATUS>( "NtTerminateProcess", reinterpret_cast< HANDLE >( -1 ), -6932 );

и в таком же стиле библиотека позволяет динамически (в рантайме) искать функцию и исполнять её:

C++:
Expand Collapse Copy
shadowcall<int>( "MessageBoxA", nullptr, "string 1", "string 2", MB_OK );

опять же, есть плюс против статического анализа:

Code:
Expand Collapse Copy
void call_dynamically_resolved_function() {
  shadowcall<int>("MessageBoxA", nullptr, "string 1", "string 2", MB_OK);
}

void call_statically_resolved_function() {
  MessageBoxA(nullptr, "string 1", "string 2", MB_OK);
}

int main() {
  call_dynamically_resolved_function();
  call_statically_resolved_function();

  return 0;
}


Pseudocode after compilation:
Expand Collapse Copy
shadow::importer<int,int> *call_dynamically_resolved_function()
{
  shadow::importer<int,int> v1; // [rsp+38h] [rbp-30h] BYREF
  __int64 v2; // [rsp+50h] [rbp-18h] BYREF
  int v3; // [rsp+5Ch] [rbp-Ch] BYREF

  v3 = 0;
  v2 = 0i64;
  return shadowcall<int,std::nullptr_t,char const (&)[9],char const (&)[9],long>(
           &v1,
           (shadow::detail::basic_hash<unsigned long long>)0x5212B3558DC4AC3i64,
           (__int16 *)&v2,
           (const char (*)[9])"string 1",
           (const char (*)[9])"string 2",
           &v3);
}

int call_statically_resolved_function()
{
  return MessageBoxA(0i64, "string 1", "string 2", 0);
}

__int64 __fastcall main()
{
  call_dynamically_resolved_function();
  call_statically_resolved_function();
  return 0i64;
}


P.S. все примеры для тестов доступны в
Пожалуйста, авторизуйтесь для просмотра ссылки.
, по минусам библиотеки - в ближайшее время стоит быть осторожными с неявными кастами при использовании результата от функций shadowcall, shadowsyscall, ошибка проектирования, в ближайшее время текущий коммит будет закреплён на теге, а эта проблема будет вырезана
 
  • Мне нравится
Реакции: mj12
добавил парсер ApiSetMap. потенциальный юзкейс - применение в собственной реализации резольвера forwarded экспортов, чуть позже добавлю примеры в гитхаб репо
Пожалуйста, авторизуйтесь для просмотра ссылки.

C++:
Expand Collapse Copy
#include "shadowsyscall.hpp"

template <class... Types>
void debug_log(const std::wformat_string<Types...> fmt, Types... args) {
  std::wcout << std::format(fmt, std::forward<Types>(args)...) << "\n";
}

int main() {
  auto string_appender = [](std::wstring acc, auto host) {
    auto [value, alias] = host;
    auto separator = acc.empty() ? L"" : L", ";
    return acc.append(separator).append(value);
  };

  for (auto& entry : shadow::api_set_map_enumerator()) {
    auto hosts = std::accumulate(entry.hosts().begin(), entry.hosts().end(), std::wstring{},
                                 string_appender);

    if (hosts.empty())
      hosts.assign(L"none");

    debug_log(L"{} -> {}", entry.contract().clean_name(), hosts);
  }
}

Код:
Expand Collapse Copy
api-ms-onecoreuap-print-render -> printrenderapihost.dll
api-ms-win-appmodel-advertisingid -> kernel.appcore.dll
api-ms-win-appmodel-identity -> kernel.appcore.dll
api-ms-win-appmodel-lifecyclepolicy -> rmclient.dll
api-ms-win-appmodel-runtime-internal -> kernel.appcore.dll
api-ms-win-appmodel-runtime -> kernel.appcore.dll
api-ms-win-appmodel-state -> kernel.appcore.dll
api-ms-win-appmodel-state -> kernel.appcore.dll
api-ms-win-appmodel-unlock -> kernel.appcore.dll
api-ms-win-audiocore-spatial-config -> windows.media.devices.dll
api-ms-win-base-bootconfig -> advapi32.dll
api-ms-win-base-util -> advapi32.dll
api-ms-win-composition-redirection -> dwmredir.dll
api-ms-win-composition-windowmanager -> udwm.dll
api-ms-win-containers-cmclient -> cmclient.dll
api-ms-win-containers-cmclient -> cmclient.dll
api-ms-win-containers-cmclient -> cmclient.dll
api-ms-win-containers-cmclient -> cmclient.dll
api-ms-win-containers-cmclient -> cmclient.dll
api-ms-win-containers-cmdiagclient -> cmclient.dll
api-ms-win-containers-cmservicingclient -> cmclient.dll
api-ms-win-containers-cmservicingclient -> cmclient.dll
api-ms-win-core-apiquery -> ntdll.dll
api-ms-win-core-apiquery -> kernelbase.dll
api-ms-win-core-appcompat -> kernelbase.dll
api-ms-win-core-appinit -> kernel32.dll, kernelbase.dll
api-ms-win-core-atoms -> kernel32.dll
api-ms-win-core-backgroundtask -> kernelbase.dll
api-ms-win-core-bicltapi -> bi.dll
api-ms-win-core-biplmapi -> twinapi.appcore.dll
api-ms-win-core-biplmapi -> twinapi.appcore.dll
api-ms-win-core-biptcltapi -> twinapi.appcore.dll
api-ms-win-core-calendar -> kernel32.dll
api-ms-win-core-com -> combase.dll
api-ms-win-core-com -> coml2.dll
api-ms-win-core-com-midlproxystub -> combase.dll
api-ms-win-core-com-private -> combase.dll
api-ms-win-core-com-private -> combase.dll
api-ms-win-core-com-private -> combase.dll
api-ms-win-core-comm -> kernelbase.dll
api-ms-win-core-commandlinetoargv -> kernelbase.dll
api-ms-win-core-console-ansi -> kernel32.dll
api-ms-win-core-console-internal -> kernelbase.dll
api-ms-win-core-console -> kernelbase.dll
api-ms-win-core-console -> kernelbase.dll
api-ms-win-core-console -> kernelbase.dll
api-ms-win-core-console -> kernelbase.dll
api-ms-win-core-console -> kernelbase.dll
api-ms-win-core-console -> kernelbase.dll
api-ms-win-core-crt -> ntdll.dll
api-ms-win-core-crt -> kernelbase.dll
api-ms-win-core-datetime -> kernelbase.dll
api-ms-win-core-debug -> kernelbase.dll
api-ms-win-core-debug-minidump -> dbgcore.dll
api-ms-win-core-delayload -> kernelbase.dll
api-ms-win-core-enclave -> kernelbase.dll
api-ms-win-core-errorhandling -> kernelbase.dll
api-ms-win-core-featurestaging -> shcore.dll
api-ms-win-core-featuretoggles -> kernelbase.dll
api-ms-win-core-fibers -> kernelbase.dll
api-ms-win-core-fibers -> kernelbase.dll
api-ms-win-core-file-ansi -> kernel32.dll
api-ms-win-core-file-ansi -> kernel32.dll
api-ms-win-core-file-fromapp -> kernelbase.dll
api-ms-win-core-file -> kernelbase.dll
api-ms-win-core-file -> kernelbase.dll
api-ms-win-core-file -> kernelbase.dll
api-ms-win-core-firmware -> kernel32.dll
api-ms-win-core-guard -> kernelbase.dll
api-ms-win-core-handle -> kernelbase.dll
api-ms-win-core-heap -> kernelbase.dll
api-ms-win-core-heap -> kernelbase.dll
api-ms-win-core-heap -> kernelbase.dll
api-ms-win-core-heap-obsolete -> kernelbase.dll
api-ms-win-core-interlocked -> kernelbase.dll
api-ms-win-core-interlocked -> kernelbase.dll
api-ms-win-core-io -> kernel32.dll, kernelbase.dll
api-ms-win-core-ioring -> kernelbase.dll
api-ms-win-core-job -> kernelbase.dll
api-ms-win-core-job -> kernel32.dll
api-ms-win-core-kernel32-legacy-ansi -> kernel32.dll

Many more lines...
 
Назад
Сверху Снизу