Показать сообщение отдельно
Старый 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)