•         

            

            

  • HyperFilter | DoS Protection | DDoS Protection | DoS Mitigation | DDoS Mitigation | AntiDoS | AntiDDoS | Proxy Shielding

Delphi'de kapalı bir bilgisayarı açmak (Wake On Lan)

  • Konbuyu başlatan Konbuyu başlatan HiFi
  • Başlangıç tarihi Başlangıç tarihi

HiFi

Kayıtlı Üye
Katılım
9 Mart 2012
Mesajlar
575
Bir PC’yi uzaktan (Kapalıyken) açabilmek için öncelikle o PC de bir ethernet kartı olmalı ve networke bağlı olması gerekmektedir. Bundan sonra ise O ethernet kartının WoL özelliğinin olması ve biostan enable hale getirilmiş olması gerekmektedir. Ethernet Kartı eğerki onboard değil ise 3 pinli konnektörünün anakarta bağlı olması da gerekmektedir. Tümleşik karlarda buna zaten gerek olmamaması da normaldir



Neyse buraya kadar donanımsal kısımdı. Şimdi ise wol packetinden bahsedelim. Öncellikler wakeonlan paketi UDP pakettir. Yani böyle bir paketi kolaylıkla kendinizde oluşturabilirsiniz. Elinizde sadece UDP komponenti olması yeterli. şimdi de paketin içinden bahsedelim.

Bu paket çok basit ve toplam 102 byte’lıktır.

format ise şöyledir.



ilk 6 byte "FF" leden oluşur geri kalan ise açılacak bilgisayarın MAC adresinin 16 kez tekrarlanması ile oluşur.

MAC adresimiz 11h 22h 33h 44h 55h 66h olsun. paket şöyle olur.



Kod:
FF FF FF FF FF FF 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66 11 22 33 44 55 66



işte yukardaki paketi bir wake up paketidir.

pekii bu paketi nereye yollayacağız ve nasıl??



Yukarıdaki paketi "broadcast" yada "directed-broadcast" olarak yollarsanız orada bulunan 11 22 33 44 55 66 mac adresine sahip makina açılır...



Şimdi broadcast ne demek? gidecek paketi ip adresi olarak 255.255.255.255 e yollamak demek bu paketin broadcast olduğu anlamına gelir. yani bu paket, paketin yolladnığı segmentteki her yere gider fakata routerdna geçemez ve orda kalır. yani başka segmentteki makinayı açamazsınız..



Bu işi aşmak için directed broadcast kulllanılarbilir. directed broadcast kısaca şöle denebilir.

iki network var : 192.168.0.0/255.255.255.0 ve 192.168.1.0/255.255.255.0

şimdi bu 192.168.0.0 networkündeki makinanın 192.168.1.0 daki bir makinayı açması için 255.255.255.255 paketi göndermesi faydasızdır.

Bu sebeple istenen networkteki makinaya o networke ait broadcast adresi ile yollamak gerek.



yaniii... 192.168.0.255 veya 192.168.1.255 adreslerini kullanarak bu paketi göndermek gerekir.



fazla karışık ise anlamanız için size delphi sourcelarını da yazayım..







Burada da delphi de yazılmış bazı kodlar var.

bu iş için forma 4 tane label, 4 tane edit box, 1 status bar, 1 bitbtn ve 1 tane da indy UDP client koymanız gerek. )





1- edit box MAC adresi

2- edit box tahmini makinanın ip adresini

3- edit box subnet maskını

4- remottaki gidilecek ise port numarası.



arkadaşlar bu işlemin çalışması için ya routerlarda interfacelere

ip directed broadcast yada ip forward-protocol udp [port number] komutlarının girtilmesi gerek. Komutlar cisco ve nortellerde hemen hemen aynı..



Kod:
unit Unit1;



interface



uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, NMUDP, IdBaseComponent, IdComponent, IdUDPBase,

IdUDPClient, Buttons, ComCtrls;



type

TForm1 = class(TForm)

Edit1: TEdit;

Label1: TLabel;

UDP1: TIdUDPClient;

BitBtn1: TBitBtn;

Label2: TLabel;

Edit2: TEdit;

Label3: TLabel;

Edit3: TEdit;

Label4: TLabel;

Edit4: TEdit;

StatusBar1: TStatusBar;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.dfm}



////////HEX TO INT/////////////////

Kod:
Function hexToInt(const hexStr: string): longint;

var

iNdx: integer;

cTmp: Char;

begin

Result := 0;

for iNdx := 1 to Length(hexStr) do

begin

cTmp := hexStr[iNdx];

case cTmp of

’0’..’9’: Result := 16 * Result + (Ord(cTmp) - $30);

’A’..’F’: Result := 16 * Result + (Ord(cTmp) - $37);

’a’..’f’: Result := 16 * Result + (Ord(cTmp) - $57);

else

raise EConvertError.Create(’Geçersiz karakter’);

end;

end;

end;



////////////////WAKE UP FUNC////////////////////

Kod:
procedure WakeUPComputer(ip,tmpst: string);

var Cpt, Cpt1: Byte;

tcnt:integer;

tswake1 :string;

tiwake : integer;

stwake : string;

buff1 : array [1..102] of byte;

Buff:Array[1..6] Of Byte;

begin

form1.StatusBar1.SimpleText:=’WOL is sent to ’+ip;

tcnt:=length(tmpst);

for tiwake:=1 to tcnt do

if (tiwake/2) <> trunc(tiwake/2) then

begin

tswake1:=tmpst[tiwake]+tmpst[tiwake+1];

buff[trunc(tiwake/2)+1]:=(hextoint(tswake1));

end;

Buff1[1] := $FF;

Buff1[2] := $FF;

Buff1[3] := $FF;

Buff1[4] := $FF;

Buff1[5] := $FF;

Buff1[6] := $FF;

for Cpt1 := 1 to 16 do

for Cpt := 1 to 6 do

Buff1[7 + (Cpt1 - 1) * 6 + (Cpt - 1)] := Buff[Cpt];

form1.udp1.ReceiveTimeout:=100;

setlength(stwake,102);

for cpt:=1 to 102 do stwake[cpt]:=chr(buff1[cpt]);

form1.udp1.Send(ip,sizeof(stwake),stwake);

end;



////////////////broadcast adrr func////////////////////

Kod:
function calcbroad(ip,sub:string):string;

var S1,S2,S3,S4:INTEGER;

I1,I2,I3,I4:INTEGER;

begin

S1:=255-STRTOINT(COPY(SUB,1,POS(’.’,sub)-1));

DELETE(SUB,1,POS(’.’,sub));

S2:=255-STRTOINT(COPY(SUB,1,POS(’.’,sub)-1));

DELETE(SUB,1,POS(’.’,sub));

S3:=255-STRTOINT(COPY(SUB,1,POS(’.’,sub)-1));

DELETE(SUB,1,POS(’.’,sub));

S4:=255-STRTOINT(SUB);



I1:=STRTOINT(COPY(IP,1,POS(’.’,ip)-1));

DELETE(IP,1,POS(’.’,ip));

I2:=STRTOINT(COPY(IP,1,POS(’.’,ip)-1));

DELETE(IP,1,POS(’.’,ip));

I3:=STRTOINT(COPY(IP,1,POS(’.’,ip)-1));

DELETE(IP,1,POS(’.’,ip));

I4:=STRTOINT(IP);

calcbroad:=inttostr(i1 or s1)+’.’+inttostr(i2 or s2)+’.’+inttostr(i3 or s3)+’.’+inttostr(i4 or s4);

end;



///////////////////////////////////////////////////

Kod:
procedure TForm1.Button1Click(Sender: TObject);

var C,broad,MAC,ip,sub:string;

i:integer;

S1,S2,S3,S4:INTEGER;

I1,I2,I3,I4:INTEGER;

begin

MAC:=edit1.Text;

broad:=calcbroad(edit2.Text,edit3.Text) ;

udp1.active:=false;

udp1.Port:=strtoint(edit4.Text);

udp1.Active:=true;

//showmessage(broad+’:’+mac);

if length(MAC)=12 then wakeupcomputer(broad,MAC) ELSE SHOWMESSAGE(’ERROR ON MAC’);

udp1.Active:=false;

end;



qqq
HiFi
 
🙂 benim gibi adamlarin işine yarar akınsoft da bu özelik var ama işlevi yok bunla deneyelim birde
 
Test amaçlarıyla yazdığım bir trojanda buna benzer kod kullanmıştım, localde gayet iyi çalışıyordu 🙂
 
Bu demek oluyoki yasa dışı işlerle uğraşıyosan 😀 PC nin Güç kablosunu tamamen çek 😀 bilgisayarı kapatırken 😀
 
Geri
Üst