很久以前收集的一个替换exe图标的源码

  很久以前收集的一个替换exe图标的源码,来源已经无法考证。

标准模块1

Option Explicit
Type DIB_HEADER
    Size        As Long
    Width       As Long
    Height      As Long
    Planes      As Integer
    Bitcount    As Integer
    Reserved    As Long
    ImageSize   As Long
End Type

Type ICON_DIR_ENTRY
    bWidth            As Byte
    bHeight           As Byte
    bColorCount       As Byte
    bReserved         As Byte
    wPlanes           As Integer
    wBitCount         As Integer
    dwBytesInRes      As Long
    dwImageOffset     As Long
End Type

Type ICON_DIR
    Reserved          As Integer
   Type              As Integer
    Count             As Integer
End Type

Type DIB_BITS
    Bits()            As Byte
End Type

Public Enum Errors
    FILE_CREATE_FAILED = 1000
    FILE_READ_FAILED
    INVALID_PE_SIGNATURE
    INVALID_ICO
    NO_RESOURCE_TREE
    NO_ICON_BRANCH
    CANT_HACK_HEADERS
End Enum
Public Function ReplaceIcons(Source As String, Dest As String, Error As String) As Long

    Dim IcoDir As ICON_DIR
    Dim IcoDirEntry As ICON_DIR_ENTRY
    Dim tBits As DIB_BITS
    Dim Icons() As IconDescriptor
    Dim lngRet As Long
    Dim BytesRead As Long
    Dim hSource As Long
    Dim hDest As Long
    Dim ResTree As Long

    hSource = CreateFile(Source, ByVal &H80000000, 0, ByVal 0&, 3, 0, ByVal 0)
    If hSource >= 0 Then
        If Valid_ICO(hSource) Then
            SetFilePointer hSource, 0, 0, 0
            ReadFile hSource, IcoDir, 6, BytesRead, ByVal 0&
            ReadFile hSource, IcoDirEntry, 16, BytesRead, ByVal 0&
            SetFilePointer hSource, IcoDirEntry.dwImageOffset, 0, 0
            ReDim tBits.Bits(IcoDirEntry.dwBytesInRes) As Byte
            ReadFile hSource, tBits.Bits(0), IcoDirEntry.dwBytesInRes, BytesRead, ByVal 0&
            CloseHandle hSource
            hDest = CreateFile(Dest, ByVal (&H80000000 Or &H40000000), 0, ByVal 0&, 3, 0, ByVal 0)
            If hDest >= 0 Then
                If Valid_PE(hDest) Then
                    ResTree = GetResTreeOffset(hDest)
                    If ResTree > 308 Then                  ' Sanity check
                        lngRet = GetIconOffsets(hDest, ResTree, Icons)
                        SetFilePointer hDest, Icons(1).Offset, 0, 0
                        WriteFile hDest, tBits.Bits(0), UBound(tBits.Bits), BytesRead, ByVal 0&
                        If Not HackDirectories(hDest, ResTree, Icons(1).Offset, IcoDirEntry) Then
                            eRR.Raise CANT_HACK_HEADERS, App.EXEName, "Unable to modify directories in target executable.  File may not contain any icon resources."
                        End If
                    Else
                        eRR.Raise NO_RESOURCE_TREE, App.EXEName, Dest & " does not contain a valid resource tree.  File may be corrupt."
                        CloseHandle hDest
                    End If
                Else
                    eRR.Raise INVALID_PE_SIGNATURE, App.EXEName, Dest & " is not a valid Win32 executable."
                    CloseHandle hDest
                End If
                CloseHandle hDest
            Else
                eRR.Raise FILE_CREATE_FAILED, App.EXEName, "Failed to open " & Dest & ". Make sure file is not in use by another program."
            End If
        Else
            eRR.Raise INVALID_ICO, App.EXEName, Source & " is not a valid icon resource file."
            CloseHandle hSource
        End If
    Else
        eRR.Raise FILE_CREATE_FAILED, App.EXEName, "Failed to open " & Source & ". Make sure file is not in use by another program."
    End If
    ReplaceIcons = 0
    Exit Function
ErrHandler:
    ReplaceIcons = eRR.Number
    Error = eRR.Description
End Function
Public Function Valid_ICO(hFile As Long) As Boolean
    Dim tDir          As ICON_DIR
    Dim BytesRead     As Long
    If (hFile > 0) Then
        ReadFile hFile, tDir, Len(tDir), BytesRead, ByVal 0&
        If (tDir.Reserved = 0) And (tDir.Type = 1) And (tDir.Count > 0) Then
            Valid_ICO = True
        Else
            Valid_ICO = False
        End If
    Else
        Valid_ICO = False
    End If
End Function

标准模块2

Option Explicit
Public Type IMAGE_DOS_HEADER
    Magic    As Integer
    cblp     As Integer
    cp       As Integer
    crlc     As Integer
    cparhdr  As Integer
    minalloc As Integer
    maxalloc As Integer
    ss       As Integer
    sp       As Integer
    csum     As Integer
    ip       As Integer
    cs       As Integer
    lfarlc   As Integer
    ovno     As Integer
    res(3)   As Integer
    oemid    As Integer
    oeminfo  As Integer
    res2(9)  As Integer
    lfanew      As Long
End Type

Public Type IMAGE_FILE_HEADER
    Machine              As Integer
    NumberOfSections     As Integer
    TimeDateStamp        As Long
    PointerToSymbolTable As Long
    NumberOfSymbols      As Long
    SizeOfOtionalHeader  As Integer
    Characteristics      As Integer
End Type

Public Type IMAGE_DATA_DIRECTORY
    DataRVA     As Long
    DataSize    As Long
End Type

Public Type IMAGE_OPTIONAL_HEADER
    Magic             As Integer
    MajorLinkVer      As Byte
    MinorLinkVer      As Byte
    CodeSize          As Long
    InitDataSize      As Long
    unInitDataSize    As Long
    EntryPoint        As Long
    CodeBase          As Long
    DataBase          As Long
    ImageBase         As Long
    SectionAlignment  As Long
    FileAlignment     As Long
    MajorOSVer        As Integer
    MinorOSVer        As Integer
    MajorImageVer     As Integer
    MinorImageVer     As Integer
    MajorSSVer        As Integer
    MinorSSVer        As Integer
    Win32Ver          As Long
    ImageSize         As Long
    HeaderSize        As Long
    Checksum          As Long
    Subsystem         As Integer
    DLLChars          As Integer
    StackRes          As Long
    StackCommit       As Long
    HeapReserve       As Long
    HeapCommit        As Long
    LoaderFlags       As Long
    RVAsAndSizes      As Long
    DataEntries(15)   As IMAGE_DATA_DIRECTORY
End Type

Public Type IMAGE_SECTION_HEADER
    SectionName(7)    As Byte
    Address           As Long
    VirtualAddress    As Long
    SizeOfData        As Long
    PData             As Long
    PReloc            As Long
    PLineNums         As Long
    RelocCount        As Integer
    LineCount         As Integer
    Characteristics   As Long
End Type

Type IMAGE_RESOURCE_DIR
    Characteristics   As Long
    TimeStamp         As Long
    MajorVersion      As Integer
    MinorVersion      As Integer
    NamedEntries      As Integer
    IDEntries         As Integer
End Type

Type RESOURCE_DIR_ENTRY
    Name              As Long
    Offset            As Long
End Type

Type RESOURCE_DATA_ENTRY
    Offset            As Long
    Size              As Long
    CodePage          As Long
    Reserved          As Long
End Type

Public Type IconDescriptor
    ID       As Long
    Offset   As Long
    Size     As Long
End Type

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Public Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
Public Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private SectionAlignment   As Long
Private FileAlignment      As Long
Private ResSectionRVA      As Long
Private ResSectionOffset   As Long
Public Function Valid_PE(hFile As Long) As Boolean
    Dim Buffer(12)      As Byte
    Dim lngBytesRead    As Long
    Dim tDosHeader      As IMAGE_DOS_HEADER

    If (hFile > 0) Then
        ReadFile hFile, tDosHeader, ByVal Len(tDosHeader), lngBytesRead, ByVal 0&
        CopyMemory Buffer(0), tDosHeader.Magic, 2
        If (Chr(Buffer(0)) & Chr(Buffer(1)) = "MZ") Then
            SetFilePointer hFile, tDosHeader.lfanew, 0, 0
            ReadFile hFile, Buffer(0), 4, lngBytesRead, ByVal 0&
            If (Chr(Buffer(0)) = "P") And (Chr(Buffer(1)) = "E") And (Buffer(2) = 0) And (Buffer(3) = 0) Then
                Valid_PE = True
                Exit Function
            End If
        End If
    End If

    Valid_PE = False

End Function
Public Function GetResTreeOffset(hFile As Long) As Long
    On Error GoTo ErrHandler:

    Dim tDos          As IMAGE_DOS_HEADER
    Dim tFile         As IMAGE_FILE_HEADER
    Dim tOptional     As IMAGE_OPTIONAL_HEADER
    Dim tSections()   As IMAGE_SECTION_HEADER
    Dim BytesRead     As Long
    Dim intC          As Integer
    Dim TreeFound     As Boolean

    TreeFound = False
    If (hFile > 0) Then
        SetFilePointer hFile, 0, 0, 0
        ' Get the offset of the Image File Header
        ReadFile hFile, tDos, Len(tDos), BytesRead, ByVal 0&
        SetFilePointer hFile, ByVal tDos.lfanew + 4, 0, 0
        ' Get the Image File Header and the Image Optional Header
        ReadFile hFile, tFile, Len(tFile), BytesRead, ByVal 0&
        ReadFile hFile, tOptional, Len(tOptional), BytesRead, ByVal 0&
        ' Get section headers
        ReDim tSections(tFile.NumberOfSections - 1) As IMAGE_SECTION_HEADER
        ReadFile hFile, tSections(0), Len(tSections(0)) * tFile.NumberOfSections, BytesRead, ByVal 0&
        ' Make sure there is a resource tree in this file
        If (tOptional.DataEntries(2).DataSize) Then
            ' Save section alignment and file alignment of image
            SectionAlignment = tOptional.SectionAlignment
            FileAlignment = tOptional.FileAlignment
            ' Determine which section contains the resource tree
            For intC = 0 To UBound(tSections)
                If (tSections(intC).VirtualAddress <= tOptional.DataEntries(2).DataRVA) _
                        And ((tSections(intC).VirtualAddress + tSections(intC).SizeOfData) > tOptional.DataEntries(2).DataRVA) Then
                    TreeFound = True
                    ' Save RVA and offset of resource section for future calculations
                    ResSectionRVA = tSections(intC).VirtualAddress
                    ResSectionOffset = tSections(intC).PData
                    ' Calculate the physical file offset of the resouce tree
                    GetResTreeOffset = tSections(intC).PData + (tOptional.DataEntries(2).DataRVA - tSections(intC).VirtualAddress)
                    Exit For
                End If
            Next intC
            If Not TreeFound Then
                GetResTreeOffset = -1
            End If
        Else
            GetResTreeOffset = -1
        End If
    Else
        GetResTreeOffset = -1
    End If
    Exit Function

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

End Function
Public Function GetIconOffsets(hFile As Long, TreeOffset As Long, Icons() As IconDescriptor) As Long
    On Error GoTo ErrHandler:

    Dim Root          As IMAGE_RESOURCE_DIR                ' Root node of resource tree
    Dim L1Entries()   As RESOURCE_DIR_ENTRY                ' 1st level of directory entries
    Dim L2Root()      As IMAGE_RESOURCE_DIR                ' Level 2 resource directories
    Dim L2Entries()   As RESOURCE_DIR_ENTRY                ' 2nd level of directory entries
    Dim L3Root()      As IMAGE_RESOURCE_DIR                ' Level 3 resource directories
    Dim L3Entries()   As RESOURCE_DIR_ENTRY                ' 3rd level of directory entries
    Dim DataEntries() As RESOURCE_DATA_ENTRY               ' Resource data entries
    Dim DIB           As DIB_HEADER                        ' Descriptor for icon images
    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 Cursor        As Long                              ' Temp val for setting file pointer
    Dim BytesRead     As Long                              ' For ReadFile()
    Dim Count         As Integer                           ' Number of icons found

    If (hFile > 0) Then
        Count = 0
        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


使用示例:

Private Sub Command1_Click()
    Dim eRR As String
    ReplaceIcons "C:/a.exe", "C:/a.ico", eRR
    MsgBox "Icon Changed", , "Icon Changer"
End Sub

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: exe图标替换工具源码,其中exe代表“可执行文件”。这个工具源码的作用就是用于替换可执行文件的图标。随着计算机应用的广泛,各种软件的可执行文件的图标显得很重要,因为它是软件产品的标识之一。 执行源码的方法可以分为两种。一是使用现有工具直接打开执行;一是使用编译软件将源码编译成程序然后执行。 这个工具源码的实现理论比较简单,但实现上需要注意一些细节。具体来说: - 首先,需要通过系统调用定位到要修改的可执行文件; - 其次,需要解析可执行文件的资源表(resource table); - 之后,检查存在的图标是否满足替换条件(例如图标大小、颜色等); - 最后,将要替换图标写入可执行文件的资源表中。 以上步骤,最为关键的是解析资源表和写入图标数据。解析资源表需要根据可执行文件不同的格式进行不同的解析方式,需要针对不同的格式进行优化;写入图标数据时,需要非常小心防止出现数据格式错误等问题,需要进行一定的校验和错误检查。 总之,exe图标替换工具源码一个比较实用的工具,其实现虽然简单,但要充分考虑到各种情况,因此考验编程人员的技术。 ### 回答2: exe 图标替换工具源码,首先需要了解 exe 文件的组成结构。exe 文件是一种可执行文件,通常由多个部分组成,包括头部信息、代码段、数据段、资源段等。其中,资源段包括了 exe 文件中所有的资源信息,如图标、菜单、对话框、字符串等。因此,修改 exe 文件的图标,实际上就是修改 exe 文件中的资源段信息。 为了实现 exe 图标替换的功能,可以使用 Windows API 函数来操作 exe 文件。首先需要用到的是 LoadLibrary 和 FindResource 函数,分别用于加载当前进程中的 exe 文件以及查找资源。接着可以使用 LockResource 和 SizeofResource 函数来获取资源的位置和大小。最后需要用 UpdateResource 函数来修改资源信息,并保存更新后的 exe 文件。 以上是大致的流程,具体实现时需要考虑一些细节问题,比如如何找到 exe 文件、如何确定要替换图标资源等。同时,需要注意的是,替换 exe 图标的操作会影响 exe 文件的数字签名,因此需要重新进行数字签名以保证 exe 文件的安全性。 综上所述,exe 图标替换工具源码的实现需要使用 Windows API 函数,并考虑到一些细节问题和安全性问题。同时,需要了解 exe 文件的组成结构以及资源段的相关知识。 ### 回答3: exe 图标替换工具源码一个将可执行文件的图标替换为自定义图标的程序。它可以帮助您在 Windows 操作系统中修改应用程序的图标,使其更加符合您的个人喜好或需要。 该工具的源码通常使用 C# 或 VB.NET 编写,因为这些编程语言可以直接访问 Windows API,进而实现更多的功能。具体实现流程如下: 首先,程序会遍历指定目录下的所有可执行文件,并读取它们的图标信息。这个过程通常使用 Windows API 中的 FindFirstFile 和 FindNextFile 函数实现。 接着,程序会使用 Windows API 中的 ExtractIconEx 函数提取自定义的图标文件中的图标,并将其保存到内存中。如果用户没有提供自定义图标,则使用默认图标。 最后,程序会使用 Windows API 中的 UpdateResource 函数将自定义图标替换可执行文件中的图标资源。如果替换成功,程序将会输出日志并提示用户操作成功。 整个替换过程相对简单,但其中涉及到的 Windows API 接口较多,需要有一定的编程经验和操作系统知识。如果您是一名程序员,可以尝试理解并修改源码来使其更加适合您的需求;如果您只是一般用户,建议慎重使用该工具,以免误操作导致程序无法正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值