Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переименовать производителя проги 
:(
    Опции темы
Delphist
  Дата 22.10.2004, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Как средствами Delphi7 переименовать имя производителя, название проги (они вшиваются в PE файл при его создании), вообщем все то что отображается при свойствах файла.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 22.10.2004, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Ручками найти в фале еначальный быйт записи информациии (похоже он гже-то в конце, можно через Far почитать); записать туда новую информацию; переделать длину файла (как это делают вирусы)... :( :)
PM   Вверх
p0s0l
Дата 22.10.2004, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Зачем же так ?
Project -> Options -> Version Info
ставим галочку, и заполняем инфу...


--------------------
С уважением, г-н Посол.
PM   Вверх
Pakshin A. S.
Дата 22.10.2004, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



По всей видимости, человеку нужно переименовать это в чужой программе... :(
PM   Вверх
Alex
Дата 22.10.2004, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



если в чужой то это не есть хорошо, ну если очень хочется, то эта информация хранится в ресурсах.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
p0s0l
Дата 22.10.2004, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
По всей видимости, человеку нужно переименовать это в чужой программе...
Мдя ?... Ну ладно, будет тогда так:
Код
var ResName : PChar; // эта переменная нужна!

procedure ChangeCompany (FileName : string; NewCompany : string);
const CompanyName = 'CompanyName';
var
 hUpdate : THandle;
 hExe : HMODULE;
 Data : WideString;
 ResInfo : HRSRC;
 ResData : HGLOBAL;
 Adr : Pointer;
 Size : DWORD;
 i0, i, l : integer;

 function EnumFunc (hMod : HMODULE; lpszType : LPCTSTR; lpszName : LPTSTR; lParam : integer) : BOOL; stdcall;
 begin
   ResName := lpszName;
   Result := False;
 end;

begin
 hExe := LoadLibrary (PChar(FileName));
 if hExe = 0 then Exit;
 ResName := nil;
 EnumResourceNames (hExe, RT_VERSION, @EnumFunc, 0);
 ResInfo := FindResource (hExe, ResName, RT_VERSION);
 if ResInfo = 0 then Exit;
 ResData := LoadResource (hExe, ResInfo);
 Adr := LockResource (ResData);
 Size := SizeofResource (hExe, ResInfo);
 SetLength(Data, Size div 2);
 CopyMemory (@Data[1], Adr, Size);
 FreeResource (ResData);
 FreeLibrary (hExe);

 i0 := Pos(CompanyName, Data);
 i := i0 + Length(CompanyName);
 while Data[i] = #0 do Inc(i);
 l := 0;
 while Data[i+l] <> #0 do Inc(l);
 while Data[i+l] = #0 do Inc(l);
 Delete (Data, i, l);

 NewCompany := NewCompany + #0;
 Data[i0-2] := WideChar(Length(NewCompany));
 while (Length(NewCompany) mod 2) <> 0 do NewCompany := NewCompany + #0;
 Insert (NewCompany, Data, i);
 Data[i0-3] := WideChar( Word(Data[i0-3]) + (Length(NewCompany) - l)*2 );

 i0 := Pos('StringFileInfo', Data);
 Data[i0-3] := WideChar( Word(Data[i0-3]) + (Length(NewCompany) - l)*2 );

 Size := Length(Data)*2;
 Data[1] := WideChar(Size);
 
 hUpdate := BeginUpdateResource (PChar(FileName), False);
 UpdateResource (hUpdate, RT_VERSION, ResName, 1049, @Data[1], Size);
 EndUpdateResource (hUpdate, False);
end;


Пример вызова:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
 ChangeCompany ('c:\project1.exe', 'Posol');
end;




--------------------
С уважением, г-н Посол.
PM   Вверх
Alex
Дата 23.10.2004, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



p0s0l по сути, ты конечно дал правильный пример, но во первых он будет работать только в NT системах т.к. функции *UpdateResource присутствуют только в NT, а во вторых ты в UpdateResource жестко задал язык ресурса 1049 (Русский) сам понимаешь, что это не хорошо.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
p0s0l
Дата 23.10.2004, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
1049 (Русский)
Спасибо, что сказал. Я для теста сделал без определения языка, и так потом и забыл сделать определение языка...
Щас подправлю...




--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 23.10.2004, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Код
var ResName : PChar; // эта переменная нужна!

procedure ChangeCompany (FileName : string; NewCompany : string);
const
 StringFileInfo = 'StringFileInfo';
 CompanyName = 'CompanyName';
 
var
 hUpdate : THandle;
 hExe : HMODULE;
 Data : WideString;
 ResInfo : HRSRC;
 ResData : HGLOBAL;
 Adr : Pointer;
 Size : DWORD;
 i0, i00, i, l, delta : integer;
 NewCompanyZ : string;
 LangID : word;

 function EnumFunc (hMod : HMODULE; lpszType : LPCTSTR; lpszName : LPTSTR; lParam : integer) : BOOL; stdcall;
 begin
   ResName := lpszName;
   Result := False;
 end;

begin
 hExe := LoadLibrary (PChar(FileName));
 if hExe = 0 then Exit;
 ResName := nil;
 EnumResourceNames (hExe, RT_VERSION, @EnumFunc, 0);
 ResInfo := FindResource (hExe, ResName, RT_VERSION);
 if ResInfo = 0 then Exit;
 ResData := LoadResource (hExe, ResInfo);
 Adr := LockResource (ResData);
 Size := SizeofResource (hExe, ResInfo);
 SetLength(Data, Size div 2);
 CopyMemory (@Data[1], Adr, Size);
 FreeResource (ResData);
 FreeLibrary (hExe);

 NewCompanyZ := NewCompany + #0;
 while (Length(NewCompanyZ) mod 2) <> 0 do NewCompanyZ := NewCompanyZ + #0;

 i00 := Pos(StringFileInfo, Data);
 if i00 = 0 then Exit;

 i0 := PosEx(CompanyName, Data, i00);
 if i0 = 0 then Exit;

 i := i0 + Length(CompanyName);
 while Data[i] = #0 do Inc(i);
 l := 0;
 while Data[i+l] <> #0 do Inc(l);
 while Data[i+l] = #0 do Inc(l);
 Delete (Data, i, l);
 Insert (NewCompanyZ, Data, i);

 delta := (Length(NewCompanyZ) - l);
 Data[i0-3] := WideChar( Word(Data[i0-3]) + delta*2 ); // размер CompanyName
 Data[i0-2] := WideChar(Length(NewCompany)+1); // длина нового производителя
 Data[i00-3] := WideChar( Word(Data[i00-3]) + delta*2 ); // размер StringFileInfo
 i := i00+Length(StringFileInfo)+1;
 Data[i] := WideChar( Word(Data[i]) + delta*2 ); // размер языковой инфы
 Size := Length(Data)*2;
 Data[1] := WideChar(Size);

 Inc(i, 3);
 LangId := StrToInt('$' + Copy(Data, i, 4));

 hUpdate := BeginUpdateResource (PChar(FileName), False);
 UpdateResource (hUpdate, RT_VERSION, ResName, LangId, @Data[1], Size);
 EndUpdateResource (hUpdate, False);
end;
По смыслу надо предусмотреть возможность наличия инфы о версии в нескольких языках, но это удовольствие я оставлю для автора темы :), т.к. для испытания этого у себя я таких многоязыковых файлов не нашёл...


--------------------
С уважением, г-н Посол.
PM   Вверх
Alex
Дата 23.10.2004, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



А я бы сделал так:
Код
uses
 acWorkRes;
...

threadvar
 ResName : PChar; // эта переменная нужна!

procedure ChangeCompany (FileName : string; NewCompany : string);
const
 StringFileInfo = 'StringFileInfo';
 CompanyName = 'CompanyName';

var
 hUpdate : THandle;
 hExe : HMODULE;
 Data : WideString;
 ResInfo : HRSRC;
 ResData : HGLOBAL;
 Adr : Pointer;
 Size : DWORD;
 i0, i00, i, l, delta : integer;
 NewCompanyZ : string;

 function EnumFunc (hMod : HMODULE; lpszType : LPCTSTR; lpszName : LPTSTR; lParam : integer) : BOOL; stdcall;
 begin
  ResName := lpszName;
  Result := False;
 end;

begin
 hExe := LoadLibrary (PChar(FileName));
 if hExe = 0 then Exit;
 ResName := nil;
 EnumResourceNames (hExe, RT_VERSION, @EnumFunc, 0);

 ResInfo := FindResource (hExe, ResName, RT_VERSION);
 if ResInfo = 0 then Exit;
 ResData := LoadResource (hExe, ResInfo);
 Adr := LockResource (ResData);
 Size := SizeofResource (hExe, ResInfo);
 SetLength(Data, Size div 2);
 CopyMemory (@Data[1], Adr, Size);
 FreeResource (ResData);
 FreeLibrary (hExe);

 NewCompanyZ := NewCompany + #0;
 while (Length(NewCompanyZ) mod 2) <> 0 do NewCompanyZ := NewCompanyZ + #0;

 i00 := Pos(StringFileInfo, Data);
 if i00 = 0 then Exit;

 i0 := PosEx(CompanyName, Data, i00);
 if i0 = 0 then Exit;

 i := i0 + Length(CompanyName);
 while Data[i] = #0 do Inc(i);
 l := 0;
 while Data[i+l] <> #0 do Inc(l);
 while Data[i+l] = #0 do Inc(l);
 Delete (Data, i, l);
 Insert (NewCompanyZ, Data, i);

 delta := (Length(NewCompanyZ) - l);
 Data[i0-3] := WideChar( Word(Data[i0-3]) + delta*2 ); // размер CompanyName
 Data[i0-2] := WideChar(Length(NewCompany)+1); // длина нового производителя
 Data[i00-3] := WideChar( Word(Data[i00-3]) + delta*2 ); // размер StringFileInfo

 Size := Length(Data)*2;
 Data[1] := WideChar(Size);

 hUpdate := BeginUpdateResourceW(StringToPWide(FileName), False);
 notLang:= True;
 try
   UpdateResourceW(hUpdate, PWideChar(RT_VERSION), PWideChar(ResName), 0, @Data[1], Size);
 finally
   notLang:= False;
 end;
 EndUpdateResourceW(hUpdate, False);
end;

Добавлено @ 22:21
Скачать и прочитать о модуле acWorkRes можно здесь http://forum.vingrad.ru/index.php?showtopic=21183


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
p0s0l
Дата 24.10.2004, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Alex, а без дополнительных библиотек слабо ? :p
Только в чём заключается отличие ? Я мотал туда-сюда, вроде есть отличия, но не значительные... Единственное, что настораживает - это таинственная переменная notLang - зачем она введена ? И переход на Unicode-функции BeginUpdate, Update, EndUpdate... В чём преимущество этого перехода ? Имена ресурсов в файле все равно не уникодовые... А инфа о версии всё равно в любом случае уникодовая, даже если пользоваться анси-функциями (как в моём случае: Data ведь WideString, а не AnsiString)...
Если ради имени файла, то тогда LoadLibrary тоже надо Wideом сделать...
Объясни, плиз... (мне просто интересно, скорее всего я что-то упустил и не знаю того, чего знаешь ты...)
Хотя может это сон на меня наваливается, и я уже ничего не понимаю... :)


--------------------
С уважением, г-н Посол.
PM   Вверх
Alex
Дата 24.10.2004, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Цитата(p0s0l @ 24.10.2004, 05:07)
Alex, а без дополнительных библиотек слабо ? 
Только в чём заключается отличие ? Я мотал туда-сюда, вроде есть отличия, но не значительные... Единственное, что настораживает - это таинственная переменная notLang - зачем она введена ? И переход на Unicode-функции BeginUpdate, Update, EndUpdate... В чём преимущество этого перехода ? Имена ресурсов в файле все равно не уникодовые... А инфа о версии всё равно в любом случае уникодовая, даже если пользоваться анси-функциями (как в моём случае: Data ведь WideString, а не AnsiString)...
Если ради имени файла, то тогда LoadLibrary тоже надо Wideом сделать...
Объясни, плиз... (мне просто интересно, скорее всего я что-то упустил и не знаю того, чего знаешь ты...)
Хотя может это сон на меня наваливается, и я уже ничего не понимаю... 

Ну вот приехали, здрасте, а кто целый раздел “арсенал форума” создавал под модуль acWorkRes. :( В модуле реализованы СВОИ функции *UpdateResource сделано это было для того чтобы можно было использовать эти функции не только в NT, но и в 9х системах. Плюс в этих функциях нет ошибок, которые присутствуют в стандартных функциях при работе с иконками, в модуле присутствуют несколько функций для упрощенной работы с картинками иконками и файлами, которые хранятся в ресурсах. И т.к. в большинстве случаев язык ресурса нам не важен, то при установке переменной notLang в истину модуль перестает обращать внимание на язык ресурса при работе с ним. Так что выбирать, конечно, программисту пользоваться моим модулем или нет, но я лично пишу программы, которые должны запускаться под виндами от 95 до 2003 и мне этот модуль был необходим как воздух.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
p0s0l
Дата 24.10.2004, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Вот и разгадка :)
Ты обозвал свои функции в модуле также, как и в WinAPI, я даже и не подумал, что это твои функции...
Ну тогда всё встаёт на свои места... :)


--------------------
С уважением, г-н Посол.
PM   Вверх
Delphist
Дата 26.10.2004, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Alex @ 23.10.2004, 22:18)
А я бы сделал так:
Код
uses
 acWorkRes;
...

threadvar
 ResName : PChar; // эта переменная нужна!

procedure ChangeCompany (FileName : string; NewCompany : string);
const
 StringFileInfo = 'StringFileInfo';
 CompanyName = 'CompanyName';

var
 hUpdate : THandle;
 hExe : HMODULE;
 Data : WideString;
 ResInfo : HRSRC;
 ResData : HGLOBAL;
 Adr : Pointer;
 Size : DWORD;
 i0, i00, i, l, delta : integer;
 NewCompanyZ : string;

 function EnumFunc (hMod : HMODULE; lpszType : LPCTSTR; lpszName : LPTSTR; lParam : integer) : BOOL; stdcall;
 begin
  ResName := lpszName;
  Result := False;
 end;

begin
 hExe := LoadLibrary (PChar(FileName));
 if hExe = 0 then Exit;
 ResName := nil;
 EnumResourceNames (hExe, RT_VERSION, @EnumFunc, 0);

 ResInfo := FindResource (hExe, ResName, RT_VERSION);
 if ResInfo = 0 then Exit;
 ResData := LoadResource (hExe, ResInfo);
 Adr := LockResource (ResData);
 Size := SizeofResource (hExe, ResInfo);
 SetLength(Data, Size div 2);
 CopyMemory (@Data[1], Adr, Size);
 FreeResource (ResData);
 FreeLibrary (hExe);

 NewCompanyZ := NewCompany + #0;
 while (Length(NewCompanyZ) mod 2) <> 0 do NewCompanyZ := NewCompanyZ + #0;

 i00 := Pos(StringFileInfo, Data);
 if i00 = 0 then Exit;

 i0 := PosEx(CompanyName, Data, i00);
 if i0 = 0 then Exit;

 i := i0 + Length(CompanyName);
 while Data[i] = #0 do Inc(i);
 l := 0;
 while Data[i+l] <> #0 do Inc(l);
 while Data[i+l] = #0 do Inc(l);
 Delete (Data, i, l);
 Insert (NewCompanyZ, Data, i);

 delta := (Length(NewCompanyZ) - l);
 Data[i0-3] := WideChar( Word(Data[i0-3]) + delta*2 ); // размер CompanyName
 Data[i0-2] := WideChar(Length(NewCompany)+1); // длина нового производителя
 Data[i00-3] := WideChar( Word(Data[i00-3]) + delta*2 ); // размер StringFileInfo

 Size := Length(Data)*2;
 Data[1] := WideChar(Size);

 hUpdate := BeginUpdateResourceW(StringToPWide(FileName), False);
 notLang:= True;
 try
   UpdateResourceW(hUpdate, PWideChar(RT_VERSION), PWideChar(ResName), 0, @Data[1], Size);
 finally
   notLang:= False;
 end;
 EndUpdateResourceW(hUpdate, False);
end;

Добавлено @ 22:21
Скачать и прочитать о модуле acWorkRes можно здесь http://forum.vingrad.ru/index.php?showtopic=21183

Вместо того, чтобы переименовать производителя, твой код удаляет всю инфу о версии файла.
Я попробовал код p0s0l'a тоже самое!!!


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
p0s0l
Дата 26.10.2004, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Delphist, выложи или пришли на мыло тот файл, у которого портится инфа о версии...
Потому как у меня всё нормально переименовывется - пробовал файлах на 10...
PS: ты который мой вариант пробовал - первый или второй ? Надо второй...



--------------------
С уважением, г-н Посол.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2662 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.