Gercekten ilgi cekici...

Wake On Lan - Kapalı Bir Bilgisayarı Lan’dan Uyandırma
Kapalı Bir Bilgisayarı Uyandırma

Wake on LAn nedir? Wake on Lan (wol) adından da anlaşılacağı gibi bir PC’yi
network uzerinden acmak icin data packetinin gonderilmesidir




Daha da acarsak kısaca şoyel denebilir. Bir networkunuz var ve makinalrı gece acıp bişiler yuklemek istiyosunuz ki sabah tum kullanıcılarda guncel yazılımlar olsun. mesela antivirus updateleri gibi...

İşte bu sebeple herhangi bir PC’ye gonderilen ozel bir data paketi sayesinde makinaları acabilirsiniz. Yukleme isi ise ozel bir tool ile yapılabilir tabiki... Şimdi teknik detaylaroına bakalım..

Bir PC’yiuzaktan acabilmek icin oncelikle o PC de bir ethernet kartı olmalı ve networke bağlı olması gerekmektedir. Bundan sonra ise O ethernet kartının WoL ozelliğinin olması ve biostan enable hale getirilmiş olması gerekmektedir. Ethernet Kartı eğerki onboard değil ise 3 pinli konnektorunun anakarta bağlı olması da gerekmektedir. Tumleşik karlarda buna zaten gerek olmamaması da normaldir

Neyse buraya kadar donanımsal kısımdı. Şimdi ise wol packetinden bahsedelim. Oncellikler wakeonlan paketi UDP pakettir. Yani boyle bir paketi kolaylıkla kendinizde oluşturabilirsiniz. Elinizde sadece UDP komponenti olması yeterli. şimdi de paketin icinden bahsedelim.
Bu paket cok basit ve toplam 102 byte’lıktır.
format ise şoyledir.

ilk 6 byte "FF" leden oluşur geri kalan ise acılacak bilgisayarın MAC adresinin 16 kez tekrarlanması ile oluşur.
MAC adresimiz 11h 22h 33h 44h 55h 66h olsun. paket şoyle olur.

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şteee 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 acılır...

Şimdi broadcast ne demek? gidecek paketi ip adresi olarak 255.255.255.255 e yollamak demek bu paketin broadcast olduğu anl***** gelir. yani bu paket, paketin yolladnığı segmentteki her yere gider fakata routerdna gecemez ve orda kalır. yani başka segmentteki makinayı acamazsınız..

Bu işi aşmak icin directed broadcast kulllanılarbilir. directed broadcast kısaca şole 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 networkundeki makinanın 192.168.1.0 daki bir makinayı acması icin 255.255.255.255 paketi gondermesi 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 gondermek gerekir.

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



Burada da delphi de yazılmış bazı kodlar var.
bu iş icin forma 4 tane label, 4 tane edit box, 1 status bar, 1 bitbtn ve 1 tane da indy UDP client koymanız gerek. )


1nci edit box MAC adresi
2nci edit box tahmini makinanın ip adresini
3ncu edit box subnet maskını
4ncu remottaki gidilecek ise port numarası.

arkadaşlar bu işlemin calışması icin 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ı..

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

public

end;

var
Form1: TForm1;

implementation



////////HEX TO INT////////////////
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(’Gecersiz karakter’);
end;
end;
end;

////////////////WAKE UP FUNC///////////////////
procedure WakeUPComputer(ip,tmpst: string);
var Cpt, Cpt1: Byte;
tcnt:integer;
tswake1 tring;
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///////////////////
function calcbroad(ip,subtring)tring;
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;

//////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var C,broad,MAC,ip,subtring;
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;


Kolay Gelsin

__________________