forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   РесурсФайл+Xors3D (http://forum.boolean.name/showthread.php?t=17780)

Izunad 23.01.2013 15:28

РесурсФайл+Xors3D
 
Всем привет!
Пишу на PureBasic+Xors3D. Есть одна маленькая задачка: "Xочу чтобы мои драгоценные файлы с картинками и моделями были недоступны простым смертным, потому хочу спрятать это дело в какой нибудь ПакФайл." Проблема в том что я не знаю как заставить Xors3D вычитывать ресурсы из этого файла. :dontknow:

Platon 23.01.2013 16:35

Ответ: РесурсФайл+Xors3D
 
Если я не ошибаюсь, Xors3D не умеет грузить ресурсы из памяти, поэтому как один из вариантов - перехват вызовов WINAPI функций CreateFile и ReadFile из Kernel32.dll, например сплайсингом.
ключевые функции здесь для сплайсинга - GetModuleHandle, GetProcAddress, WriteProcessMemory
лень расписывать что да как, погугли может сам поймешь :)

Izunad 23.01.2013 16:44

Ответ: РесурсФайл+Xors3D
 
Хорошо. Я когда то давно наталкивался на подробное описание всех Xors объектов в памяти. Все значения были расписаны по блокам. Сейчас же не могу найти, я думаю мне это помогло бы.

Platon 23.01.2013 16:54

Ответ: РесурсФайл+Xors3D
 
Еще один вариант перехвата ( он кстати лучше, т.к. безопаснее в многопоточной среде, ну и "грамотнее" ) - замена адресов CreateFile и ReadFile в Import Address Table у процесса. Для этого погугли спеку на PE формат. Сам заголовок PE берешь как инстенс процесса - функцией WINAPI - GetModuleHandle( 0 ), ну а дальше по спеке смещаешься на табличку, ищешь эти функи и меняешь адреса на свои.
ЗЫ
Завтра вечерком распишу подробнее.

Цитата:

Сообщение от Izunad (Сообщение 250412)
Хорошо. Я когда то давно наталкивался на подробное описание всех Xors объектов в памяти. Все значения были расписаны по блокам. Сейчас же не могу найти, я думаю мне это помогло бы.

Не, это не совсем то. Хотя да и таким способом можно решить, но помоему перехват проще.

Izunad 23.01.2013 17:01

Ответ: РесурсФайл+Xors3D
 
Будем вникать =)

wolfhound512 23.01.2013 17:06

Ответ: РесурсФайл+Xors3D
 
Xors3D умеет грузить файлы из запороленных ZIP файлов, наверное и расширение сменить можно, чтобы незаметнее было. Смотри описание xMountPackFile() в справке, там все подробно расписано.
Цитата:

Я когда то давно наталкивался на подробное описание всех Xors объектов в памяти. Все значения были расписаны по блокам.
Наверное это все же было описание Blitz3D от MixalV

Platon 23.01.2013 17:55

Ответ: РесурсФайл+Xors3D
 
Цитата:

Сообщение от wolfhound512 (Сообщение 250418)
xMountPackFile

А он не во временную-ли папку распаковывает?
Да и пароль в ехешке даже блокнотом легко будет увидеть :) в любом случае прийдется ехешку паковать каким-нить протектором вроде Armadillo.

Izunad 23.01.2013 18:04

Ответ: РесурсФайл+Xors3D
 
ща проверим

Izunad 23.01.2013 20:49

Ответ: РесурсФайл+Xors3D
 
Я лично не смог найти свой пароль через блокнот, также не нашел распакованные файлы. Это конечно не спасет от рук продвинутых взломщиков, но простому смертному будет очень трудно заменить украсть файлы. А значит задача выполнена =)
Код:

IncludeFile"Resurse\Module\Xors3D.pbi"
xGraphics3D(800,600,32)
xMountPackFile("resurse\images\menu\label.zip","labels\","password")
; при загрузке добавляем метку "labels\" плюс имя файла
image1=xLoadImage("labels\label.bmp")
 While Not xKeyHit(1)
  xDrawImage (Image1,0,0)
  xFlip()
  xCls()
 Wend

Но если вам ваши файлы очень дороги, советую найти другой способ...

Platon 23.01.2013 21:52

Ответ: РесурсФайл+Xors3D
 
Цитата:

Сообщение от Izunad (Сообщение 250461)
Я лично не смог найти свой пароль через блокнот, также не нашел распакованные файлы.

Он там есть, поверь, все строки хранятся в data секции ехешника.
А временные файлы на то и временные, что после закрытия сразу же удаляются системой. Поэтому если юзер знаком с каким-нить отладчиком даже общем уровне, сможет остановить процесс на распаковке и сдернуть файл из temp папки :)

Цитата:

Сообщение от Izunad (Сообщение 250461)
Но если вам ваши файлы очень дороги, советую найти другой способ...

Надо учитывать стоимость контента, если он недорогой, то врят-ли какой-то хакер будет возится с его извлечением и хватит простых способов скрытия. Ну а если что-то дорогое, стоимость чего не превысит стоимости работы хакера, то тут ничего не поможет, все ломается, вопрос лишь в цене :)

вот вобщем расписал как перехват сделать, раз уж речь про это зашла
это конечно в данном случае ненужно, раз есть способ грузить с архива, но мало-ли, захочется кому-нить свое написать :)
Код:

EnableExplicit

Structure IMAGE_IMPORT_DESCRIPTOR
        ; относительный виртуальный адрес на оригинальную таблицу импорта
        ; в этой таблице содержатся имена или номера функций которые должны быть
        ; проинициализированы адресами
        ; имеет значение 0 если это концевой дескриптор
        OriginalFirstThunk.l
        ; штамп времени биндинга библиотеки системным загрузчиком
        TimeDateStamp.l
        ; указывает наличие переадресации к другой библиотеки
        ForwarderChain.l
        ; относительный вирутальный адрес на имя библиотеки
        Name.l
        ; относительный виртуальный адрес на инициализированную таблицу импорта
        ; в этой таблице содержатся уже адреса функций записанных
        ; системным загрузчиком
        FirstThunk.l
EndStructure

Structure IMAGE_THUNK_DATA32
        ; адрес функции
        ; ( в оригинальной таблице указывает на структуру IMAGE_IMPORT_BY_NAME )
        ; имеет значение 0 если это концевой указатель
        Function.l
EndStructure

;
; поиск в модуле дескриптора таблицы импорта по заданному имени библиотеки
;
Procedure FindImportDescriptor( BaseAddress.l, LibraryNameAddress.l )
        ; базовый адрес указывает на устаревший DOS заголовок
        Protected *IDH.IMAGE_DOS_HEADER = BaseAddress
        ; смещаемся на новый NT заголовок
        Protected *INH.IMAGE_NT_HEADERS = *IDH + *IDH\e_lfanew
        ; смещаемся на таблицу импорта
        Protected *IID.IMAGE_IMPORT_DESCRIPTOR = *IDH + *INH\OptionalHeader\DataDirectory[ #IMAGE_DIRECTORY_ENTRY_IMPORT ]\VirtualAddress
        ; ищем нужный дескриптор пока не достигнем концевого
        While *IID\OriginalFirstThunk <> 0
                ; сравниваем имя библиотеки в дескрипторе с искомым
                ;
                ; конкретно для KERNEL32.DLL
                ; можно произвести сравнение оптимальнее
                ; если представить KERNEL32 как 64-битное целое, например так:
                ;
                ; Protected *Name.Quad = *IDH + *IID\Name
                ; If *Name\q = '23LENREK'
                ;    ProcedureReturn *IID
                ; EndIf
                ;
                If CompareMemoryString( *IDH + *IID\Name, LibraryNameAddress, #PB_String_NoCase ) = #PB_String_Equal
                        ProcedureReturn *IID
                EndIf
                ; смещаемся на следующий дескриптор
                *IID + SizeOf( IMAGE_IMPORT_DESCRIPTOR )
        Wend
        ProcedureReturn 0
EndProcedure

;
; поиск в таблице импорта указателя на адрес по заданному адресу
;
Procedure FindThunkData( BaseAddress.l, *ImportDescriptor.IMAGE_IMPORT_DESCRIPTOR, TargetAddress.l )
        Protected *ThunkData.IMAGE_THUNK_DATA32 = BaseAddress + *ImportDescriptor\FirstThunk
        ; ищем нужный указатель пока не достигнем концевого
        While *ThunkData\Function <> 0
                ; сравниваем адреса
                If *ThunkData\Function = TargetAddress
                        ProcedureReturn *ThunkData
                EndIf
                ; смещаемся на следующий указатель
                *ThunkData + SizeOf( IMAGE_THUNK_DATA32 )
        Wend
        ProcedureReturn 0
EndProcedure

; прототипы оригинальных перехватываемых функций

Prototype WINAPICreateFile( *lpFileName, dwDesiredAccess.l, dwShareMode.l, *lpSecurityAttributes, dwCreationDistribution.l, dwFlagsAndAttributes.l, hTemplateFile.l )
Prototype WINAPIReadFile( hFile.l, *lpBuffer, nNumberOfBytesToRead.l, *lpNumberOfBytesRead, *lpOverlapped )
Prototype WINAPICloseHandle( hFile.l )

; адреса оригинальных перехватываемых функций

Global WINAPICreateFile.WINAPICreateFile
Global WINAPIReadFile.WINAPIReadFile
Global WINAPICloseHandle.WINAPICloseHandle

; свои функции которые будут заменять WINAPI функции

Procedure MyCreateFile( *lpFileName, dwDesiredAccess.l, dwShareMode.l, *lpSecurityAttributes, dwCreationDistribution.l, dwFlagsAndAttributes.l, hTemplateFile.l )
       
        ; здесь например по имени файла из указателя *lpFileName определяем
        ; что нужно сделать - найти файл в архиве или вызвать оригинальную функцию
        ; ( вызывать CreateFile нельзя, т.к. адрес в таблице указывает на эту же функцию
        ;  и произойдет рекурсивный вызов, поэтому вызывать нужно именно WINAPICreateFile )
       
        MessageRequester( "", "Hello from MyCreateFile!" )
       
EndProcedure

Procedure MyReadFile( hFile.l, *lpBuffer, nNumberOfBytesToRead.l, *lpNumberOfBytesRead, *lpOverlapped )
       
        ; здесь по переданому хендлу hFile
        ; определяем что это за файл, архивный или нет
        ; и соответственно читаем буфер из архива
        ; или же вызываем оригинальную функцию WINAPIReadFile
       
        MessageRequester( "", "Hello from MyReadFile!" )
       
EndProcedure

Procedure MyCloseHandle( hFile.l )
       
        ; здесь по переданому хендлу hFile
        ; определяем что это за файл, архивный или нет
        ; и соответственно этому выполняем необходимые действия
        ; либо освобождаем ресурсы выделенные под архивный файл
        ; либо вызываем оригинальную функцию WINAPICloseHandle
       
        MessageRequester( "", "Hello from MyCloseHandle!" )
       
EndProcedure

; адрес библиотеки kernel32.dll
Define KERNEL32.l = GetModuleHandle_( @"KERNEL32.DLL" )

; адреса функций
Define CreateFileAddress.l = GetProcAddress_( KERNEL32, @"CreateFileA" )
Define ReadFileAddress.l = GetProcAddress_( KERNEL32, @"ReadFile" )
Define CloseHandleAddress.l = GetProcAddress_( KERNEL32, @"CloseHandle" )

; адрес этой программы
Define BaseAddress.l = GetModuleHandle_( 0 )

; дескриптор импорта библиотеки kernel32.dll
Define *ImportDescriptor.IMAGE_IMPORT_DESCRIPTOR = FindImportDescriptor( BaseAddress, @"KERNEL32.DLL" )

; указатели на адреса импортированых функций
Define *CreateFileThunkData.IMAGE_THUNK_DATA32 = FindThunkData( BaseAddress, *ImportDescriptor, CreateFileAddress )
Define *ReadFileThunkData.IMAGE_THUNK_DATA32 = FindThunkData( BaseAddress, *ImportDescriptor, ReadFileAddress )
Define *CloseHandleThunkData.IMAGE_THUNK_DATA32 = FindThunkData( BaseAddress, *ImportDescriptor, CloseHandleAddress )

; переписываем адреса функций на свои
*CreateFileThunkData\Function = @MyCreateFile()
*ReadFileThunkData\Function = @MyReadFile()
*CloseHandleThunkData\Function = @MyCloseHandle()

; проверяем подмену вызвав оригинальные функции
Define File.l, Temp.l
File = CreateFile_( @"PureBasic.chm", #GENERIC_READ, 0, 0, #OPEN_EXISTING, 0, 0 )
ReadFile_( File, Temp, SizeOf( Temp ), @Temp, 0 )
CloseHandle_( File )

; восстанавливаем оригинальные адреса функций
*CreateFileThunkData\Function = CreateFileAddress
*ReadFileThunkData\Function = ReadFileAddress
*CloseHandleThunkData\Function = CloseHandleAddress

; проверяем еще раз чтобы убедится что адреса восстановлены успешно
File = CreateFile_( @"PureBasic.chm", #GENERIC_READ, 0, 0, #OPEN_EXISTING, 0, 0 )
ReadFile_( File, Temp, SizeOf( Temp ), @Temp, 0 )
CloseHandle_( File )

End


SBJoker 23.01.2013 22:14

Ответ: РесурсФайл+Xors3D
 
Из надёжных неназванных источников стало известно что xMountPackFile загружает сразу в память.

MadMedic 24.01.2013 16:29

Re: РесурсФайл+Xors3D
 
Если не хочешь чтобы пароль сперли из экзешника тупо блокнотом то сделай такой код. Допустим твой пароль "111222333", напиши вместо этого Str(333666999/3). Теперь блокнотом его не будет видно

Platon 25.01.2013 14:21

Ответ: РесурсФайл+Xors3D
 
Вот только все это бесполезно, попадется продвинутый юзер, который умеет отладчик юзать ( а для этого особого ума и ненадо ) и все :)

HolyDel 25.01.2013 14:33

Ответ: РесурсФайл+Xors3D
 
от продвинутого ничего не спасет. надо, чтобы не не сперли детсадовцы.

Maxus 04.11.2016 13:05

Ответ: РесурсФайл+Xors3D
 
Темка конечно очень не актуальна, то тем не менее.
Простой способ подменять переход непосредственно в самой процедуре.
Но не забывать при переходе на старую процедуру проверять участок памяти на существование.
IsBadReadPtr_ - смотрим как эта штука работает.


Часовой пояс GMT +4, время: 18:04.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot