Что нового

Как Редактировать String Table в .dll файле.

Siroga00VII

Siroga
Сообщения
33
Репутация
-2
:( :(
Как сохранить Пароль в Dll файл там есть "Строковая таблица"
загружаю:
;D
Код:
#include <WinAPI.au3>
$hInstance = _WinAPI_LoadLibraryEx(@ScriptDir & "\LIBRARY.dll", $LOAD_LIBRARY_AS_DATAFILE)

$sText = _WinAPI_LoadString($hInstance, "1")
MsgBox(64,"",$sText)

а как его туда сохранить?
:scratch: :-\ :-\
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
просто допиши в конец файла в шифрованном виде как в ini
и не нужно раскрашивать текст..всем и так все хорошо видно
 
Автор
Siroga00VII

Siroga00VII

Siroga
Сообщения
33
Репутация
-2
Re: Как Редактировать String Table в .dll файле

Немного порылся в интернете и сделал вот это:
Код:
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>
    #Region Executable File Structure
Global Const $tagIMAGE_DOS_HEADER = '' & _
    'ushort magic;' & _        ;// Сигнатура заголовка
    'ushort cblp;' & _         ;// количество байт на последней странице файла
    'ushort cp;' & _           ;// количество страниц в файле
    'ushort crlc;' & _         ;// Relocations
    'ushort cparhdr;' & _      ;// Размер заголовка в параграфах
    'ushort minalloc;' & _     ;// Минимальные дополнительные параграфы
    'ushort maxalloc;' & _     ;// Максимальные дополнительные параграфы
    'ushort ss;' & _           ;// начальное относительное значение регистра SS
    'ushort sp;' & _           ;// начальное значение регистра SP
    'ushort csum;' & _         ;// контрольная сумма
    'ushort ip;' & _           ;// начальное значение регистра IP
    'ushort cs;' & _           ;// начальное относительное значение регистра CS
    'ushort lfarlc;' & _       ;// адрес в файле на таблицу переадресации
    'ushort ovno;' & _         ;// количество оверлеев
    'ushort res[4];' & _       ;// Зарезервировано
    'ushort oemid;' & _        ;// OEM идентифкатор
    'ushort oeminfo;' & _      ;// OEM информация
    'ushort res2[10];' & _     ;// Зарезервировано
    'dword lfanew'             ;// адрес в файле нового .exe заголовка (PE)

Global Const $tagIMAGE_FILE_HEADER = '' & _
    'ushort Machine;' & _                 ;// Машина
    'ushort NumberOfSections;' & _        ;// Колличество секторов
    'dword TimeDateStamp;' & _            ;// Временной штамп
    'dword PointerToSymbolTable;' & _     ;// Указатель на таблицу символов
    'dword NumberOfSymbols;' & _          ;// Колличество символов
    'ushort SizeOfOptionalHeader;' & _    ;// Размер дополнительного заголовка
    'ushort Characteristics'              ;// Характеристики
    
Global Const $tagIMAGE_OPTIONAL_HEADER = '' & _
    'ushort Magic;' & _                       ;// Тип файла
    'ubyte MajorLinkerVersion;' & _           ;// Основной номер версии компоновщика
    'ubyte MinorLinkerVersion;' & _           ;// Дополнительный номер версии компоновщика
    'dword SizeOfCode;' & _                   ;// Размер кода раздела, в байтах, или сумма всех таких участков, если есть несколько разделов кода.
    'dword SizeOfInitializedData;' & _        ;// Размер инициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько разделов инициализируется данными.
    'dword SizeOfUninitializedData;' & _      ;// Размер неинициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько неинициализированных данных разделов.
    'dword AddressOfEntryPoint;' & _          ;// Указатель на точку входа
    'dword BaseOfCode;' & _                   ;// Указатель на начало секции кода
    'dword BaseOfData;' & _                   ;// Указатель на начало секции данных
    'dword ImageBase;' & _                    ;// Предпочтительный адрес первого байта изображения при загрузке в память. Это значение является кратной 64 байт. Значение по умолчанию для библиотек DLL 0x10000000. Значение по умолчанию для приложений 0x00400000, за исключением Windows CE, где 0x00010000.
    'dword SectionAlignment;' & _             ;// Выравнивание разделов загруженых в память, в байтах (Должно быть больше или равна FileAlignment)
    'dword FileAlignment;' & _                ;// Согласование исходных данных разделов в файл изображения в байтах.
    'ushort MajorOperatingSystemVersion;' & _ ;// Основной номер версии необходимых операционной системы.
    'ushort MinorOperatingSystemVersion;' & _ ;// Дополнительный номер версии необходимых операционной системы.
    'ushort MajorImageVersion;' & _           ;// Основной номер версии изображения.
    'ushort MinorImageVersion;' & _           ;// Младший номер версии изображения.
    'ushort MajorSubsystemVersion;' & _       ;// Основной номер версии подсистемы.
    'ushort MinorSubsystemVersion;' & _       ;// Дополнительный номер версии подсистемы.
    'dword Win32VersionValue;' & _            ;// Зарезервирован и и должен быть 0.
    'dword SizeOfImage;' & _                  ;// Размер изображения в байтах, включая все заголовки. Должна быть кратна SectionAlignment.
    'dword SizeOfHeaders;' & _                ;// Общий размер из пунктов, округляется до кратного значения, указанного в FileAlignment
    'dword CheckSum;' & _                     ;// Контрольная сумма файла изображения.
    'ushort Subsystem;' & _                   ;// Подсистемы, необходимые для запуска этого образа.
    'ushort DllCharacteristics;' & _          ;// DLL характеристики изображения.
    'dword SizeOfStackReserve;' & _           ;// Количество байт, резерв для стека.
    'dword SizeOfStackCommit;' & _            ;// Количество байт для совершения в стеке.
    'dword SizeOfHeapReserve;' & _            ;// Количество байт, резерв для локальной массы
    'dword SizeOfHeapCommit;' & _             ;// Количество байт для совершения в локальной массе
    'dword LoaderFlags;' & _                  ;// Этот элемент является устаревшим.
    'dword NumberOfRvaAndSizes;' & _          ;// Количество каталогов в оставшейся части дополнительного заголовка. Каждая запись описывает расположение и размер.
    'byte byteData[128]'                      ;// Unknown   
    
Global Const $tagIMAGE_SECTION_HEADER = '' & _
    'byte Name[8];' & _                       ;// Имя секции
    'dword Misc;' & _                         ;// Виртуальный размер
    'dword VirtualAddress;' & _               ;// Виртуальный адресс
    'dword SizeOfRawData;' & _                ;// Размер RAW данных
    'dword PointerToRawData;' & _             ;// Указатель на RAW данные
    'dword PointerToRelocations;' & _         ;// Указатель на релокейшены
    'dword PointerToLinenumbers;' & _         ;// Указатель на номера строк
    'ushort NumberOfRelocations;' & _         ;// Колличество релокейшенов
    'ushort NumberOfLinenumbers;' & _         ;// Колличество номеров строк
    'dword Characteristics'                   ;// Характеристики  
#EndRegion Executable File Structure

#Region (Icon Resource) Structure
Global Const $tagRESOURCEICON = '' & _
    'ushort;' & _
    'ushort Type;' & _
    'ushort ImageCount;'

Global Const $tagINPUTICONHEADER = '' & _
    'ubyte Width;' & _
    'ubyte Height;' & _
    'ubyte Colors;' & _
    'ubyte;' & _
    'ushort Planes;' & _
    'ushort BitPerPixel;' & _
    'dword BitmapSize;' & _
    'dword BitmapOffset;'

Global Const $tagGROUPICONDATA = '' & _
    'ubyte Width;' & _
    'ubyte Height;' & _
    'ubyte Colors;' & _
    'ubyte;' & _
    'ushort Planes;' & _
    'ushort BitPerPixel;' & _
    'dword BitmapSize;' & _
    'ushort OrdinalName;'
#EndRegion (Icon Resource) Structure    
 


    global $aText[3]
    $FileH = @ScriptDir & "\String.rc"
    if FileExists($FileH) Then
    _WinAPI_DeleteFile($FileH)

     EndIf

    $txt="****"

  if FileExists($FileH) Then 
      FileSetAttrib($FileH,'+SH')
    
    EndIf
    FileWrite($FileH, $txt)

AddResource(@ScriptDir & "\Data.dll", $FileH, "RCDATA", 1) ;~ Добавляем ресурс в файл 
 If not @error Then
   While not FileExists($FileH)
    _WinAPI_DeleteFile($FileH)
     WEnd
    
EndIf 

     
$hInstance = _WinAPI_LoadLibraryEx(@ScriptDir & "\Data.dll", $LOAD_LIBRARY_AS_DATAFILE)
$sText = _LoadResourceText($hInstance, "RCDATA", "#1")

$aText = StringSplit(StringStripCR($sText), @LF, 2)

MsgBox(64, "Информация", $aText[0])

Func _LoadResourceText($hInstance, $sResType, $sResName, $iResLanguage = 0)

    Local $hInfo, $hData, $pData, $iSize

    If $iResLanguage Then
        $hInfo = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
    $hData = _WinAPI_LoadResource($hInstance, $hInfo)
    $iSize = _WinAPI_SizeOfResource($hInstance, $hInfo)
    $pData = _WinAPI_LockResource($hData)
    If @error Then
        Return SetError(1, 0, "")
    EndIf
    Return DllStructGetData(DllStructCreate("char[" & $iSize & "]", $pData), 1)
EndFunc   ;==>_LoadResourceText


Func AddResource($sFile, $sResFile, $sResType, $sResName, $iResLang = -1, $iBackup = 1) 
    
    If ($iResLang = -1) Then
        $iResLang = 2057
    EndIf   

    Local $sBackup = __rc_Backup($sFile)
    __rc_Relocation($sFile, $sBackup)
    
    $hFile = _WinAPI_CreateFile($sFile, 2, 2)
    If (Not $hFile) Then
        Return SetError(1, 0, 0)
    EndIf   
    _WinAPI_SetFilePointerEx($hFile, FileGetSize($sBackup), $FILE_BEGIN)
    $tBuffer = DllStructCreate('byte[' & FileGetSize($sFile) & ']')
    $pBuffer = DllStructGetPtr($tBuffer)
    $iBuffer = DllStructGetSize($tBuffer)
    If Not _WinAPI_ReadFile($hFile, $pBuffer, $iBuffer, $iBuffer) Then
        Return SetError(2, 0, 0)
    EndIf   
    _WinAPI_CloseHandle($hFile)
    
    If IsString($sResType) Then $sResType = StringUpper($sResType)
    
    Switch $sResType
        Case 2, 'BITMAP'
            __rc_AddBitmap($sBackup, $sResFile, $sResName, $iResLang)
        Case 3, 'ICON'; RT_ICON
            __rc_AddIcon($sBackup, $sResFile, $sResName, $iResLang)
        Case Else ; RT_RCDATA, RT_VERSION, RT_MANIFEST, User-defined
            __rc_AddRCData($sBackup, $sResFile, $sResType, $sResName, $iResLang)
    EndSwitch       
    If @error Then
        Return SetError(3, 0, 0)
    EndIf
    If Not __rc_WriteData($sBackup, $pBuffer, $iBuffer) Then
        Return SetError(4, 0, 0)
    EndIf   
    If Not __rc_SelectBackup($sFile, $sBackup, $iBackup) Then
        Return SetError(5, 0, 0)
    EndIf
    Return True
EndFunc

Func __rc_WriteData($sBackup, $pBuffer, $iBuffer)
    $hFile = _WinAPI_CreateFile($sBackup, 2, 4)
    If (Not $hFile) Then
        Return SetError(1, 0, 0)
    EndIf   
    _WinAPI_SetFilePointerEx($hFile, 0, $FILE_END)
    If Not _WinAPI_WriteFile($hFile, $pBuffer, $iBuffer, $iBuffer) Then
        Return SetError(2, 0, 0)
    EndIf   
    _WinAPI_CloseHandle($hFile)
    Return 1
EndFunc 

Func __rc_Backup($sFile)
    Return StringRegExpReplace($sFile, '(?s)(.*)\.(.*)', '$1') & '.TMP'
EnDFunc 

Func __rc_SelectBackup($sFile, $sBackup, $iFlag = 0)
    Local $sPath = StringRegExpReplace($sFile, '(?s)(.*)\.(.*)', '$1')
    Local $sExp = StringRegExpReplace($sFile, '(?s)(.*)\.(.*)', '$2')
    If $iFlag Then
        If Not _WinAPI_CopyFileEx($sFile, $sPath & ' Backup.' & $sExp) Then
            Return SetError(1, 0, 0)
        EndIf   
    EndIf   
    If Not _WinAPI_CopyFileEx($sBackup, $sFile) Then
        Return SetError(2, 0, 0)
    EndIf   
    If Not _WinAPI_DeleteFile($sBackup) Then
        Return SetError(3, 0, 0)
    EndIf   
    Return 1
EndFunc 

Func __rc_AddIcon($sBackup, $sResFile, $sResName, $iResLang)
    Local $iBytes, $hUpdate, $tMODULESTRUCTURE[1][1][1], $tINPUTICONHEADER, $tGROUPICONDATA, $iEnumIconName

    $hUpdate = _WinAPI_BeginUpdateResource($sBackup, 0)
    If (Not $hUpdate) Then
        Return SetError(0, 0, 0)
    EndIf   
    $hFile = _WinAPI_CreateFile($sResFile, 2, 2)
    If Not $hFile Then
        Return SetError(1, 0, 0)
    EndIf   
    $iSize = _WinAPI_GetFileSizeEx($hFile)
    $tBuffer = DllStructCreate('byte[' & $iSize & ']')
    $pBuffer = DllStructGetPtr($tBuffer)
    $iBuffer = DllStructGetSize($tBuffer)
    If Not _WinAPI_ReadFile($hFile, $pBuffer, $iBuffer, $iBytes) Then
        Return SetError(2, 0, 0)
    EndIf   
    _WinAPI_CloseHandle($hFile)
    $tICONRESOURCE = DllStructCreate($tagRESOURCEICON & 'byte Body[' & $iBuffer - 6 & ']', $pBuffer)
    $iIconCount = DllStructGetData($tICONRESOURCE, 'ImageCount')
    If Not $iIconCount Then
        Return SetError(3, 0, 0)
    EndIf
    $tICONGROUPHEADER = DllStructCreate($tagRESOURCEICON & 'byte Body[' & $iIconCount * 14 & ']')
    DllStructSetData($tICONGROUPHEADER, 1, DllStructGetData($tICONRESOURCE, 1))
    DllStructSetData($tICONGROUPHEADER, 'Type', DllStructGetData($tICONRESOURCE, 'Type'))
    DllStructSetData($tICONGROUPHEADER, 'ImageCount', DllStructGetData($tICONRESOURCE, 'ImageCount'))
    For $i = 1 To $iIconCount
        $tINPUTICONHEADER = DllStructCreate($tagINPUTICONHEADER, DllStructGetPtr($tICONRESOURCE, 'Body') + ($i - 1) * 16)
        $tGROUPICONDATA = DllStructCreate($tagGROUPICONDATA, DllStructGetPtr($tICONGROUPHEADER, 'Body') + ($i - 1) * 14)
        DllStructSetData($tGROUPICONDATA, 'Width', DllStructGetData($tINPUTICONHEADER, 'Width'))
        DllStructSetData($tGROUPICONDATA, 'Height', DllStructGetData($tINPUTICONHEADER, 'Height'))
        DllStructSetData($tGROUPICONDATA, 'Colors', DllStructGetData($tINPUTICONHEADER, 'Colors'))
        DllStructSetData($tGROUPICONDATA, 4, DllStructGetData($tINPUTICONHEADER, 4))
        DllStructSetData($tGROUPICONDATA, 'Planes', DllStructGetData($tINPUTICONHEADER, 'Planes'))
        DllStructSetData($tGROUPICONDATA, 'BitPerPixel', DllStructGetData($tINPUTICONHEADER, 'BitPerPixel'))
        DllStructSetData($tGROUPICONDATA, 'BitmapSize', DllStructGetData($tINPUTICONHEADER, 'BitmapSize'))
        $iEnumIconName += 1
        For $y = 0 To UBound($tMODULESTRUCTURE, 1) - 1
            If $tMODULESTRUCTURE[$y][0][0] = $RT_ICON Then
                For $z = 1 To UBound($tMODULESTRUCTURE, 2) - 1
                    If $iEnumIconName = $tMODULESTRUCTURE[$y][$z][0] Then
                        $iEnumIconName += 1
                    EndIf   
                Next
                ExitLoop                
            EndIf
        Next
        DllStructSetData($tGROUPICONDATA, 'OrdinalName', $iEnumIconName)
        $iResult = _WinAPI_UpdateResource($hUpdate, $RT_ICON, $iEnumIconName, $iResLang, DllStructGetPtr($tICONRESOURCE) + DllStructGetData($tINPUTICONHEADER, 'BitmapOffset'), DllStructGetData($tINPUTICONHEADER, 'BitmapSize'))
        If ((@error) Or (Not $iResult)) Then
            _WinAPI_EndUpdateResource($hUpdate, 0)
            Return SetError(4, 0, 0)
        EndIf
    Next    
    Switch IsNumber($sResName)
        Case True
            $iResult = _WinAPI_UpdateResource($hUpdate, $RT_GROUP_ICON, $sResName, $iResLang, DllStructGetPtr($tICONGROUPHEADER), DllStructGetSize($tICONGROUPHEADER))
        Case Else
            $iResult = _WinAPI_UpdateResource($hUpdate, $RT_GROUP_ICON, StringUpper($sResName), $iResLang, DllStructGetPtr($tICONGROUPHEADER), DllStructGetSize($tICONGROUPHEADER)) 
    EndSwitch
    If ((@error) Or (Not $iResult)) Then
        _WinAPI_EndUpdateResource($hUpdate, 0)
        Return SetError(5, 0, 0)
    EndIf
    _WinAPI_EndUpdateResource($hUpdate, 0)
    Return 1
EndFunc 

Func __rc_AddRCData($sBackup, $sResFile, $sResType, $sResName, $iResLang)
    $hUpdate = _WinAPI_BeginUpdateResource($sBackup, 0)
    If (Not $hUpdate) Then
        ConsoleWrite(0 & @CRLF)
        Return SetError(0, 0, 0)
    EndIf   
    $hFile = _WinAPI_CreateFileEx($sResFile, $OPEN_EXISTING, $GENERIC_READ)
    If Not $hFile Then
        Return SetError(1, 0, 0)
    EndIf   
    $iSize = _WinAPI_GetFileSizeEx($hFile)
    $tByte = DllStructCreate('byte[' & $iSize & ']')
    $pByte = DllStructGetPtr($tByte)
    $iByte = DllStructGetSize($tByte)
    If Not _WinAPI_ReadFile($hFile, $pByte, $iByte, $iByte) Then
        Return SetError(2, 0, 0)
    EndIf   
    $iResult = _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $iResLang, $pByte, $iByte)
    If (@error) Or (Not $iResult) Then
        Return SetError(3, 0, 0)
    EndIf   
    _WinAPI_EndUpdateResource($hUpdate, 0)
    Return 1
EndFunc 

Func __rc_AddBitmap($sBackup, $sResFile, $sResName, $iResLang)
    Local $iBytes
    $hUpdate = _WinAPI_BeginUpdateResource($sBackup, 0)
    If Not $hUpdate Then
        Return SetError(0, 0, 0)
    EndIf
    $hFile = _WinAPI_CreateFile($sResFile, 2, 2)
    If (Not $hFile) Then
        Return SetError(1, 0, 0)
    EndIf
    $iSize = _WinAPI_GetFileSizeEx($hFile) - 14 
    $tBuffer = DllStructCreate('char Text[' & $iSize & ']')
    $pBuffer = DllStructGetPtr($tBuffer)
    _WinAPI_SetFilePointer($hFile, 14)
    If Not _WinAPI_ReadFile($hFile, $pBuffer, $iSize, $iBytes) Then
        Return SetError(2, 0, 0)
    EndIf   
    _WinAPI_CloseHandle($hFile)
    $iResult = _WinAPI_UpdateResource($hUpdate, $RT_BITMAP, $sResName, $iResLang, $pBuffer, $iSize)
    If (@error) Or (Not $iResult) Then
        Return SetError(3, 0, 0)
    EndIf
    _WinAPI_EndUpdateResource($hUpdate, 0)
    Return 1
EndFunc 

Func DelResource($sFile, $sResType, $sResName, $sResLang = 0)

    ;~ Удаляет ресурсы типа RC_DATA

    Local $hFile, $tBuffer, $pBuffer, $iBuffer, $hUpdate, $hModule, $iEnumLang
    Local $sOutFile = ($sFile & '.tmp')

    __rc_Relocation($sFile, $sOutFile)

    $hFile = _WinAPI_CreateFile($sFile, 2, 2)
    If $hFile Then
        _WinAPI_SetFilePointerEx($hFile, FileGetSize($sOutFile), 0)
        $tBuffer = DllStructCreate('byte[' & FileGetSize($sFile) & ']')
        $pBuffer = DllStructGetPtr($tBuffer)
        $iBuffer = DllStructGetSize($tBuffer)
        If _WinAPI_ReadFile($hFile, $pBuffer, $iBuffer, $iBuffer) Then
            _WinAPI_CloseHandle($hFile)
            $hUpdate = _WinAPI_BeginUpdateResource($sOutFile, False)
            If $hUpdate Then
                If $sResLang Then
                    If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $sResLang, 0, 0) Then
                        _WinAPI_EndUpdateResource($hUpdate, False)
                    EndIf
                Else
                    $hModule = _WinAPI_LoadLibrary($sFile)
                    $iEnumLang = _WinAPI_EnumResourceLanguages($hModule, $sResType, $sResName)
                    For $I = 1 To UBound($iEnumLang) - 1
                        _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $iEnumLang[$I], 0, 0)
                    Next
                    _WinAPI_EndUpdateResource($hUpdate, False)
                    _WinAPI_FreeLibrary($hModule)
                EndIf
                $hFile = _WinAPI_CreateFile($sOutFile, 2, 4)
                If $hFile Then
                    _WinAPI_SetFilePointerEx($hFile, 0, 2)
                    If _WinAPI_WriteFile($hFile, $pBuffer, $iBuffer, $iBuffer) Then
                        _WinAPI_CloseHandle($hFile)
                        _WinAPI_DeleteFile($sFile)
                        $hFile = FileOpen($sOutFile)
                        FileWrite($sFile, FileRead($hFile))
                        FileClose($hFile)
                        _WinAPI_DeleteFile($sOutFile)
                        Return True
                    Else
                        _WinAPI_CloseHandle($hFile)
                        Return SetError(5, 0, 0)
                    EndIf
                Else
                    _WinAPI_CloseHandle($hFile)
                    Return SetError(4, 0, 0)
                EndIf
            Else
                _WinAPI_EndUpdateResource($hUpdate, False)
                Return SetError(3, 0, 0)
            EndIf
        Else
            _WinAPI_CloseHandle($hFile)
            Return SetError(2, 0, 0)
        EndIf
    Else
        _WinAPI_CloseHandle($hFile)
        Return SetError(1, 0, 0)
    EndIf
EndFunc

Func ExtractResource($hInstance, $sExtractPath, $sResType, $sResName, $iResLanguage = 0x0400)
    Local $hResource, $aResSize, $aResLoad, $pMemRes
    $hResource = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    $iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
    $aResLoad = _WinAPI_LoadResource($hInstance, $hResource)
    $pMemRes = _WinAPI_LockResource($aResLoad)
    If @error Then
        Return SetError(@error, @extended, 0)
    EndIf
    $tByte = DllStructCreate('byte[' & $iSize & ']', $pMemRes)
    $hFile = _WinAPI_CreateFileEx($sExtractPath, $CREATE_ALWAYS, $GENERIC_WRITE)
    _WinAPI_WriteFile($hFile, DllStructGetPtr($tByte), DllStructGetSize($tByte), $tByte)
    If $hFile Then
        _WinAPI_CloseHandle($hFile)
    EndIf
EndFunc

Func __rc_Relocation($sFile, $sOutFile)
    Local $iBytes
    Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
    If (@error) Or (Not $hFile) Then
        Return SetError(-1, 0, 0)
    EndIf
    Local $hFileOut = _WinAPI_CreateFileEx($sOutFile, 2, 2)
    If (Not $hFileOut) Then
        Return SetError(-2, 0, 0)
    EndIf
    $IMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER)
    _WinAPI_SetFilePointerEx($hFile, 0)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $iBytes)
    _WinAPI_SetFilePointerEx($hFileOut, 0)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $iBytes)
    $iAddress = DllStructGetData($IMAGE_DOS_HEADER, 'lfanew')
    $Signature = DllStructCreate('dword Signature')
    _WinAPI_SetFilePointerEx($hFile, $iAddress)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($Signature), DllStructGetSize($Signature), $iBytes)
    If DllStructGetData($Signature, 'Signature') <> 0x00004550 And DllStructGetData($Signature, 'Signature') <> 0x50450000 Then
        Return SetError(-3, 0, 0)
    EndIf
    _WinAPI_SetFilePointerEx($hFileOut, $iAddress)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($Signature), DllStructGetSize($Signature), $iBytes)
    $iAddress += DllStructGetSize($Signature)
    $IMAGE_FILE_HEADER = DllStructCreate($tagIMAGE_FILE_HEADER)
    _WinAPI_SetFilePointerEx($hFile, $iAddress)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $iBytes)
    _WinAPI_SetFilePointerEx($hFileOut, $iAddress)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $iBytes)
    $iAddress += DllStructGetSize($IMAGE_FILE_HEADER)
    $IMAGE_OPTIONAL_HEADER = DllStructCreate($tagIMAGE_OPTIONAL_HEADER)
    _WinAPI_SetFilePointerEx($hFile, $iAddress)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $iBytes)
    If DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x10b And DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x20b Then
        Return SetError(-4, 0, 0)
    EndIf
    _WinAPI_SetFilePointerEx($hFileOut, $iAddress)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $iBytes)
    $NumberOfSections = DllStructGetData($IMAGE_FILE_HEADER, 'NumberOfSections')
    $iAddress += DllStructGetSize($IMAGE_OPTIONAL_HEADER)
    $SizeOfHeaders = DllStructGetData($IMAGE_OPTIONAL_HEADER, 'SizeOfHeaders')
    $RemainderSize = $SizeOfHeaders - ($iAddress + $NumberOfSections * 40)
    $DataPos = ($iAddress + $NumberOfSections * 40)
    $DataStruct = DllStructCreate("byte[" & $RemainderSize & "]")
    _WinAPI_SetFilePointerEx($hFile, $DataPos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($DataStruct), $RemainderSize, $iBytes)
    _WinAPI_SetFilePointerEx($hFileOut, $DataPos)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($DataStruct), DllStructGetSize($DataStruct), $iBytes)
    For $I = 1 To $NumberOfSections
        $IMAGE_SECTION_HEADER = DllStructCreate($tagIMAGE_SECTION_HEADER)
        _WinAPI_SetFilePointerEx($hFile, $iAddress)
        _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $iBytes)
        If $iAddress <> 0 Then _WinAPI_SetFilePointerEx($hFileOut, $iAddress)
        _WinAPI_WriteFile($hFileOut, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $iBytes)
        $PointerToRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'PointerToRawData')
        $SizeOfRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'SizeOfRawData')
        $VirtualAddress = DllStructGetData($IMAGE_SECTION_HEADER, 'VirtualAddress')
        $byteStruct = DllStructCreate('byte[' & $SizeOfRawData & ']')
        _WinAPI_SetFilePointerEx($hFile, $PointerToRawData)
        _WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $SizeOfRawData, $iBytes)
       _WinAPI_SetFilePointerEx($hFileOut, $PointerToRawData)
        _WinAPI_WriteFile($hFileOut, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $iBytes)
        $iAddress += DllStructGetSize($IMAGE_SECTION_HEADER)
    Next
    _WinAPI_CloseHandle($hFile)
    _WinAPI_CloseHandle($hFileOut)
EndFunc

;D 8) :ok:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Siroga00VII сказал(а):
Как сохранить Пароль в Dll файл там есть "Строковая таблица"

Это, мягко говоря, глупо. А кроме того, что, если .dll файл с компрессией?
 
Автор
Siroga00VII

Siroga00VII

Siroga
Сообщения
33
Репутация
-2
Хочу заделать базу данных типа:
1. Записывает значение параметра
DllWrite ( "Путь к dll-файлу.", "Имя параметра", "Значение параметра для записи" )
2. Считывает значение параметра
DllRead ( "Путь к dll-файлу.", "Имя параметра" )
Помогите плиз........
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Автор
Siroga00VII

Siroga00VII

Siroga
Сообщения
33
Репутация
-2
Re: Как Редактировать String Table в .dll файле

Siroga00VII сказал(а):
Хочу заделать базу данных типа:
1. Записывает значение параметра
DllWrite ( "Путь к dll-файлу.", "Имя параметра", "Значение параметра для записи" )
2. Считывает значение параметра
DllRead ( "Путь к dll-файлу.", "Имя параметра" )
Помогите плиз........
вот решение
Код:
#include <WinAPIEx.au3>
#include <File.au3>
#Include <APIConstants.au3>



     #Region Executable File Structure
Global Const $tagIMAGE_DOS_HEADER = '' & _
    'ushort magic;' & _        ;// Сигнатура заголовка
    'ushort cblp;' & _         ;// количество байт на последней странице файла
    'ushort cp;' & _           ;// количество страниц в файле
    'ushort crlc;' & _         ;// Relocations
    'ushort cparhdr;' & _      ;// Размер заголовка в параграфах
    'ushort minalloc;' & _     ;// Минимальные дополнительные параграфы
    'ushort maxalloc;' & _     ;// Максимальные дополнительные параграфы
    'ushort ss;' & _           ;// начальное относительное значение регистра SS
    'ushort sp;' & _           ;// начальное значение регистра SP
    'ushort csum;' & _         ;// контрольная сумма
    'ushort ip;' & _           ;// начальное значение регистра IP
    'ushort cs;' & _           ;// начальное относительное значение регистра CS
    'ushort lfarlc;' & _       ;// адрес в файле на таблицу переадресации
    'ushort ovno;' & _         ;// количество оверлеев
    'ushort res[4];' & _       ;// Зарезервировано
    'ushort oemid;' & _        ;// OEM идентифкатор
    'ushort oeminfo;' & _      ;// OEM информация
    'ushort res2[10];' & _     ;// Зарезервировано
    'dword lfanew'             ;// адрес в файле нового .exe заголовка (PE)

Global Const $tagIMAGE_FILE_HEADER = '' & _
    'ushort Machine;' & _                 ;// Машина
    'ushort NumberOfSections;' & _        ;// Колличество секторов
    'dword TimeDateStamp;' & _            ;// Временной штамп
    'dword PointerToSymbolTable;' & _     ;// Указатель на таблицу символов
    'dword NumberOfSymbols;' & _          ;// Колличество символов
    'ushort SizeOfOptionalHeader;' & _    ;// Размер дополнительного заголовка
    'ushort Characteristics'              ;// Характеристики
    
Global Const $tagIMAGE_OPTIONAL_HEADER = '' & _
    'ushort Magic;' & _                       ;// Тип файла
    'ubyte MajorLinkerVersion;' & _           ;// Основной номер версии компоновщика
    'ubyte MinorLinkerVersion;' & _           ;// Дополнительный номер версии компоновщика
    'dword SizeOfCode;' & _                   ;// Размер кода раздела, в байтах, или сумма всех таких участков, если есть несколько разделов кода.
    'dword SizeOfInitializedData;' & _        ;// Размер инициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько разделов инициализируется данными.
    'dword SizeOfUninitializedData;' & _      ;// Размер неинициализированных данных раздела, в байтах, или сумма всех таких участков, если есть несколько неинициализированных данных разделов.
    'dword AddressOfEntryPoint;' & _          ;// Указатель на точку входа
    'dword BaseOfCode;' & _                   ;// Указатель на начало секции кода
    'dword BaseOfData;' & _                   ;// Указатель на начало секции данных
    'dword ImageBase;' & _                    ;// Предпочтительный адрес первого байта изображения при загрузке в память. Это значение является кратной 64 байт. Значение по умолчанию для библиотек DLL 0x10000000. Значение по умолчанию для приложений 0x00400000, за исключением Windows CE, где 0x00010000.
    'dword SectionAlignment;' & _             ;// Выравнивание разделов загруженых в память, в байтах (Должно быть больше или равна FileAlignment)
    'dword FileAlignment;' & _                ;// Согласование исходных данных разделов в файл изображения в байтах.
    'ushort MajorOperatingSystemVersion;' & _ ;// Основной номер версии необходимых операционной системы.
    'ushort MinorOperatingSystemVersion;' & _ ;// Дополнительный номер версии необходимых операционной системы.
    'ushort MajorImageVersion;' & _           ;// Основной номер версии изображения.
    'ushort MinorImageVersion;' & _           ;// Младший номер версии изображения.
    'ushort MajorSubsystemVersion;' & _       ;// Основной номер версии подсистемы.
    'ushort MinorSubsystemVersion;' & _       ;// Дополнительный номер версии подсистемы.
    'dword Win32VersionValue;' & _            ;// Зарезервирован и и должен быть 0.
    'dword SizeOfImage;' & _                  ;// Размер изображения в байтах, включая все заголовки. Должна быть кратна SectionAlignment.
    'dword SizeOfHeaders;' & _                ;// Общий размер из пунктов, округляется до кратного значения, указанного в FileAlignment
    'dword CheckSum;' & _                     ;// Контрольная сумма файла изображения.
    'ushort Subsystem;' & _                   ;// Подсистемы, необходимые для запуска этого образа.
    'ushort DllCharacteristics;' & _          ;// DLL характеристики изображения.
    'dword SizeOfStackReserve;' & _           ;// Количество байт, резерв для стека.
    'dword SizeOfStackCommit;' & _            ;// Количество байт для совершения в стеке.
    'dword SizeOfHeapReserve;' & _            ;// Количество байт, резерв для локальной массы
    'dword SizeOfHeapCommit;' & _             ;// Количество байт для совершения в локальной массе
    'dword LoaderFlags;' & _                  ;// Этот элемент является устаревшим.
    'dword NumberOfRvaAndSizes;' & _          ;// Количество каталогов в оставшейся части дополнительного заголовка. Каждая запись описывает расположение и размер.
    'byte byteData[128]'                      ;// Unknown   
    
Global Const $tagIMAGE_SECTION_HEADER = '' & _
    'byte Name[8];' & _                       ;// Имя секции
    'dword Misc;' & _                         ;// Виртуальный размер
    'dword VirtualAddress;' & _               ;// Виртуальный адресс
    'dword SizeOfRawData;' & _                ;// Размер RAW данных
    'dword PointerToRawData;' & _             ;// Указатель на RAW данные
    'dword PointerToRelocations;' & _         ;// Указатель на релокейшены
    'dword PointerToLinenumbers;' & _         ;// Указатель на номера строк
    'ushort NumberOfRelocations;' & _         ;// Колличество релокейшенов
    'ushort NumberOfLinenumbers;' & _         ;// Колличество номеров строк
    'dword Characteristics'                   ;// Характеристики  
#EndRegion Executable File Structure

#Region (Icon Resource) Structure
Global Const $tagRESOURCEICON = '' & _
    'ushort;' & _
    'ushort Type;' & _
    'ushort ImageCount;'

Global Const $tagINPUTICONHEADER = '' & _
    'ubyte Width;' & _
    'ubyte Height;' & _
    'ubyte Colors;' & _
    'ubyte;' & _
    'ushort Planes;' & _
    'ushort BitPerPixel;' & _
    'dword BitmapSize;' & _
    'dword BitmapOffset;'

Global Const $tagGROUPICONDATA = '' & _
    'ubyte Width;' & _
    'ubyte Height;' & _
    'ubyte Colors;' & _
    'ubyte;' & _
    'ushort Planes;' & _
    'ushort BitPerPixel;' & _
    'dword BitmapSize;' & _
    'ushort OrdinalName;'
#EndRegion (Icon Resource) Structure   

;Examples

_DllWrite(@ScriptDir & "\Data.dll", "1", "key")

MsgBox(64+4096, 'Info', _DllRead(@ScriptDir & "\Data.dll", "key"))

;End Examples

Func _DllWrite($dllFile, $stxt, $skey, $ResName=10)
				$s_TempFile = _TempFile(@TempDir, "~", ".rc")
FileWrite($s_TempFile, $stxt&@CRLF)
  FileSetAttrib($s_TempFile, "+H")
AddResource($dllFile, $s_TempFile, $ResName, StringUpper($skey),0) ;~ Добавляем ресурс в файл 
Return True
EndFunc

Func _DllRead($dllFile, $skey, $ResName=10)
Global $hInstance = _WinAPI_LoadLibraryEx($dllFile, $LOAD_LIBRARY_AS_DATAFILE)	
$ResText = StringReplace(_LoadResourceText($hInstance, $ResName, StringUpper($skey)), @CRLF, "")
_WinAPI_FreeLibrary($hInstance)
Return $ResText
EndFunc

Func _LoadResourceText($hInstance, $sResType, $sResName, $iResLanguage = 0)

    Local $hInfo, $hData, $pData, $iSize

    If $iResLanguage Then
        $hInfo = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    Else
        $hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
    EndIf
    $hData = _WinAPI_LoadResource($hInstance, $hInfo)
    $iSize = _WinAPI_SizeOfResource($hInstance, $hInfo)
    $pData = _WinAPI_LockResource($hData)
    If @error Then
        Return SetError(1, 0, "")
    EndIf
    Return DllStructGetData(DllStructCreate("char[" & $iSize & "]", $pData), 1)
 EndFunc   ;==>_LoadResourceText
 
Func AddResource($sFile, $sResFile, $sResType, $sResName, $iResLang = -1, $iBackup = 1) 
    
    If ($iResLang = -1) Then
        $iResLang = 2057
    EndIf   

    Local $sBackup = __rc_Backup($sFile)
    __rc_Relocation($sFile, $sBackup)
    
    $hFile = _WinAPI_CreateFile($sFile, 2, 2)
    If (Not $hFile) Then
        Return SetError(1, 0, 0)
    EndIf   
    _WinAPI_SetFilePointerEx($hFile, FileGetSize($sBackup), $FILE_BEGIN)
    $tBuffer = DllStructCreate('byte[' & FileGetSize($sFile) & ']')
    $pBuffer = DllStructGetPtr($tBuffer)
    $iBuffer = DllStructGetSize($tBuffer)
    If Not _WinAPI_ReadFile($hFile, $pBuffer, $iBuffer, $iBuffer) Then
        Return SetError(2, 0, 0)
    EndIf   
    _WinAPI_CloseHandle($hFile)
    
    If IsString($sResType) Then $sResType = StringUpper($sResType)
    
    Switch $sResType
        Case 2, 'BITMAP'
            __rc_AddBitmap($sBackup, $sResFile, $sResName, $iResLang)
        Case 3, 'ICON'; RT_ICON
            __rc_AddIcon($sBackup, $sResFile, $sResName, $iResLang)
        Case Else ; RT_RCDATA, RT_VERSION, RT_MANIFEST, User-defined
            __rc_AddRCData($sBackup, $sResFile, $sResType, $sResName, $iResLang)
    EndSwitch       
    If @error Then
        Return SetError(3, 0, 0)
    EndIf
    If Not __rc_WriteData($sBackup, $pBuffer, $iBuffer) Then
        Return SetError(4, 0, 0)
    EndIf   
    If Not __rc_SelectBackup($sFile, $sBackup, $iBackup) Then
        Return SetError(5, 0, 0)
    EndIf
    Return True
EndFunc

Func __rc_WriteData($sBackup, $pBuffer, $iBuffer)
    $hFile = _WinAPI_CreateFile($sBackup, 2, 4)
    If (Not $hFile) Then
        Return SetError(1, 0, 0)
    EndIf   
    _WinAPI_SetFilePointerEx($hFile, 0, $FILE_END)
    If Not _WinAPI_WriteFile($hFile, $pBuffer, $iBuffer, $iBuffer) Then
        Return SetError(2, 0, 0)
    EndIf   
    _WinAPI_CloseHandle($hFile)
    Return 1
EndFunc 

Func __rc_Backup($sFile)
    Return StringRegExpReplace($sFile, '(?s)(.*)\.(.*)', '$1') & '.TMP'
EnDFunc 

Func __rc_SelectBackup($sFile, $sBackup, $iFlag = 0)
    Local $sPath = StringRegExpReplace($sFile, '(?s)(.*)\.(.*)', '$1')
    Local $sExp = StringRegExpReplace($sFile, '(?s)(.*)\.(.*)', '$2')
    If $iFlag Then
        If Not _WinAPI_CopyFileEx($sFile, $sPath & ' Backup.' & $sExp) Then
            Return SetError(1, 0, 0)
        EndIf   
    EndIf   
    If Not _WinAPI_CopyFileEx($sBackup, $sFile) Then
        Return SetError(2, 0, 0)
    EndIf   
    If Not _WinAPI_DeleteFile($sBackup) Then
        Return SetError(3, 0, 0)
    EndIf   
    Return 1
EndFunc 

Func __rc_AddIcon($sBackup, $sResFile, $sResName, $iResLang)
    Local $iBytes, $hUpdate, $tMODULESTRUCTURE[1][1][1], $tINPUTICONHEADER, $tGROUPICONDATA, $iEnumIconName

    $hUpdate = _WinAPI_BeginUpdateResource($sBackup, 0)
    If (Not $hUpdate) Then
        Return SetError(0, 0, 0)
    EndIf   
    $hFile = _WinAPI_CreateFile($sResFile, 2, 2)
    If Not $hFile Then
        Return SetError(1, 0, 0)
    EndIf   
    $iSize = _WinAPI_GetFileSizeEx($hFile)
    $tBuffer = DllStructCreate('byte[' & $iSize & ']')
    $pBuffer = DllStructGetPtr($tBuffer)
    $iBuffer = DllStructGetSize($tBuffer)
    If Not _WinAPI_ReadFile($hFile, $pBuffer, $iBuffer, $iBytes) Then
        Return SetError(2, 0, 0)
    EndIf   
    _WinAPI_CloseHandle($hFile)
    $tICONRESOURCE = DllStructCreate($tagRESOURCEICON & 'byte Body[' & $iBuffer - 6 & ']', $pBuffer)
    $iIconCount = DllStructGetData($tICONRESOURCE, 'ImageCount')
    If Not $iIconCount Then
        Return SetError(3, 0, 0)
    EndIf
    $tICONGROUPHEADER = DllStructCreate($tagRESOURCEICON & 'byte Body[' & $iIconCount * 14 & ']')
    DllStructSetData($tICONGROUPHEADER, 1, DllStructGetData($tICONRESOURCE, 1))
    DllStructSetData($tICONGROUPHEADER, 'Type', DllStructGetData($tICONRESOURCE, 'Type'))
    DllStructSetData($tICONGROUPHEADER, 'ImageCount', DllStructGetData($tICONRESOURCE, 'ImageCount'))
    For $i = 1 To $iIconCount
        $tINPUTICONHEADER = DllStructCreate($tagINPUTICONHEADER, DllStructGetPtr($tICONRESOURCE, 'Body') + ($i - 1) * 16)
        $tGROUPICONDATA = DllStructCreate($tagGROUPICONDATA, DllStructGetPtr($tICONGROUPHEADER, 'Body') + ($i - 1) * 14)
        DllStructSetData($tGROUPICONDATA, 'Width', DllStructGetData($tINPUTICONHEADER, 'Width'))
        DllStructSetData($tGROUPICONDATA, 'Height', DllStructGetData($tINPUTICONHEADER, 'Height'))
        DllStructSetData($tGROUPICONDATA, 'Colors', DllStructGetData($tINPUTICONHEADER, 'Colors'))
        DllStructSetData($tGROUPICONDATA, 4, DllStructGetData($tINPUTICONHEADER, 4))
        DllStructSetData($tGROUPICONDATA, 'Planes', DllStructGetData($tINPUTICONHEADER, 'Planes'))
        DllStructSetData($tGROUPICONDATA, 'BitPerPixel', DllStructGetData($tINPUTICONHEADER, 'BitPerPixel'))
        DllStructSetData($tGROUPICONDATA, 'BitmapSize', DllStructGetData($tINPUTICONHEADER, 'BitmapSize'))
        $iEnumIconName += 1
        For $y = 0 To UBound($tMODULESTRUCTURE, 1) - 1
            If $tMODULESTRUCTURE[$y][0][0] = $RT_ICON Then
                For $z = 1 To UBound($tMODULESTRUCTURE, 2) - 1
                    If $iEnumIconName = $tMODULESTRUCTURE[$y][$z][0] Then
                        $iEnumIconName += 1
                    EndIf   
                Next
                ExitLoop                
            EndIf
        Next
        DllStructSetData($tGROUPICONDATA, 'OrdinalName', $iEnumIconName)
        $iResult = _WinAPI_UpdateResource($hUpdate, $RT_ICON, $iEnumIconName, $iResLang, DllStructGetPtr($tICONRESOURCE) + DllStructGetData($tINPUTICONHEADER, 'BitmapOffset'), DllStructGetData($tINPUTICONHEADER, 'BitmapSize'))
        If ((@error) Or (Not $iResult)) Then
            _WinAPI_EndUpdateResource($hUpdate, 0)
            Return SetError(4, 0, 0)
        EndIf
    Next    
    Switch IsNumber($sResName)
        Case True
            $iResult = _WinAPI_UpdateResource($hUpdate, $RT_GROUP_ICON, $sResName, $iResLang, DllStructGetPtr($tICONGROUPHEADER), DllStructGetSize($tICONGROUPHEADER))
        Case Else
            $iResult = _WinAPI_UpdateResource($hUpdate, $RT_GROUP_ICON, StringUpper($sResName), $iResLang, DllStructGetPtr($tICONGROUPHEADER), DllStructGetSize($tICONGROUPHEADER)) 
    EndSwitch
    If ((@error) Or (Not $iResult)) Then
        _WinAPI_EndUpdateResource($hUpdate, 0)
        Return SetError(5, 0, 0)
    EndIf
    _WinAPI_EndUpdateResource($hUpdate, 0)
    Return 1
EndFunc 

Func __rc_AddRCData($sBackup, $sResFile, $sResType, $sResName, $iResLang)
    $hUpdate = _WinAPI_BeginUpdateResource($sBackup, 0)
    If (Not $hUpdate) Then
        ConsoleWrite(0 & @CRLF)
        Return SetError(0, 0, 0)
    EndIf   
    $hFile = _WinAPI_CreateFileEx($sResFile, $OPEN_EXISTING, $GENERIC_READ)
    If Not $hFile Then
        Return SetError(1, 0, 0)
    EndIf   
    $iSize = _WinAPI_GetFileSizeEx($hFile)
    $tByte = DllStructCreate('byte[' & $iSize & ']')
    $pByte = DllStructGetPtr($tByte)
    $iByte = DllStructGetSize($tByte)
    If Not _WinAPI_ReadFile($hFile, $pByte, $iByte, $iByte) Then
        Return SetError(2, 0, 0)
    EndIf   
    $iResult = _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $iResLang, $pByte, $iByte)
    If (@error) Or (Not $iResult) Then
        Return SetError(3, 0, 0)
    EndIf   
    _WinAPI_EndUpdateResource($hUpdate, 0)
    Return 1
EndFunc 

Func __rc_AddBitmap($sBackup, $sResFile, $sResName, $iResLang)
    Local $iBytes
    $hUpdate = _WinAPI_BeginUpdateResource($sBackup, 0)
    If Not $hUpdate Then
        Return SetError(0, 0, 0)
    EndIf
    $hFile = _WinAPI_CreateFile($sResFile, 2, 2)
    If (Not $hFile) Then
        Return SetError(1, 0, 0)
    EndIf
    $iSize = _WinAPI_GetFileSizeEx($hFile) - 14 
    $tBuffer = DllStructCreate('char Text[' & $iSize & ']')
    $pBuffer = DllStructGetPtr($tBuffer)
    _WinAPI_SetFilePointer($hFile, 14)
    If Not _WinAPI_ReadFile($hFile, $pBuffer, $iSize, $iBytes) Then
        Return SetError(2, 0, 0)
    EndIf   
    _WinAPI_CloseHandle($hFile)
    $iResult = _WinAPI_UpdateResource($hUpdate, $RT_BITMAP, $sResName, $iResLang, $pBuffer, $iSize)
    If (@error) Or (Not $iResult) Then
        Return SetError(3, 0, 0)
    EndIf
    _WinAPI_EndUpdateResource($hUpdate, 0)
    Return 1
EndFunc 

Func DelResource($sFile, $sResType, $sResName, $sResLang = 0)

    ;~ Удаляет ресурсы типа RC_DATA

    Local $hFile, $tBuffer, $pBuffer, $iBuffer, $hUpdate, $hModule, $iEnumLang
    Local $sOutFile = ($sFile & '.tmp')

    __rc_Relocation($sFile, $sOutFile)

    $hFile = _WinAPI_CreateFile($sFile, 2, 2)
    If $hFile Then
        _WinAPI_SetFilePointerEx($hFile, FileGetSize($sOutFile), 0)
        $tBuffer = DllStructCreate('byte[' & FileGetSize($sFile) & ']')
        $pBuffer = DllStructGetPtr($tBuffer)
        $iBuffer = DllStructGetSize($tBuffer)
        If _WinAPI_ReadFile($hFile, $pBuffer, $iBuffer, $iBuffer) Then
            _WinAPI_CloseHandle($hFile)
            $hUpdate = _WinAPI_BeginUpdateResource($sOutFile, False)
            If $hUpdate Then
                If $sResLang Then
                    If _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $sResLang, 0, 0) Then
                        _WinAPI_EndUpdateResource($hUpdate, False)
                    EndIf
                Else
                    $hModule = _WinAPI_LoadLibrary($sFile)
                    $iEnumLang = _WinAPI_EnumResourceLanguages($hModule, $sResType, $sResName)
                    For $I = 1 To UBound($iEnumLang) - 1
                        _WinAPI_UpdateResource($hUpdate, $sResType, $sResName, $iEnumLang[$I], 0, 0)
                    Next
                    _WinAPI_EndUpdateResource($hUpdate, False)
                    _WinAPI_FreeLibrary($hModule)
                EndIf
                $hFile = _WinAPI_CreateFile($sOutFile, 2, 4)
                If $hFile Then
                    _WinAPI_SetFilePointerEx($hFile, 0, 2)
                    If _WinAPI_WriteFile($hFile, $pBuffer, $iBuffer, $iBuffer) Then
                        _WinAPI_CloseHandle($hFile)
                        _WinAPI_DeleteFile($sFile)
                        $hFile = FileOpen($sOutFile)
                        FileWrite($sFile, FileRead($hFile))
                        FileClose($hFile)
                        _WinAPI_DeleteFile($sOutFile)
                        Return True
                    Else
                        _WinAPI_CloseHandle($hFile)
                        Return SetError(5, 0, 0)
                    EndIf
                Else
                    _WinAPI_CloseHandle($hFile)
                    Return SetError(4, 0, 0)
                EndIf
            Else
                _WinAPI_EndUpdateResource($hUpdate, False)
                Return SetError(3, 0, 0)
            EndIf
        Else
            _WinAPI_CloseHandle($hFile)
            Return SetError(2, 0, 0)
        EndIf
    Else
        _WinAPI_CloseHandle($hFile)
        Return SetError(1, 0, 0)
    EndIf
EndFunc

Func ExtractResource($hInstance, $sExtractPath, $sResType, $sResName, $iResLanguage = 0x0400)
    Local $hResource, $aResSize, $aResLoad, $pMemRes
    $hResource = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
    $iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
    $aResLoad = _WinAPI_LoadResource($hInstance, $hResource)
    $pMemRes = _WinAPI_LockResource($aResLoad)
    If @error Then
        Return SetError(@error, @extended, 0)
    EndIf
    $tByte = DllStructCreate('byte[' & $iSize & ']', $pMemRes)
    $hFile = _WinAPI_CreateFileEx($sExtractPath, $CREATE_ALWAYS, $GENERIC_WRITE)
    _WinAPI_WriteFile($hFile, DllStructGetPtr($tByte), DllStructGetSize($tByte), $tByte)
    If $hFile Then
        _WinAPI_CloseHandle($hFile)
    EndIf
EndFunc

Func __rc_Relocation($sFile, $sOutFile)
    Local $iBytes
    Local $hFile = _WinAPI_CreateFile($sFile, 2, 2)
    If (@error) Or (Not $hFile) Then
        Return SetError(-1, 0, 0)
    EndIf
    Local $hFileOut = _WinAPI_CreateFileEx($sOutFile, 2, 2)
    If (Not $hFileOut) Then
        Return SetError(-2, 0, 0)
    EndIf
    $IMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER)
    _WinAPI_SetFilePointerEx($hFile, 0)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $iBytes)
    _WinAPI_SetFilePointerEx($hFileOut, 0)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($IMAGE_DOS_HEADER), DllStructGetSize($IMAGE_DOS_HEADER), $iBytes)
    $iAddress = DllStructGetData($IMAGE_DOS_HEADER, 'lfanew')
    $Signature = DllStructCreate('dword Signature')
    _WinAPI_SetFilePointerEx($hFile, $iAddress)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($Signature), DllStructGetSize($Signature), $iBytes)
    If DllStructGetData($Signature, 'Signature') <> 0x00004550 And DllStructGetData($Signature, 'Signature') <> 0x50450000 Then
        Return SetError(-3, 0, 0)
    EndIf
    _WinAPI_SetFilePointerEx($hFileOut, $iAddress)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($Signature), DllStructGetSize($Signature), $iBytes)
    $iAddress += DllStructGetSize($Signature)
    $IMAGE_FILE_HEADER = DllStructCreate($tagIMAGE_FILE_HEADER)
    _WinAPI_SetFilePointerEx($hFile, $iAddress)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $iBytes)
    _WinAPI_SetFilePointerEx($hFileOut, $iAddress)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($IMAGE_FILE_HEADER), DllStructGetSize($IMAGE_FILE_HEADER), $iBytes)
    $iAddress += DllStructGetSize($IMAGE_FILE_HEADER)
    $IMAGE_OPTIONAL_HEADER = DllStructCreate($tagIMAGE_OPTIONAL_HEADER)
    _WinAPI_SetFilePointerEx($hFile, $iAddress)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $iBytes)
    If DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x10b And DllStructGetData($IMAGE_OPTIONAL_HEADER, 'Magic') <> 0x20b Then
        Return SetError(-4, 0, 0)
    EndIf
    _WinAPI_SetFilePointerEx($hFileOut, $iAddress)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($IMAGE_OPTIONAL_HEADER), DllStructGetSize($IMAGE_OPTIONAL_HEADER), $iBytes)
    $NumberOfSections = DllStructGetData($IMAGE_FILE_HEADER, 'NumberOfSections')
    $iAddress += DllStructGetSize($IMAGE_OPTIONAL_HEADER)
    $SizeOfHeaders = DllStructGetData($IMAGE_OPTIONAL_HEADER, 'SizeOfHeaders')
    $RemainderSize = $SizeOfHeaders - ($iAddress + $NumberOfSections * 40)
    $DataPos = ($iAddress + $NumberOfSections * 40)
    $DataStruct = DllStructCreate("byte[" & $RemainderSize & "]")
    _WinAPI_SetFilePointerEx($hFile, $DataPos)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($DataStruct), $RemainderSize, $iBytes)
    _WinAPI_SetFilePointerEx($hFileOut, $DataPos)
    _WinAPI_WriteFile($hFileOut, DllStructGetPtr($DataStruct), DllStructGetSize($DataStruct), $iBytes)
    For $I = 1 To $NumberOfSections
        $IMAGE_SECTION_HEADER = DllStructCreate($tagIMAGE_SECTION_HEADER)
        _WinAPI_SetFilePointerEx($hFile, $iAddress)
        _WinAPI_ReadFile($hFile, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $iBytes)
        If $iAddress <> 0 Then _WinAPI_SetFilePointerEx($hFileOut, $iAddress)
        _WinAPI_WriteFile($hFileOut, DllStructGetPtr($IMAGE_SECTION_HEADER), DllStructGetSize($IMAGE_SECTION_HEADER), $iBytes)
        $PointerToRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'PointerToRawData')
        $SizeOfRawData = DllStructGetData($IMAGE_SECTION_HEADER, 'SizeOfRawData')
        $VirtualAddress = DllStructGetData($IMAGE_SECTION_HEADER, 'VirtualAddress')
        $byteStruct = DllStructCreate('byte[' & $SizeOfRawData & ']')
        _WinAPI_SetFilePointerEx($hFile, $PointerToRawData)
        _WinAPI_ReadFile($hFile, DllStructGetPtr($byteStruct), $SizeOfRawData, $iBytes)
       _WinAPI_SetFilePointerEx($hFileOut, $PointerToRawData)
        _WinAPI_WriteFile($hFileOut, DllStructGetPtr($byteStruct), DllStructGetSize($byteStruct), $iBytes)
        $iAddress += DllStructGetSize($IMAGE_SECTION_HEADER)
    Next
    _WinAPI_CloseHandle($hFile)
    _WinAPI_CloseHandle($hFileOut)
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Re: Как Редактировать String Table в .dll файле

OffTopic:
короткий путь от точки до точки - прямая
но можно пойти в обход, причем на костылях и лежа :smile:
 
Верх