Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
KO Developers Platformuna Hoşgeldin!
KODevelopers

ASM in C++ Dll Cağırma Hk.

Önerilen Mesajlar

C++ Dll için __Asm Ko.exe Şekilde nasıl çağırabilirim.

Böyle şekilde Hatası alıyorum 3A99 diye 10 sayısı falan diyo görmedim.

Örnek verebilcek Var mı.


void UskoPaket::KOPort(BYTE* ptrPacket, SIZE_T tsize)
{
DWORD ADDR = 0x004998B0;
DWORD sSize = tsize;
_asm
{
PUSH ECX
MOV ECX,DWORD PTR DS:[0x00CCC90C]
PUSH 3A99
PUSH EAX
PUSH ECX
MOV ECX,DWORD PTR DS:[0x00E21B44]
PUSH sSize
PUSH ptrPacket
CALL ADDR
}
}


ASM Port için 15001 dir.


004C92CD |. 68 993A0000 PUSH 3A99
007DD428 |. 68 993A0000 PUSH 3A99



004C92C6 |> 51 PUSH ECX ; /Arg4
004C92C7 |. 8B0D 0CC9CC00 MOV ECX,DWORD PTR DS:[CCC90C] ; |
004C92CD |. 68 993A0000 PUSH 3A99 ; |Arg3 = 00003A99
004C92D2 |. 50 PUSH EAX ; |Arg2
004C92D3 |. 51 PUSH ECX ; |Arg1 => 00000000
004C92D4 |. 8B0D 441BE200 MOV ECX,DWORD PTR DS:[E21B44] ; |
004C92DA |. E8 D105FDFF CALL KnightOn.004998B0 ; \KnightOn.004998B0



007DD420 |. 8D8424 BC01000>LEA EAX,DWORD PTR SS:[ESP+1BC]
007DD427 |. 50 PUSH EAX
007DD428 |. 68 993A0000 PUSH 3A99
007DD42D |. E8 3E081600 CALL KnightOn.0093DC70


Yardımı edicek biri olsa için Teşekkürler. :ok:

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Verdiğim kodlar ile konu başlığı yada istediğin şey arasında hiçbir bağlantı yok. Tam olarak ne yapmak istiyorsun?


Merhaba EveryBodyFool Dll ko.exe Çağırması C++ Dll. üzerine bağlamak istedim port kullandıgımız 3A99 = 15001 bende değiştirmek istiyorum.. AAAA = 43690 Kullanması istiyorum.
-- mesaja ek olarak --
Alıntı
0x3A99 yapacaksın.


Teşekkür ederim Dikkatli çekmedim 0x3A99 15001 Port kullanıyo fakat değiştirmek istiyorum. 0xAAAA 43690 Nasıl şekil yapabilirim.

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Sanırım ko exedeki 15001 portunu dll bağlayıp kullanmak istiyorsun


evet.. Ko.exe de suan ki 15001 0x3A99 yeni port koymak istiyorumda 0xAAAA 43690 böyle yapması lazım.

İletiyi paylaş


Link to post
Sitelerde Paylaş

zamanında böyle bir konu vardı arşivlemiştim işine yararmı bilmem.

Evet arkadaşlar, bugün birçok kişinin aklında soru işareti olan bir konuyu daha aydınlatmaya çalışacağım. İşe en basit kavramlardan başlayalım ve mantığını iyice anlayalım.

Bir compiler tarafından derlenmiş olan herhangi bir çalıştırılabilir dosya(.exe) veya Dynamic Load Library(.dll) işlemcinin anlayacağı dilin bir üst seviyesine yani ASM diline dönüştürülür. ASM dilinde kod satırları programın açılış anından itibaren sırayla ve tek tek yürütülür. Programın açılışındaki ilk ASM koduna entry point yani giriş noktası ismini veriyoruz. Her programlama dlinde olduğu gibi ASM dilinde de operatörlerimiz mevcut. Şimdilik ihtiyacımız olanlara bir göz atalım;

MOV komutu : Kopyalama ve Değer atamada kullanılır.

Örnek : MOV EAX,ECX (EAX değişkenine ECX'te tutulan değeri atadık.)

ADD komutu : Adından da anlaşılabileceği üzere toplama işleminde kullanılan komuttur.

Örnek : ADD AL,2 (AL değişkenine 2(hex) değerini ekler)

SUB komutu : Çıkartma işlemi yapmak için kullanılır.

Örnek : SUB AX,2 (AX değişkeninden 2 çıkartır)

INC komutu : Değeri bir arttırmaya yarar.

Örnek : INC AX (AX registerindeki değeri bir arttırır)

JMP komutu : Belirli bir satıra atlamayı sağlar.

Örnek : JMP 00768080 (768080 satırına atlar.)

CALL komutu : Bir alt program parçacığını başlatır.

Örnek : CALL 0046A080 (46A080'deki program parçacığı başlar)

NOP komutu : NO OPERAND anlamına gelir. İşlemci bu satırı pas geçer. Bu kısımları programa ek işlemler yaptırmak için düzenleyebiliriz.(İleride değinicem.)


Şimdilik bu kadarını bilmeniz yeterli. Daha detaylı bilgi için ASM derslerini izleyebilirsiniz.


Evet, gelelim ihtiyacımız olan programlara. Eğer yamayı uygulayacağımız exe bir packer tarafından packlenmişse, ilk önce unpack etmemiz gerekiyor. Exenin packli olup olmadığını Peid programı ile analiz edebilirsiniz. Ve tabiki de piyasanın en sağlam debuggeri olan OllyDbg'ye ihtiyacımız var.

Sıradaki adımlara geçmeden önce Packing ve Unpacking kavramlarından bahsedicem. Packing(yani paketleme) çalıştırılabilir bir dosyayı veya dll'yi, boyutunu küçültmek veya koruma amaçlı olarak 3. parti bir yazılım ile işlemektir. Yazılım dünyasında kullanılan popüler packer programlarına UPX, ASPack/ASProtect, Molebox, Themida v.b örnek gösterilebilir. Packerlar yazmış olduğunuz programı debug programlarına, cracking işlemlerine vs. korumalı hale getirme amacındadır. Mantığı sıkıştırma ve EP(Entry Point) değiştirme işlemine dayanmaktadır. Unpackerlar ise packerlar vasıtasıyla paketlenmiş uygulamaları orjinal yani korumasız hallerine getirmek üzere yazılmış Reverse Engineering programlarıdır. Genellikle crackerlar tarafından kodlanırlar. Bunların mantığında da programın orjinal giriş noktasını bulup korumalı kısımdan ayıklamak yatar.

Peid ile exemizi analiz ettik, benim EXE'm ASProtect ile koruma altına alınmış. USKO'nun tüm sürümlerinde bu koruma mevcut. Gelelim bu korumayı nasıl aşacağımıza. Yukarıda verdiğim Stripper paketini indirin ve bir klasöre çıkartın. Klasörde 3 adet Stripper sürümü mevcut, biz 2.07'yi kullanacağız. Aşağıdaki adımları sırasıyla izleyin.

(DN : Eğer exeniz packli değilse bu adımları atlayın.)


Stripper 2.07'yi başlatın ve ardından Open tuşuna basın.

Gelen pencereden Packli olan usko exenizi seçin.

Ve ardından sağ taraftaki unpacking butonuna basın. Exemiz sorunsuz bir şekilde unpacklenirse resimdeki gibi successfull yazısını göreceksiniz. KnightOnLine.exe'mizin packsiz hali _KnightOnLine.exe adıyla clientimizin bulundugu klasöre kaydedildi. Artık önümüzde hiçbir engel kalmadığına göre, işimize dönebiliriz

Anlatıma geçmeden önce biraz daha ASM'den bahsetmek istiyorum. Konunun başında da bahsettiğim gibi, ASM kod satırları sırasıyla ve teker teker işlenir. Bu kod satırlarının işlemeye başladığı yere Entry Point yani giriş noktası denir. Bizim amacımız oyun exesi açılmadan önce DLL'mizi yüklemek olduğuna göre yapacağımız işlem entry point'ten önce bir kod yordamı ile dll'mizin yüklenmesini sağlamak olacaktır.

Gelelim bunu nasıl yapacağımıza. İlk iş olarak indirmiş olduğumuz OllyDbg programımızı bir klasöre çıkartıp açalım. Karşımıza 3 kısımdan oluşan boş bir pencere geldi, bu pencerenin adı CPU penceresi. Şimdi unpacklemiş olduğumuz _KnightOnLine.exe'yi(veya zaten unpackli exeye sahip olanlar için KnightOnLine.exe) Ollydbg ekranına sürükleyelim. Ben bu örnekte 1483 unpackli exe kullandım.(daha önceden xtrap'ını vs.temizlemiştim.)

KnightOnLine.exe'mizin debug edilmiş hali olly ekranında göründü. Şimdi ne yapacağız? İlk iş olarak daha önceden bahsetmiş olduğum EP'yi bulmamız lazım. Bunu yapmak içinse olly penceresine sağ tıklayın ve Search For -> All intermodular calls yolunu takip edin.

Bu kısımda gördükleriniz windows API'lerine atılan çağrı komutlarıdır. Bu pencerede aramamız gereken API kernel32.GlobalMemoryStatus. Oyun ekranımız açılmadan önce kernel32.GlobalMemoryStatus API'si kullanılarak bellek ile ilgili bazı işlemler yürütülür.(boş ram durumu vs.) Eğer bu API'ye giden CALL'ın adresini bulursak, exemizin giriş noktasını da bulmuş oluruz.

Intermodular calls penceremizde kernel32.GlobalMemoryStatus'ü bulduk.Resimde gördüğünüz gibi, benim kernel32.GlobalMemoryStatus call'ım 76ED45 adresindeymiş. Şimdi bu adrese çift tıklayarak debug penceresinde yerini buluyoruz.

Resimde gördüğünüz gibi CALL'ımız burda. Scroll bar'ı biraz daha yukarıya kaydırıyoruz taa ki NOP'larla dolu bir boşluk bulana kadar.



Evet, bahsettiğim yere geldik. Benim exemde PUSH -1 satırı yani 76EC30 adresi giriş noktası. Bulduğunuz adresi bir kenara not edin, ileride ihtiyacımız olacak. Giriş noktamızı bulduk, şimdi ne yapmalıyız?



Biraz önce bahsetmiştim, dll'mizi yüklemek için giriş noktamızdan önce ufak kod değişiklikleri yapmamız lazım diye. Önce dllmizi yüklemek için ihtiyacımız olan kod bloguna bir göz atalım.



Kod:
PUSHAD

PUSH "dll adının tutulduğu adres"

CALL DWORD PTR DS:[kernel32.loadlibrarya fonksiyonu adresi]

POPAD

JMP "exe giriş noktası adresi"



ASCII "loader.dll"


Şimdi, gördüğünüz üzere yukardaki kod blogu, giriş noktamızın üzerindeki nop'ların bellek alanına sığabilecek küçüklükte değil. O yüzden bu kod bloğu için daha geniş NOP veya DB00'ların bulunduğu uygun bir yer bulmalıyız. Bu uygun yere biz Code Cave adını veriyoruz. Code cave'mizi bulmadan önce DLL'mizi yükleyecek olan Kernel32.LoadLibraryA fonksiyonunun adresini bulmamız lazım. Bi bakalım nerdeymiş ..







Bunu yapmak için de ilk başta yaptığımız gibi Sağ Tık -> Search for -> All intermodular calls diyoruz ve çıkan sonuçlardan herhangi bir Kernel32.LoadLibraryA API'sini seçip çift tıklıyoruz ve seçili gelen adrese sağ tıklayıp assemble diyoruz.







Resimde seçili olarak gösterdiğim kısım kernel32.loadlibraryA api'sinin adresi, bunu bir köşeye not ediyoruz. Scrollbar'ı exe'nin son kısımlarına doğru kaydırıyoruz ve uygun boyutta bir DB00 yığını buluyoruz.







Şimdi herhangi bir adresi seçip kodlarımızı yerleştirmeye başlayalım. Ben 7E4FAF adresinden itibaren kodları yerleştirmeye başlıyorum. İlk önce DLL adımızı içeren ASCII değerini Code Cave'mize yazalım.







Uygun boyutta bir DB00 bloğunu seçili hale getirin ve sağ tık -> Binary -> Edit yolunu izleyin. Gelen pencerede ASCII kısmına yükleyeceğimiz DLL'nin adını gireceğiz.

Ben loader.dll koydum, siz istediğiniz adı verebilirsiniz. Dll adımızı yazdıktan sonra ok'a basıyoruz.


DB00 larımız Resimde kırmızıyla görünen kısım gibi karman çorman bir hali alacaktır, ASCII kodumuzun düzgünce görünmesi için exemizi yeniden analiz etmemiz gerekiyor, bunun içinse ctrl-a tuşuna basmanız yeterli.


Eğer herşey yolunda gittiyse ASCII değerimiz resimdeki gibi sorunsuz bir şekilde görüntülenecektir. ASCII değerimizi adresimize yerleştirdik, sırada dll'mizi yükleyecek olan kod blogunu yerleştirmek var.



Kod:
PUSHAD

PUSH "dll adının tutulduğu adres"

CALL DWORD PTR DS:[kernel32.loadlibrarya fonksiyonu adresi]

POPAD

JMP "exe giriş noktası adresi"

Bunun için yine boş bir DB00 adresini seçili hale getirin ve sağ tık -> assemble yolunu izleyin. Kod bloğumuz PUSHAD komutu ile başlıyor, gelen Assemble kutusuna PUSHAD yazın ve Assemble tuşuna basın. PUSHAD komutu adrese işlenecektir ve imleç otomatikman bir satır alta kayacaktır. Bir sonraki komutumuz PUSH "dll adının tutulduğu adres" ti. Daha demin ASCII kodunu girdiğimiz bellek adresini hatırlayalım. Benimki 7E4FAF'ydi. O zaman komutumuz şu şekilde olacak : PUSH 7E4FAF. Bu komutumuzu da yerleştirdikten sonra bir sonraki komutumuz dll'mizi yükleyecek olan LoadLibrary apisini çağıracak satırımız -> CALL DWORD PTR DS:[kernel32.loadlibrarya fonksiyonu adresi] , daha önceden bulmuş olduğumuz kernel32.loadlibrarya adresini köşeli parantezlerin arasına yazıyoruz.Kodumu CALL DWORD PTR DS:[7E5218] olarak düzenliyorum ve Assemble tuşuna basıyorum. Eveet. DLL'miz artık yüklendi, ama bir problemimiz var. ASM satırı olarak exe'nin sonlarındayız. DLL'mizi yüklediğimize göre artık giriş noktamıza geri dönebiliriz. Bunun içinse JMP komutunu kullanacağız. En başta not ettiğimiz giriş noktası adresimizi JMP kodumuzun yanına yazıp Assemble tuşuna basıyoruz. Benim giriş nokta adresim 76EC30 olduğuna göre komutum da JMP 76EC30 olmalı. Eğer herşeyi doğru bir şekilde yaptıysanız Code Cavemiz şu şekilde görünmeli ;


Evet. Exemize ASM yamamızı uyguladık. Son bir işimiz kaldı, oyunumuza girmeden önce exe'mizi hazırladığımız code cave'ye yönlendirmemiz lazım. Code cave'mizin başlangıç adresini yani PUSHAD komutunun bulunduğu adresi bir kenara not edin. Daha sonra Ctrl-g tuşuna basarak exenizin giriş noktasının adresini girin ve ok tuşuna basın. Giriş noktamıza geldik, Burada da ufak bir nop blogu vardı hatırlıyorsanız, bu nop blogundan herhangi bir adresi seçin ve assemble tuşuna tıklayın. Gelen kutucuga JMP PUSHADADRESİ şeklinde ASM kodunuzu girin. Benim Code Cave'min başladığı adres 7E4FBD, o halde yazmam gereken ASM kodu JMP 7E4FBD. ASM ile işimiz bitti, yaptığımız değişiklikleri kaydetmemiz lazım. Bunun içinse Sağ tık-> Copy to Executable - > All Modifications yolunu izliyoruz. Gelen pencereden Copy All'ı seçiyoruz ve Karşımıza bir pencere daha geliyor. Bu pencerede de sağ tık yaparak Save File diyoruz ve dosyamızın yeni adını yazarak kaydediyoruz.

ALINTIDIR

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
zamanında böyle bir konu vardı arşivlemiştim işine yararmı bilmem.

Evet arkadaşlar, bugün birçok kişinin aklında soru işareti olan bir konuyu daha aydınlatmaya çalışacağım. İşe en basit kavramlardan başlayalım ve mantığını iyice anlayalım.

ALINTIDIR


Off efsame len temelleri zorladım bi bakayim. anlamayı çalışayim. teşekkür ederim. Ellerine sağlık.

İletiyi paylaş


Link to post
Sitelerde Paylaş

×
×
  • Yeni Oluştur...