可不可以不用Registry单元写注册表? (100分)

  • 主题发起人 主题发起人 Rik
  • 开始时间 开始时间
谢谢你,张兄,我会试试
 
我有,到我的网站上看看
http://codehunter.51software.net
那个木马的服务端
 
To:CodeHunter
我去你站上转了转,不错呀,下载了你的一些源码,我是个Delphi初学者,向你学习
 
还有个问题问一下,可不可以不用Registry单元,就可以写注册表?
 
{对参数TMemoryStrema中的字节流进行Base64编码,编码后的结果
保存在Encoded中,函数返回编码长度}
function EncodeBASE64(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer;
const
_Code64: String[64] =
('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
var
I: LongInt;
B: array[0..2279] of Byte;
J, K, L, M, Quads: Integer;
Stream: string[76];
EncLine: String;
begin

Encoded.Clear;

Stream := '';
Quads := 0;

{为提高效率,每2280字节流为一组进行编码}
J := Decoded.Size div 2280;

Decoded.Position := 0;

{对前J*2280个字节流进行编码}
for I := 1 to J do
begin
Decoded.Read(B, 2280);

for M := 0 to 39 do
begin
for K := 0 to 18 do
begin
L:= 57*M + 3*K;

Stream[Quads+1] := _Code64[(B[L] div 4)+1];
Stream[Quads+2] := _Code64[(B[L] mod 4)*16 + (B[L+1] div 16)+1];
Stream[Quads+3] := _Code64[(B[L+1] mod 16)*4 + (B[L+2] div 64)+1];
Stream[Quads+4] := _Code64[B[L+2] mod 64+1];

Inc(Quads, 4);

if Quads = 76 then
begin
Stream[0] := #76;
EncLine := Stream+#13#10;
Encoded.Write(EncLine[1], Length(EncLine));
Quads := 0;
end;
end;
end;
end;
J := (Decoded.Size mod 2280) div 3;
for I := 1 to J do
begin
Decoded.Read(B, 3);

Stream[Quads+1] := _Code64[(B[0] div 4)+1];
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + (B[2] div 64)+1];
Stream[Quads+4] := _Code64[B[2] mod 64+1];

Inc(Quads, 4);

if Quads = 76 then
begin
Stream[0] := #76;
EncLine := Stream+#13#10;
Encoded.Write(EncLine[1], Length(EncLine));
Quads := 0;
end;
end;
//补位
if (Decoded.Size mod 3) = 2 then
begin
Decoded.Read(B, 2);

Stream[Quads+1] := _Code64[(B[0] div 4)+1];
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + 1];
Stream[Quads+4] := '=';

Inc(Quads, 4);
end;

if (Decoded.Size mod 3) = 1 then
begin
Decoded.Read(B, 1);

Stream[Quads+1] := _Code64[(B[0] div 4)+1];
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + 1];
Stream[Quads+3] := '=';
Stream[Quads+4] := '=';
Inc(Quads, 4);
end;

Stream[0] := Chr(Quads);

if Quads > 0 then
begin
EncLine := Stream+#13#10;
Encoded.Write(EncLine[1], Length(EncLine));
end;

Result := Encoded.Size;
end;

{对参数Decoded字符串进行Base64编码,返回编码后的字符串}
function EncodeString(Decoded:string):String;
var
mmTemp,mmDecoded:TMemoryStream;
strTemp:TStrings;
begin
mmTemp := TMemoryStream.Create;
mmDecoded:=TMemoryStream.Create;
strTemp:=TStringList.Create;

strTemp.Add(Decoded);
strTemp.SaveToStream(mmTemp);
mmTemp.Position := 0;

{剔除mmTemp从strTemp中带来的字符#13#10}
mmDecoded.CopyFrom(mmTemp,mmTemp.Size-2);

{对mmDecoded进行Base64编码,由mmTemp返回编码后的结果}
EncodeBASE64(mmTemp,mmDecoded);

{获得Base64编码后的字符串}
mmTemp.Position:=0;
strTemp.LoadFromStream(mmTemp);

{返回结果必须从strTemp[0]中获得,如果使用strTemp.Text会
带来不必要的字符#13#10}
Result:=strTemp[0];
end;

认证部分:
var strUsername,strpassword:string;
{对用户名和密码进行Base64编码}
strUserName:=EncodeString(UserName.Text);
strPassword:=EncodeString(Password.Text);
{进行认证,输入编码后的用户名、密码}
smtp1.Trans('auth login');
smtp1.Trans(strUserName);
smtp1.Trans(strPassword);

smtp1是我结合nmsmtp及Psock写的一个类
其实nmsmtp也不错,你可以继承以下,去掉不要的功能,程序就小点了,
真的用sock写,真的比较累的
不过写好了,也可以给大家一个范例
支持!!!!!!!!!
 
to:secri
您从它改的,请问nmsmtp的原码在何处?我在C:/Program Files/Borland/Delphi6/Source/Internet
下找不到呢?
psock又是何物?
 
你还要了解电子邮件的组成,多分析一些发送给你的电子邮件的源码,
邮件有头、文字内容、附件等等,还有不同的编码Base64、纯Text等等
最好看看nmsmtp的源码,
再有psock是fastnet的核心功能,无源码,只有帮助文件。
The PSock unit contains TPowersock, the base class for the FastNet Tools for
Delphi, and TNMGeneralServer, a generic internet server that can be used to
derive your own custom servers. It also contains a few routines that may be
useful for Internet Application Development.

 
用API写吧
 
to CODEHUNTER;
你提供的屏蔽ctrl+alt+del的源码在xp下怎么不行啊?
有没有解决的办法?我很需要,能不能帮帮忙?
我的email:swindboy@163.net
先谢了
 
Smtp身份认证终于搞定了

现在看第二个问题?

可不可以不用Registry单元写注册表?
 
学习~听讲~~~~~
 
用win32Api函数
 
先 RegOpenKey
然后 RegSetValue
最后 RegCloseKey
 
我也查了这几个Api,但自己做总有问题,不知能不能写一段代码?谢谢
 
var
h:HKEY;
err,d:DWORD;
begin
err:=RegCreateKey(HKEY_CURRENT_USER,'Software/testkey',h);
if err<>0 then
raise Exception.Create(SysErrorMessage(err));
d:=1234;
RegSetValueEx(h,'aaa',0,REG_DWORD,@d,4); //除了字符串类型可以用RegSetValue,其他必须用RegSetValueEx
RegCloseKey(h);
end;
 
后退
顶部