Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 23.01.2013, 15:28   #1
Izunad
ПроЭктировщик
 
Аватар для Izunad
 
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений
(для 91 пользователей)
Вопрос РесурсФайл+Xors3D

Всем привет!
Пишу на PureBasic+Xors3D. Есть одна маленькая задачка: "Xочу чтобы мои драгоценные файлы с картинками и моделями были недоступны простым смертным, потому хочу спрятать это дело в какой нибудь ПакФайл." Проблема в том что я не знаю как заставить Xors3D вычитывать ресурсы из этого файла.
(Offline)
 
Ответить с цитированием
Старый 23.01.2013, 16:35   #2
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: РесурсФайл+Xors3D

Если я не ошибаюсь, Xors3D не умеет грузить ресурсы из памяти, поэтому как один из вариантов - перехват вызовов WINAPI функций CreateFile и ReadFile из Kernel32.dll, например сплайсингом.
ключевые функции здесь для сплайсинга - GetModuleHandle, GetProcAddress, WriteProcessMemory
лень расписывать что да как, погугли может сам поймешь
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Izunad (23.01.2013)
Старый 23.01.2013, 16:44   #3
Izunad
ПроЭктировщик
 
Аватар для Izunad
 
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений
(для 91 пользователей)
Ответ: РесурсФайл+Xors3D

Хорошо. Я когда то давно наталкивался на подробное описание всех Xors объектов в памяти. Все значения были расписаны по блокам. Сейчас же не могу найти, я думаю мне это помогло бы.
(Offline)
 
Ответить с цитированием
Старый 23.01.2013, 16:54   #4
Platon
Знающий
 
Регистрация: 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
Izunad
ПроЭктировщик
 
Аватар для Izunad
 
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений
(для 91 пользователей)
Ответ: РесурсФайл+Xors3D

Будем вникать =)
(Offline)
 
Ответить с цитированием
Старый 23.01.2013, 17:06   #6
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Ответ: РесурсФайл+Xors3D

Xors3D умеет грузить файлы из запороленных ZIP файлов, наверное и расширение сменить можно, чтобы незаметнее было. Смотри описание xMountPackFile() в справке, там все подробно расписано.
Я когда то давно наталкивался на подробное описание всех Xors объектов в памяти. Все значения были расписаны по блокам.
Наверное это все же было описание Blitz3D от MixalV
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо wolfhound512 за это полезное сообщение:
FlameSword (04.05.2018), HolyDel (23.01.2013), Izunad (23.01.2013)
Старый 23.01.2013, 17:55   #7
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: РесурсФайл+Xors3D

Сообщение от wolfhound512 Посмотреть сообщение
xMountPackFile
А он не во временную-ли папку распаковывает?
Да и пароль в ехешке даже блокнотом легко будет увидеть в любом случае прийдется ехешку паковать каким-нить протектором вроде Armadillo.
(Offline)
 
Ответить с цитированием
Старый 23.01.2013, 18:04   #8
Izunad
ПроЭктировщик
 
Аватар для Izunad
 
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений
(для 91 пользователей)
Ответ: РесурсФайл+Xors3D

ща проверим
(Offline)
 
Ответить с цитированием
Старый 23.01.2013, 20:49   #9
Izunad
ПроЭктировщик
 
Аватар для Izunad
 
Регистрация: 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
Platon
Знающий
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Izunad (23.01.2013)
Старый 23.01.2013, 22:14   #11
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,925
Написано 3,414 полезных сообщений
(для 9,328 пользователей)
Ответ: РесурсФайл+Xors3D

Из надёжных неназванных источников стало известно что xMountPackFile загружает сразу в память.
__________________
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
Arton (07.06.2013), FlameSword (04.05.2018), FREE MAN (24.01.2013), impersonalis (24.01.2013), Izunad (23.01.2013)
Старый 24.01.2013, 16:29   #12
MadMedic
ПроЭктировщик
 
Регистрация: 05.08.2006
Сообщений: 183
Написано 107 полезных сообщений
(для 410 пользователей)
Re: РесурсФайл+Xors3D

Если не хочешь чтобы пароль сперли из экзешника тупо блокнотом то сделай такой код. Допустим твой пароль "111222333", напиши вместо этого Str(333666999/3). Теперь блокнотом его не будет видно
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
FREE MAN (24.01.2013)
Старый 25.01.2013, 14:21   #13
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: РесурсФайл+Xors3D

Вот только все это бесполезно, попадется продвинутый юзер, который умеет отладчик юзать ( а для этого особого ума и ненадо ) и все
(Offline)
 
Ответить с цитированием
Старый 25.01.2013, 14:33   #14
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,706 пользователей)
Ответ: РесурсФайл+Xors3D

от продвинутого ничего не спасет. надо, чтобы не не сперли детсадовцы.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
FREE MAN (26.01.2013), Izunad (29.09.2014), Randomize (29.01.2013)
Старый 04.11.2016, 13:05   #15
Maxus
ПроЭктировщик
 
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений
(для 36 пользователей)
Ответ: РесурсФайл+Xors3D

Темка конечно очень не актуальна, то тем не менее.
Простой способ подменять переход непосредственно в самой процедуре.
Но не забывать при переходе на старую процедуру проверять участок памяти на существование.
IsBadReadPtr_ - смотрим как эта штука работает.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Maxus за это полезное сообщение:
DarkInside (04.11.2016), impersonalis (04.11.2016), moka (05.11.2016)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com