⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pe.bas

📁 这是一个电子书制作生成的工具源码,十分有价值,而且运用了加密解密的技术
💻 BAS
📖 第 1 页 / 共 2 页
字号:
        SetFilePointer hFile, ByVal TreeOffset, 0, 0
        ' Get the root node and begin navigating the resource tree
        ReadFile hFile, Root, Len(Root), BytesRead, ByVal 0
        ReDim L2Root(Root.NamedEntries + Root.IDEntries) As IMAGE_RESOURCE_DIR
        ReDim L1Entries(Root.NamedEntries + Root.IDEntries) As RESOURCE_DIR_ENTRY
        ' Get first level child nodes
        For iLvl1 = 1 To (Root.NamedEntries + Root.IDEntries)
            SetFilePointer hFile, TreeOffset + 8 + (iLvl1 * 8), 0, 0
            ReadFile hFile, L1Entries(iLvl1), 8, BytesRead, ByVal 0&
            If L1Entries(iLvl1).Name = 3 Then
                ' Jump to level 2 and get directory
                '     Strip high-order byte from offset
                CopyMemory Cursor, L1Entries(iLvl1).Offset, 3
                Cursor = Cursor + TreeOffset
                SetFilePointer hFile, ByVal Cursor, 0, 0
                ReadFile hFile, L2Root(iLvl1), 16, BytesRead, ByVal 0&
                ReDim L3Root(L2Root(iLvl1).NamedEntries + L2Root(iLvl1).IDEntries) As IMAGE_RESOURCE_DIR
                ReDim L2Entries(L2Root(iLvl1).IDEntries + L2Root(iLvl1).NamedEntries) As RESOURCE_DIR_ENTRY
                For iLvl2 = 1 To (L2Root(iLvl1).IDEntries + L2Root(iLvl1).NamedEntries)
                    ' Read second level child nodes
                    CopyMemory Cursor, L1Entries(iLvl1).Offset, 3
                    Cursor = Cursor + TreeOffset
                    SetFilePointer hFile, Cursor + 8 + (iLvl2 * 8), 0, 0
                    ReadFile hFile, L2Entries(iLvl2), 8, BytesRead, ByVal 0&
                    ' Jump to level 3 and get directory
                    CopyMemory Cursor, L2Entries(iLvl2).Offset, 3
                    Cursor = Cursor + TreeOffset
                    SetFilePointer hFile, ByVal Cursor, 0, 0
                    ReadFile hFile, L3Root(iLvl2), 16, BytesRead, ByVal 0&
                    ReDim L3Entries(L3Root(iLvl2).NamedEntries + L3Root(iLvl2).IDEntries) As RESOURCE_DIR_ENTRY
                    ReDim DataEntries(L3Root(iLvl2).NamedEntries + L3Root(iLvl2).IDEntries) As RESOURCE_DATA_ENTRY
                    For iLvl3 = 1 To (L3Root(iLvl2).NamedEntries + L3Root(iLvl2).IDEntries)
                        ' Read third level child nodes
                        CopyMemory Cursor, L2Entries(iLvl2).Offset, 3
                        Cursor = Cursor + TreeOffset
                        SetFilePointer hFile, (Cursor + 8 + (iLvl3 * 8)), 0, 0
                        ReadFile hFile, L3Entries(iLvl3), 8, BytesRead, ByVal 0&
                        ' Jump to IMAGE_DATA_ENTRY and get RVA of IconDir structure
                        SetFilePointer hFile, TreeOffset + (L3Entries(iLvl3).Offset), 0, 0
                        ReadFile hFile, DataEntries(iLvl3), 16, BytesRead, ByVal 0&
                        ' Convert RVA of IconDir structure to file offset and store
                        Count = Count + 1
                        ReDim Preserve Icons(Count) As IconDescriptor
                        Icons(Count).Offset = RVA_to_Offset(DataEntries(iLvl3).Offset)
                        ' Store ID of icon resource
                        Icons(Count).ID = L2Entries(iLvl2).Name
                        ' Store Size of icon resource
                        SetFilePointer hFile, Icons(Count).Offset, 0, 0
                        ReadFile hFile, DIB, ByVal Len(DIB), BytesRead, ByVal 0&
                        Icons(Count).Size = DIB.ImageSize + 40
                    Next iLvl3
                Next iLvl2
            End If
        Next iLvl1
    Else
        Count = 0
    End If

    ' Return the number of icons found
    GetIconOffsets = Count
    Exit Function

ErrHandler:
    MsgBox "An error occurred while locating the icon resources. " _
            & " Please make sure neither of the specified files are in use.", vbOKOnly + vbExclamation, _
            App.EXEName & " - " & Err.Description

End Function
Public Function HackDirectories(hFile As Long, ResTree As Long, DIBOffset As Long, _
                                DIBAttrib As ICON_DIR_ENTRY) As Boolean
    On Error GoTo ErrHandler:

    Dim Cursor        As Long                              ' File pointer position
    Dim Root          As IMAGE_RESOURCE_DIR                ' Root node of res tree
    Dim L1Entries()   As RESOURCE_DIR_ENTRY                ' First-level child nodes
    Dim L2Root()      As IMAGE_RESOURCE_DIR                ' Second-level root nodes
    Dim L2Entries()   As RESOURCE_DIR_ENTRY                ' Second-level child nodes
    Dim L3Root()      As IMAGE_RESOURCE_DIR                ' Third-level root nodes
    Dim L3Entries()   As RESOURCE_DIR_ENTRY                ' Third-level child nodes
    Dim DataEntries() As RESOURCE_DATA_ENTRY               ' IMAGE_RESOURCE_DATA_ENTRY structs
    Dim IcoDir        As ICON_DIR                          ' IconDirectory in EXE
    Dim iLvl1         As Integer                           ' Loop Counter (first level)
    Dim iLvl2         As Integer                           ' Loop Counter (second level)
    Dim iLvl3         As Integer                           ' Loop Counter (third level)
    Dim intC          As Integer                           ' Loop Counter (general)
    Dim BytesRead     As Long                              ' Returned by Read/WriteFile API's

    If (hFile >= 0) Then
        ' Convert DIBOffset to an RVA (needed for RESOURCE_DATA_ENTRY structures)
        DIBOffset = Offset_to_RVA(DIBOffset)
        SetFilePointer hFile, ByVal ResTree, 0, 0
        ReadFile hFile, Root, Len(Root), BytesRead, ByVal 0&
        ReDim L1Entries(Root.NamedEntries + Root.IDEntries) As RESOURCE_DIR_ENTRY
        ReDim L2Root(Root.NamedEntries + Root.IDEntries) As IMAGE_RESOURCE_DIR
        ' Loop through first-level child nodes and find RT_GROUP_ICON branch
        For iLvl1 = 1 To (Root.NamedEntries + Root.IDEntries)
            SetFilePointer hFile, ResTree + 8 + (iLvl1 * 8), 0, 0
            ReadFile hFile, L1Entries(iLvl1), 8, BytesRead, ByVal 0&
            If L1Entries(iLvl1).Name = &HE Then
                ' RT_GROUP_ICON branch found
                CopyMemory Cursor, L1Entries(iLvl1).Offset, 3
                Cursor = Cursor + ResTree
                SetFilePointer hFile, Cursor, 0, 0
                ' Read second-level directory
                ReadFile hFile, L2Root(iLvl1), 16, BytesRead, ByVal 0&
                ReDim L2Entries(L2Root(iLvl1).NamedEntries + L2Root(iLvl1).IDEntries) As RESOURCE_DIR_ENTRY
                ReDim L3Root(L2Root(iLvl1).NamedEntries + L2Root(iLvl1).IDEntries) As IMAGE_RESOURCE_DIR
                For iLvl2 = 1 To (L2Root(iLvl1).NamedEntries + L2Root(iLvl1).IDEntries)
                    CopyMemory Cursor, L1Entries(iLvl1).Offset, 3
                    Cursor = Cursor + ResTree
                    SetFilePointer hFile, Cursor + 8 + (iLvl2 * 8), 0, 0
                    ReadFile hFile, L2Entries(iLvl2), 8, BytesRead, ByVal 0&
                    CopyMemory Cursor, L2Entries(iLvl2).Offset, 3
                    Cursor = Cursor + ResTree
                    SetFilePointer hFile, Cursor, 0, 0
                    ' Read thrid-level directory
                    ReadFile hFile, L3Root(iLvl2), 16, BytesRead, ByVal 0&
                    ReDim L3Entries(L3Root(iLvl2).NamedEntries + L3Root(iLvl2).IDEntries) As RESOURCE_DIR_ENTRY
                    For iLvl3 = 1 To (L3Root(iLvl2).NamedEntries + L3Root(iLvl2).IDEntries)
                        ' Read third-level child nodes
                        CopyMemory Cursor, L2Entries(iLvl2).Offset, 3
                        Cursor = Cursor + ResTree + 8 + (iLvl3 * 8)
                        SetFilePointer hFile, Cursor, 0, 0
                        ReadFile hFile, L3Entries(iLvl3), 8, BytesRead, ByVal 0&
                        ' Jump to RESOURCE_DATA_ENTRY
                        CopyMemory Cursor, L3Entries(iLvl3).Offset, 3
                        Cursor = Cursor + ResTree
                        SetFilePointer hFile, Cursor, 0, 0
                        ReDim Preserve DataEntries(iLvl3) As RESOURCE_DATA_ENTRY
                        ReadFile hFile, DataEntries(iLvl3), 16, BytesRead, ByVal 0&
                        ' Jump to and read ICON_DIR structure
                        Cursor = RVA_to_Offset(DataEntries(iLvl3).Offset)
                        SetFilePointer hFile, Cursor, 0, 0
                        ReadFile hFile, IcoDir, 6, BytesRead, ByVal 0&
                        For intC = 1 To IcoDir.Count
                            WriteFile hFile, DIBAttrib, Len(DIBAttrib) - 4, BytesRead, ByVal 0&
                            SetFilePointer hFile, 2, 0, 1
                        Next intC
                    Next iLvl3
                Next iLvl2
            ElseIf L1Entries(iLvl1).Name = 3 Then
                CopyMemory Cursor, L1Entries(iLvl1).Offset, 3
                Cursor = Cursor + ResTree
                SetFilePointer hFile, ByVal Cursor, 0, 0
                ' Read second-level directory
                ReadFile hFile, L2Root(iLvl1), 16, BytesRead, ByVal 0&
                ReDim L2Entries(L2Root(iLvl1).NamedEntries + L2Root(iLvl1).IDEntries) As RESOURCE_DIR_ENTRY
                ReDim L3Root(L2Root(iLvl1).NamedEntries + L2Root(iLvl1).IDEntries) As IMAGE_RESOURCE_DIR
                For iLvl2 = 1 To (L2Root(iLvl1).NamedEntries + L2Root(iLvl1).IDEntries)
                    CopyMemory Cursor, L1Entries(iLvl1).Offset, 3
                    Cursor = Cursor + ResTree
                    SetFilePointer hFile, Cursor + 8 + (iLvl2 * 8), 0, 0
                    ReadFile hFile, L2Entries(iLvl2), 8, BytesRead, ByVal 0&
                    CopyMemory Cursor, L2Entries(iLvl2).Offset, 3
                    Cursor = Cursor + ResTree
                    SetFilePointer hFile, Cursor, 0, 0
                    ' Read thrid-level directory
                    ReadFile hFile, L3Root(iLvl2), 16, BytesRead, ByVal 0&
                    ReDim L3Entries(L3Root(iLvl2).NamedEntries + L3Root(iLvl2).IDEntries) As RESOURCE_DIR_ENTRY
                    For iLvl3 = 1 To (L3Root(iLvl2).NamedEntries + L3Root(iLvl2).IDEntries)
                        ' Read third-level child nodes
                        CopyMemory Cursor, L2Entries(iLvl2).Offset, 3
                        Cursor = Cursor + ResTree + 8 + (iLvl3 * 8)
                        SetFilePointer hFile, Cursor, 0, 0
                        ReadFile hFile, L3Entries(iLvl3), 8, BytesRead, ByVal 0&
                        ' Jump to and hack the RESOURCE_DATA_ENTRY
                        Cursor = L3Entries(iLvl3).Offset + ResTree
                        SetFilePointer hFile, Cursor, 0, 0
                        WriteFile hFile, DIBOffset, 4, BytesRead, ByVal 0&
                        WriteFile hFile, CLng(DIBAttrib.dwBytesInRes + 40), 4, BytesRead, ByVal 0&
                    Next iLvl3
                Next iLvl2
            End If
        Next iLvl1
    Else
        HackDirectories = False
        Exit Function
    End If

    HackDirectories = True
    Exit Function

ErrHandler:
    MsgBox "An error occurred while modifying the resource directories. " _
            & " Please make sure neither of the specified files are in use.", vbOKOnly + vbExclamation, _
            App.EXEName & " - " & Err.Description

End Function
Private Function RVA_to_Offset(RVA As Long) As Long
    On Error GoTo ErrHandler:
    Dim TempOffset    As Long                              ' Difference of RVA and start of section
    TempOffset = RVA - ResSectionRVA
    If (TempOffset >= 0) Then
        ' Calculate the file offset of the RVA
        RVA_to_Offset = ResSectionOffset + TempOffset
    Else
        RVA_to_Offset = -1
    End If
    Exit Function

ErrHandler:
    MsgBox "Error in RVA_to_Offset function: " & Err.Number & ": " & Err.Description, _
            vbOKOnly + vbExclamation, App.EXEName & " - Error"
End Function

Private Function Offset_to_RVA(Offset As Long) As Long
    On Error GoTo ErrHandler:

    Dim TempOffset    As Long                              ' Difference of Offset and start of section

    ' Get distance between offset and start of resource section
    TempOffset = Offset - ResSectionOffset
    If TempOffset >= 0 Then
        ' Calculate RVA of the file offset
        Offset_to_RVA = ResSectionRVA + TempOffset
    Else
        Offset_to_RVA = -1
    End If
    Exit Function

ErrHandler:
    MsgBox "Error in Offset_to_RVA function: " & Err.Number & ": " & Err.Description, _
            vbOKOnly + vbExclamation, App.EXEName & " - Error"

End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -