Сообщение от 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