Изменение информации о файле

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Senitma
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 25.11.2012 (Вс) 20:07

Изменение информации о файле

Сообщение Senitma » 25.11.2012 (Вс) 20:24

Существует программа, которая по требованию начальства должна запускаться на компьютерах. Проблема в том, что на компьютерах стоит блокировка для запуска программ и небольшой список разрешенных программ. Как я понял - проверяют информацию о файле (версию, автора и прочее). При изменении данных в AssemblyInfo - программа запускается. Ну а теперь сама суть. Есть небольшой код, который в идеале должен вытаскивать инфу из нужного EXE и подменять ее в моем. На деле, как я понял, нужно определить язык программы, чтобы вытащить нужную информацию о файле. Вот тут я и застрял :)

Как должно быть
Old.PNG
Old.PNG (91.79 Кб) Просмотров: 3457

Что выходит в итоге
New.PNG
New.PNG (101.95 Кб) Просмотров: 3457


Сам код программы
Код: Выделить всё
Module Module1
    Private Declare Function BeginUpdateResource Lib "kernel32.dll" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Boolean) As Long
    Private Declare Function UpdateResource Lib "kernel32.dll" Alias "UpdateResourceA" (ByVal hUpdate As IntPtr, ByVal lpType As Integer, ByVal lpName As Integer, ByVal wLanguage As System.UInt16, ByVal lpData As IntPtr, ByVal cbData As UInteger) As Boolean
    Private Declare Function EndUpdateResource Lib "kernel32.dll" Alias "EndUpdateResourceA" (ByVal hUpdate As IntPtr, ByVal fDiscard As Boolean) As Boolean

    Private Declare Function FindResource Lib "kernel32.dll" Alias "FindResourceA" (ByVal hModule As IntPtr, ByVal lpName As Byte, ByVal lpType As Byte) As IntPtr
    Private Declare Function SizeofResource Lib "kernel32.dll" (ByVal hModule As IntPtr, ByVal hResInfo As IntPtr) As Long
    Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpFileName As String) As IntPtr
    Private Declare Function LoadResource Lib "kernel32.dll" Alias "LoadResource" (ByVal hModule As IntPtr, ByVal hResInfo As IntPtr) As IntPtr
    Private Declare Function LockResource Lib "kernel32.dll" Alias "LockResource" (ByVal hResData As IntPtr) As IntPtr

    Sub Main()
        Dim k1 As Long = LoadLibrary("smath.exe")
        Dim k2 As Long = FindResource(k1, 1, 16)
        Dim k3 As Long = SizeofResource(k1, k2)
        Dim k4 As Long = LoadResource(k1, k2)
        Dim k5 As Long = LockResource(k4)

        'Dim kbyte(k3 - 1) As Byte
        'Runtime.InteropServices.Marshal.Copy(k5, kbyte, 0, k3)
        'For i As Integer = 0 To k3 - 1
        '    Console.Write(Chr(kbyte(i)))
        'Next

        'Console.ReadLine()

        Dim a As Long = BeginUpdateResource("GuideMain.exe", False)
        Dim b = UpdateResource(a, 16, 1, 0, k5, k3)
        EndUpdateResource(a, False)
    End Sub
End Module


Набор EXE для проверки
Debug.rar
(69.09 Кб) Скачиваний: 286

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.11.2012 (Вс) 22:26

А ты Declare Unicode Function с соответствующими функциями не пробовал?

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Изменение информации о файле

Сообщение ark » 26.11.2012 (Пн) 2:20

Qwertiy писал(а):А ты Declare Unicode Function
А зачем? В VB6 такой конструкции нет, там алиас через xxxW, а это ж копипаста с VB6/ Уважаемый Senitma, надо хоть немного доки читать. Декларации - жуткая смесь VB6 и VB.Net. BeginUpdateResource, например, возвращает IntPtr, а не Long, а SizeofResource - Integer
В FindResource вообще ByVal подставлено IDE - надо или массив байтов ByRef или строка (тогда нумерованные ресурсы надо указывать как #16, например). Можно, в принципе, менять даже отдельные значения VersionInfo (см. тут и там). В твоём случае проще - нужно скопировать данные (888 байт в твоём файле) и вставить в новый.
ResView.zip
Resource viewer
(72.95 Кб) Скачиваний: 196
Вот VB6 версия. Открываешь smath.exe, находишь версию, в меню Edit жмёшь "Copy", грузишь нужный файл, находишь версию, жмёшь "Paste"
ResVer.PNG
ResVer.PNG (36.06 Кб) Просмотров: 3447

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.11.2012 (Пн) 7:22

ark писал(а):А зачем? В VB6 такой конструкции нет

Это раздел по VB.NET, а в нём есть!

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Изменение информации о файле

Сообщение ark » 26.11.2012 (Пн) 13:06

Qwertiy писал(а):Это раздел по VB.NET, а в нём есть!
Я имел в виду копипасту.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.11.2012 (Пн) 13:58

ark писал(а):Я имел в виду копипасту.

Не понял.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Изменение информации о файле

Сообщение iGrok » 26.11.2012 (Пн) 21:19

Senitma писал(а):по требованию начальства должна запускаться

Senitma писал(а):на компьютерах стоит блокировка для запуска программ и небольшой список разрешенных программ


Исходя из этих двух фраз, вся проблема решается резолюцией от начальства на внесение твоей программы в список разрешённых, и исполнением этой резолюции тем, в чьи обязанности это входит.

Откуда взялось "решение" подменять данные о файле на "валидные"?

З.Ы. Что касается технической части, "проблема" с языками решается при помощи EnumResourceLanguages + FindResourceEx.
label:
cli
jmp label

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Изменение информации о файле

Сообщение ark » 27.11.2012 (Вт) 0:19

Qwertiy писал(а):Не понял.
Декларации явно и бездумно скопированы с VB6. Чего стоят одни Long'и в конце. Какой тут Unicode/Auto. Я удивляюсь, как их вообще vshost не отрыгнул, матерно выругавшись.

Senitma
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 25.11.2012 (Вс) 20:07

Re: Изменение информации о файле

Сообщение Senitma » 27.11.2012 (Вт) 7:35

Проблема в том, что над моим начальством есть еще одно, которым откровенно по барабану на наши смертные жизни. Ark, спасибо за пример, он очень помог. Оказалось, что нужно было в функцию FindResource отправлять #1, а не 1. Ну а за копипаст извиняюсь. Просто около недели копался в разных доках и ни один не мог заставить работать. Нашел только на C++, но так и не смог в нем разобраться.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Изменение информации о файле

Сообщение ark » 27.11.2012 (Вт) 10:18

Чтобы отправлять #1, надо декларацию переписать ByVal lpName As String


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList