|
Xors3D Графический движок с поддержкой DirectX9 |
23.01.2013, 15:28
|
#1
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
РесурсФайл+Xors3D
Всем привет!
Пишу на PureBasic+Xors3D. Есть одна маленькая задачка: "Xочу чтобы мои драгоценные файлы с картинками и моделями были недоступны простым смертным, потому хочу спрятать это дело в какой нибудь ПакФайл." Проблема в том что я не знаю как заставить Xors3D вычитывать ресурсы из этого файла.
|
(Offline)
|
|
23.01.2013, 16:35
|
#2
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: РесурсФайл+Xors3D
Если я не ошибаюсь, Xors3D не умеет грузить ресурсы из памяти, поэтому как один из вариантов - перехват вызовов WINAPI функций CreateFile и ReadFile из Kernel32.dll, например сплайсингом.
ключевые функции здесь для сплайсинга - GetModuleHandle, GetProcAddress, WriteProcessMemory
лень расписывать что да как, погугли может сам поймешь
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.01.2013, 16:44
|
#3
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: РесурсФайл+Xors3D
Хорошо. Я когда то давно наталкивался на подробное описание всех Xors объектов в памяти. Все значения были расписаны по блокам. Сейчас же не могу найти, я думаю мне это помогло бы.
|
(Offline)
|
|
23.01.2013, 16:54
|
#4
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: РесурсФайл+Xors3D
Еще один вариант перехвата ( он кстати лучше, т.к. безопаснее в многопоточной среде, ну и "грамотнее" ) - замена адресов CreateFile и ReadFile в Import Address Table у процесса. Для этого погугли спеку на PE формат. Сам заголовок PE берешь как инстенс процесса - функцией WINAPI - GetModuleHandle( 0 ), ну а дальше по спеке смещаешься на табличку, ищешь эти функи и меняешь адреса на свои.
ЗЫ
Завтра вечерком распишу подробнее.
Сообщение от Izunad
Хорошо. Я когда то давно наталкивался на подробное описание всех Xors объектов в памяти. Все значения были расписаны по блокам. Сейчас же не могу найти, я думаю мне это помогло бы.
|
Не, это не совсем то. Хотя да и таким способом можно решить, но помоему перехват проще.
|
(Offline)
|
|
23.01.2013, 17:01
|
#5
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: РесурсФайл+Xors3D
Будем вникать =)
|
(Offline)
|
|
23.01.2013, 17:06
|
#6
|
Знающий
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений (для 299 пользователей)
|
Ответ: РесурсФайл+Xors3D
Xors3D умеет грузить файлы из запороленных ZIP файлов, наверное и расширение сменить можно, чтобы незаметнее было. Смотри описание xMountPackFile() в справке, там все подробно расписано.
Я когда то давно наталкивался на подробное описание всех Xors объектов в памяти. Все значения были расписаны по блокам.
|
Наверное это все же было описание Blitz3D от MixalV
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо wolfhound512 за это полезное сообщение:
|
|
23.01.2013, 17:55
|
#7
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: РесурсФайл+Xors3D
Сообщение от wolfhound512
xMountPackFile
|
А он не во временную-ли папку распаковывает?
Да и пароль в ехешке даже блокнотом легко будет увидеть в любом случае прийдется ехешку паковать каким-нить протектором вроде Armadillo.
|
(Offline)
|
|
23.01.2013, 18:04
|
#8
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: РесурсФайл+Xors3D
ща проверим
|
(Offline)
|
|
23.01.2013, 20:49
|
#9
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: РесурсФайл+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
Но если вам ваши файлы очень дороги, советую найти другой способ...
|
(Offline)
|
|
23.01.2013, 21:52
|
#10
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: РесурсФайл+Xors3D
Сообщение от Izunad
Я лично не смог найти свой пароль через блокнот, также не нашел распакованные файлы.
|
Он там есть, поверь, все строки хранятся в data секции ехешника.
А временные файлы на то и временные, что после закрытия сразу же удаляются системой. Поэтому если юзер знаком с каким-нить отладчиком даже общем уровне, сможет остановить процесс на распаковке и сдернуть файл из temp папки
Сообщение от Izunad
Но если вам ваши файлы очень дороги, советую найти другой способ...
|
Надо учитывать стоимость контента, если он недорогой, то врят-ли какой-то хакер будет возится с его извлечением и хватит простых способов скрытия. Ну а если что-то дорогое, стоимость чего не превысит стоимости работы хакера, то тут ничего не поможет, все ломается, вопрос лишь в цене
вот вобщем расписал как перехват сделать, раз уж речь про это зашла
это конечно в данном случае ненужно, раз есть способ грузить с архива, но мало-ли, захочется кому-нить свое написать
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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.01.2013, 22:14
|
#11
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: РесурсФайл+Xors3D
Из надёжных неназванных источников стало известно что xMountPackFile загружает сразу в память.
__________________
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
|
|
24.01.2013, 16:29
|
#12
|
ПроЭктировщик
Регистрация: 05.08.2006
Сообщений: 183
Написано 107 полезных сообщений (для 410 пользователей)
|
Re: РесурсФайл+Xors3D
Если не хочешь чтобы пароль сперли из экзешника тупо блокнотом то сделай такой код. Допустим твой пароль "111222333", напиши вместо этого Str(333666999/3). Теперь блокнотом его не будет видно
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.01.2013, 14:21
|
#13
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Ответ: РесурсФайл+Xors3D
Вот только все это бесполезно, попадется продвинутый юзер, который умеет отладчик юзать ( а для этого особого ума и ненадо ) и все
|
(Offline)
|
|
25.01.2013, 14:33
|
#14
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: РесурсФайл+Xors3D
от продвинутого ничего не спасет. надо, чтобы не не сперли детсадовцы.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
04.11.2016, 13:05
|
#15
|
ПроЭктировщик
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений (для 36 пользователей)
|
Ответ: РесурсФайл+Xors3D
Темка конечно очень не актуальна, то тем не менее.
Простой способ подменять переход непосредственно в самой процедуре.
Но не забывать при переходе на старую процедуру проверять участок памяти на существование.
IsBadReadPtr_ - смотрим как эта штука работает.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Maxus за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:01.
|