BoxedApp

BoxedApp: примеры использования, советы, приемы

BoxedApp SDK 2.1, BoxedApp Packer 2.2


Выпущены новый версии продуктов линейки BoxedApp: BoxedApp SDK 2.1, BoxedApp Packer 2.2.
[ Загрузить демо версии ]


Кратко о том, что сделано:


Редактор виртуального реестра в BoxedApp Packer

Прежде вся работа с виртуальным реестром проводилась в пользовательских плагинах. Если требовалось создать даже один виртуальный ключ реестра - надо было писать плагин, который использует функции BoxedApp SDK.

Теперь BoxedApp Packer содержит полноценный редактор виртуального реестра. Буквально за пару кликов можно создать требуемые виртуальные ключи и задать значения параметров.

[ назад к списку изменений ]

API для перехвата функций

Для создания виртуальной файловой системы / реестра BoxedApp SDK (приложения, созданные BoxedApp Packer, кстати, используют именно его) использует технику перехвата системных функций. Несколько оригинальных идей позволили сделать систему перехвата совместимой с любым окружением, и теперь та часть SDK, которая отвечает за перехват, стала доступна для разработчиков - пользователей SDK.

Теперь BoxedApp SDK может рассматриваться как полноценная альтернатива Detours от Microsoft.

Напомним, что BoxedApp SDK поддерживает как 32-битное, так и 64-битное окружение, а также может быть статически прилинкован к приложениям, использующим VC++ / Delphi любых версий. И, конечно же, SDK может быть использован в любой программной среде, которая поддерживает использование DLL.

Пара примеров на C++ и Delphi, блокирующих возможность создания и открытия файла с названием “1.txt”:

typedef HANDLE (WINAPI *P_CreateFileW)(
	LPCWSTR lpFileName,
	DWORD dwDesiredAccess,
	DWORD dwShareMode,
	LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	DWORD dwCreationDisposition,
	DWORD dwFlagsAndAttributes,
	HANDLE hTemplateFile);
P_CreateFileW g_pCreateFileW;

HANDLE WINAPI My_CreateFileW(
	LPCWSTR lpFileName,
	DWORD dwDesiredAccess,
	DWORD dwShareMode,
	LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	DWORD dwCreationDisposition,
	DWORD dwFlagsAndAttributes,
	HANDLE hTemplateFile)
{
	if (0 == lstrcmpiW(lpFileName, L"1.txt"))
	{
		SetLastError(ERROR_FILE_EXISTS);
		return INVALID_HANDLE_VALUE;
	}
	else
		return g_pCreateFileW(
				lpFileName,
				dwDesiredAccess,
				dwShareMode,
				lpSecurityAttributes,
				dwCreationDisposition,
				dwFlagsAndAttributes,
				hTemplateFile);
}
...
BoxedAppSDK_Init();

PVOID pCreateFileW = GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "CreateFileW");

HANDLE hHook__CreateFileW = BoxedAppSDK_HookFunction(pCreateFileW, &My_CreateFileW, TRUE);

g_pCreateFileW = (P_CreateFileW)BoxedAppSDK_GetOriginalFunction(hHook__CreateFileW);

FILE* f = fopen("1.txt", "r");

// f is NULL
...

BoxedAppSDK_UnhookFunction(hHook__CreateFileW);

Аналогичный пример на Delphi:

type
TCreateFileW = 
   function(lpFileName: PWideChar;
            dwDesiredAccess, dwShareMode: Integer;
            lpSecurityAttributes: PSecurityAttributes;
            dwCreationDisposition, dwFlagsAndAttributes: DWORD;
            hTemplateFile: THandle): THandle; stdcall;

var
   OriginalCreateFileW: TCreateFileW;

function My_CreateFileW(
         lpFileName: PWideChar;
         dwDesiredAccess, dwShareMode: Integer;
         lpSecurityAttributes: PSecurityAttributes;
         dwCreationDisposition, dwFlagsAndAttributes: DWORD;
         hTemplateFile: THandle): THandle; stdcall;
begin
   if 0 = lstrcmpiW(lpFileName, '1.txt') then
   begin
      Result := INVALID_HANDLE_VALUE;
      SetLastError(ERROR_ALREADY_EXISTS);
   end
   else
      Result := 
        OriginalCreateFileW(
           lpFileName, 
           dwDesiredAccess,
           dwShareMode, 
           lpSecurityAttributes, 
           dwCreationDisposition, 
           dwFlagsAndAttributes, 
           hTemplateFile);
end;

var
   pCreateFileW: Pointer;
   hHook__CreateFileW: THandle;

begin
  Application.Initialize;

  BoxedAppSDK_Init;

  pCreateFileW := GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateFileW');
  hHook__CreateFileW := BoxedAppSDK_HookFunction(pCreateFileW, @My_CreateFileW, TRUE);
  OriginalCreateFileW := BoxedAppSDK_GetOriginalFunction(hHook__CreateFileW);

  // This line produces an exception because we prevent creating / opening '1.txt'
  TFileStream.Create('1.txt', fmCreate or fmOpenRead);

  BoxedAppSDK_UnhookFunction(hHook__CreateFileW);
end.

[ назад к списку изменений ]

Мелкие доработки

  • Добавлена поддержка флага FILE_FLAG_DELETE_ON_CLOSE для виртуальных файлов
  • Исправлены небольшие проблемы с запуском виртуальных исполняемых файлов, созданных с помощью Delphi
  • Сделана более гибкая система хранения виртуальных файлов в памяти

[ назад к списку изменений ]

[ Загрузить демо версии ]







Написать комментарий

Вы должны залогиниться чтобы комментировать. Залогиниться