Programın bellekte hangi adreslere veri yazdığını öğrenme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
esistem
Üye
Mesajlar: 462
Kayıt: 02 Eki 2007 10:22
İletişim:

Programın bellekte hangi adreslere veri yazdığını öğrenme

Mesaj gönderen esistem » 08 Oca 2015 11:21

Merhaba,
Sistemde çalışan herhangi bir programın, bellekte hangi adreslere veri yazdığını öğrenebilirmiyiz?
ReadProcessMemory apisi ile bellekte (ram) istediğimiz bir adresteki veriyi okuyabiliyoruz, fakat benim amacım, sistemde çalışan herhangi bir program hangi adresleri kullanıyor onu öğrenmek ki sadece onun yazdığı verileri okuyabileyim.

rubyzine
Üye
Mesajlar: 14
Kayıt: 06 Eki 2008 03:48

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen rubyzine » 08 Oca 2015 10:12

O fonksiyonla istediğin adresteki veriyi değil, istediğin prosesin bellek alanındaki verileri okuyorsun.

"Reads data from an area of memory in a specified process." : Belirlenmiş bir prosesin hafıza bölgesinden veri okur.
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Muhtemelen aradığın şu:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Kullanıcı avatarı
esistem
Üye
Mesajlar: 462
Kayıt: 02 Eki 2007 10:22
İletişim:

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen esistem » 09 Oca 2015 08:49

Merhaba,
o zaman aslında aradığım şey ReadProcessMemory, zaten bende istediğim bir programın bellek alanındaki verileri okumak istiyorum, fakat seçilen program hangi bellek alanlarını yada alanını kullanıyor onu nasıl öğrenicem? sanırım doğru soru bu olucaktı.

Lord_Ares
Üye
Mesajlar: 1058
Kayıt: 15 Eki 2006 03:33
Konum: Çorlu

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen Lord_Ares » 09 Oca 2015 01:10

Nejat şuraya bir bakmanı isterim. Nette gördüğüm örneklerin bazılarında handle numarasını bildiğin bir uygulamanın bellekteki adreslerini görebiliyorlar. Fikir olması açısından buraya bir göz atmanı tavsiye ederim..http://www.buraktungut.com/delphi-ile-b ... a-ve-yazma

Ek olarak şöyle birşey gördüm lazım olabilir.(Bildiğim kadarıyla aşağıda da dikkat edersen windows her programa pid adresi verir görev yöneticisinde CTRL_DEL tuşları ile programına verilen pid numarasını görebilirsin. Bu numara ilede ramde arayabilir kullandığı adresi görebilirsin)

Kod: Tümünü seç

function MemOku(WindowTitle:string;Adress:integer;BytesToRe ad:dword):integer; //programın pencere basligi, bellek adresi ve kac byte okunacagini bildirin.
//ama fonksiyon burada integer deger dondurur, degisiklikle string deger de donderebilirsin 
var
Namebuf : dword;
WindowName , ProcessId : integer;
HandleWindow : cardinal;
begin
WindowName := FindWindow(nil, pchar(WindowTitle));
Application.ProcessMessages;
If WindowName = 0 then 
begin
MessageDlg('Program açık degil', mterror,[mbOK],0); //
Result:=0;
exit;
end;
GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_VM_READ,False,ProcessId);
ReadProcessMemory(HandleWindow, ptr(Adress), @Namebuf ,8,BytesToRead);
result:=Namebuf;
closehandle(HandleWindow);
end;

rubyzine
Üye
Mesajlar: 14
Kayıt: 06 Eki 2008 03:48

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen rubyzine » 10 Oca 2015 01:25

esistem yazdı:Merhaba,
o zaman aslında aradığım şey ReadProcessMemory, zaten bende istediğim bir programın bellek alanındaki verileri okumak istiyorum, fakat seçilen program hangi bellek alanlarını yada alanını kullanıyor onu nasıl öğrenicem? sanırım doğru soru bu olucaktı.
Evet ReadProcessMemory'la sistemin prosese ayırdığı bellek alanından veri okuyabilirsin. Delphi ile çalışıyorsan nasıl yapılır bilmiyorum, Lord_Ares'in bağlantısı işe yarar görünüyor.

Kullanıcı avatarı
quadr
Üye
Mesajlar: 69
Kayıt: 21 Haz 2003 09:12
İletişim:

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen quadr » 10 Oca 2015 02:55

Makale olarak anlatımlar mevcut.Debugger kullanımı, memory dump, adres kontrolü, context yapısı...

viewtopic.php?f=19&t=28441&p=157671#p157671
viewtopic.php?f=19&t=27060&p=151241#p151241
viewtopic.php?f=19&t=27061&p=151242#p151242

Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...

http://www.tcct.us

Kullanıcı avatarı
esistem
Üye
Mesajlar: 462
Kayıt: 02 Eki 2007 10:22
İletişim:

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen esistem » 14 Oca 2015 01:07

quadr verdiğin videoları izledim, mantık hep aynı, programın kırılması sadece doğru kontrole müdehale ile mümkün.
Yalnız aklıma şu geldi.
hack yad crack konularında pek bilgi sahibi değilim ama anladığım kadarı ile yazdığımız bir program çalıştırıldığında bellekte hep aynı yerleri kullanıyor (Doğrumudur?).
Eğer öyleyse, program her çalıştırıldığında farklı bellek alanını (farklı adresleri) kullanmasını sağlasak kırılmasını engellemiş olmazmıyız?
Mesela verdiğin 2. videoda tvc nin kırılmasında, bellekteki belli adreslerdeki je'leri NOP layıp kontrolu aşmayı sağlıyorsun, önceki satırda yazdığım gibi program her açıldığında farklı adreslerde bu kontrolleri yapsa programı kıramazsın (mıdır acaba?).

Bu arada readprocessmemory benim işimi görecek kod, orası tamam, fakat ben programın o anda hangi bellek adresinden hangi bellek adresine kadar kullandığını nasıl anlıcam? Bunun bir yolu varmıdır?

rubyzine
Üye
Mesajlar: 14
Kayıt: 06 Eki 2008 03:48

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen rubyzine » 14 Oca 2015 02:40

esistem yazdı: hack yad crack konularında pek bilgi sahibi değilim ama anladığım kadarı ile yazdığımız bir program çalıştırıldığında bellekte hep aynı yerleri kullanıyor (Doğrumudur?).
Eğer öyleyse, program her çalıştırıldığında farklı bellek alanını (farklı adresleri) kullanmasını sağlasak kırılmasını engellemiş olmazmıyız?
Mesela verdiğin 2. videoda tvc nin kırılmasında, bellekteki belli adreslerdeki je'leri NOP layıp kontrolu aşmayı sağlıyorsun, önceki satırda yazdığım gibi program her açıldığında farklı adreslerde bu kontrolleri yapsa programı kıramazsın (mıdır acaba?).

Bu arada readprocessmemory benim işimi görecek kod, orası tamam, fakat ben programın o anda hangi bellek adresinden hangi bellek adresine kadar kullandığını nasıl anlıcam? Bunun bir yolu varmıdır?
PE'ler varsayılan bir base adress le derlenirler, ancak başka bir proses daha bu base adresi sistemde almış olabileceği için işletim sistemi PE'nin base adresinde değişiklik yapar. Tabi bunu PE üzerinde değil kendi wrapper'inin veritabanında gerçekleştirir. Yani program tüm makinalarda her zaman aynı base address'den başlamayabilir, ancak bir makinada bir kere çalıştığında muhtemelen hep aynı base adress'e şutlanır. Burada kritik nokta base address'in PE'lerde default gelmesi ama sistemin duruma göre rebase yapabilmesi...

readprocessmemory ile zaten sistemin o proses için ayırdığı sanal hafıza alanına düşüyorsun. Yani senin fonksiyondan aldığın blok tümüyle prosesin bloğudur.

Kullanıcı avatarı
esistem
Üye
Mesajlar: 462
Kayıt: 02 Eki 2007 10:22
İletişim:

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen esistem » 14 Oca 2015 03:52

işte benimde demek istediğim odur, programda öyle bir kod yazmalı ki her başladığında base adresi değiştirebilsin, böylece crack işlemi mümkün olmayacaktır (en azından jump lara müdehale edilemeyecektir). Böyle bi kod mümkün değilmidir?

bu arada readprocessmemory ile alakalı her defasında 1024 byte okuyan bir örnek paylaşmanız mümkünmüdür ?

Kullanıcı avatarı
esistem
Üye
Mesajlar: 462
Kayıt: 02 Eki 2007 10:22
İletişim:

Re: Programın bellekte hangi adreslere veri yazdığını öğrenm

Mesaj gönderen esistem » 14 Oca 2015 05:33

Tekrar selam,
Programın kullandığı bellek alanını okumayı sonunda başardım, test için bir proje hazırlayıp onun bellek alanını okuttum, proje 390 KB civarı, okunan alan 3,9 MB civarı, programlar dehşet bellek alanı harcıyor onuda öğrenmiş oldum :) Zira asıl okutmak istediğim programın bellek alanını okuyunca bu işten vazgeçtim, chrome de çalışan bir flash dosyanın bellek alanını okumak için yapmak istemiştim fakat okutunca 400 MB civarı veri geldi, buda bana yetti :)

Cevapla