Delphi Can

Orjinalini görmek için tıklayınız: [ÇÖZÜLDÜ] Resource - Uygulama Üzerinden Veri Gömme
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Herkese selamlar!

Bir fikir doğrultusunda şu anda sadece nasıl yapılır soruları ile aklımı bulandırdığım bir konu hakkında size soru sormam gerektiğini farkettim. Yapmak istediğim şey şu;

Ana ve yavru olmak üzere 2 uygulama yazdığınızı düşünün. Ana uygulama yavru uygulamanın içinde ki bir değeri değiştirecek. Tabi değiştirilen değer gömülü kalacak. Ben ana uygulamanın içine gömülü olan bir varsayılan yavru uygulama ekleyebileceğimi düşündüm. Sonrasında bu uygulamanın belirli bir(ProgramID olarak düşünebilirsiniz) bölümünü nasıl değiştirebilirim(Sadece sayısal bir alan)?

Özetle;

1-) Gömülü bir exe içinde ki, bir public değerli sayısal veri gömülü kalacak şekilde nasıl değiştirilir?


Kaynak olur, bir kelime olur herşeye açığım Smile


Teşekkürler,
Saygılarımla.
Merhabalar,

Çok fazla tecrübem olmamasına rağmen, fikir verebileceği ümidi ile.
Resource ile işlem yapılabilir mi ? LİNK

Saygılar.
cheat engine isimli yazılıma bir bakın. Sizin istediğinizden çok daha fazlasını yapıyor.
Üretici delphi kaynak kodlarını sitesinde paylaşmış.
https://www.cheatengine.org/
@hi_selamlar üstat teşekkür ederim işime kesin yarayacaktır inceledim kaynaklar arasına ekledim. <3

@canbir üstat cheat engine unutmuşum uzun zamandır oyun oynamayınca Smile teşekkürler kesin işime yarayacak kaynaklardan biri <3
Sorunu çözdüm herkese teşekkürler. Tabi ki örnek yapıp buradan paylaşacağım. İnşaAllah kafamda ki fikir çalışır.
Sorunu çözdük de unuttuğumuz bir şey var nasıl anlatacağım? Ben olaya giriyorum artık ne kadar anlatabilirsek. 


Öncellikle bu olay için Windows API'lerinden olan UpdateResource ve EndUpdateResource adlı API'leri kullanacağız.

Child Application:

Bu aplikasyona önceden hazırlamış olduğumuz resource dosyasını gömüyoruz. Gömme işlemini başarılı bir şekilde tamamladıktan sonra artık bu Child aplikasyon ile işimiz kalmıyor. Sadece gömdüğünüz resource dosyası içinde ki dosya adı önemli.

Ben adını DEGER koydum.

Ana Application:

Bu aplikasyon da ise belirtmiş olduğum Windows API'lerinden yaralanacağız. Aşağıya kodu bırakayım sonra açıklayayım. 

procedure TForm1.Button2Click(Sender: TObject);
type
 TBuffer = array[0..0] of Byte;
 PBuffer = ^TBuffer;
var
 FS: TFileStream;
 ResHandle: THandle;
 DataLe: DWord;
 Data: PBuffer;
begin
 ResHandle := BeginUpdateResource(pChar(ExtractFilePath(Application.ExeName)+'ChildApp.exe'), False);

 FS := TFileStream.Create('DEGER.txt', fmOpenRead);
 FS.Seek(0, soFromBeginning);
 DataLe := FS.Size;
 GetMem(Data, DataLe);
 FS.Read(Data^, DataLe);
 FS.Free;
  
 UpdateResource(ResHandle, RT_RCDATA, pChar('DEGER'), LANG_SYSTEM_DEFAULT, Data, DataLe);
 EndUpdateResource(ResHandle, False);
end;


If, Free gibi olayları yazmadım özet niteliğinde olduğu için kapsamlı bir örnek daha sonrasında yapmayı düşünüyorum. Şimdi olayımıza dönelim. İlk olarak ResHandle değişkeni ile BeginUpdateResource API yardımı ile proje yolumuzu(Resource update olacak uygulama) belirtiyoruz. Sonrasında FS (TFileStream) değişkenimizi TFileStream sınıfı olarak oluşturuyoruz. "DEGER.txt" dosyası bizim içeriye göndermeyi planladığımız dosya içeriği. Bu dosya içinde yazan değeri biz DEGER olarak kaydettiğimiz Child aplikasyondaki değer ile değiştireceğiz. DataLe değişkeni dosyamızın büyüklüğünü, Data değişkeni ise dosyamızı memory içine alıyor. Sonrasında FS.Free ederek FS değişkeninden kurtuluyoruz(Çünkü artık DataLe ve Data adlı değişkenlere atandı gerekli bilgiler.). UpdateResource  API'si ile gerekli atamaları yapıyoruz. API içinde gördüğünüz "pChar('DEGER')" bölümü bizim önceden koyduğumuz isim; hani güncelleyeceğimiz. 

Devam ediyorum...

Sonrasında EndUpdateResource  API'si ile Update işlemini sonlandırıyoruz. Bu kadar...

ResourceHacker adlı uygulama ile değişikliği görebilirsiniz. Biliyorum biraz karışmış olabilir; sorun yaşarsanız buradayım ben Big Grin

Saygılarımla,
Halil Han Badem.
Teşekkürler.
(08-05-2018, Saat: 23:11)hyperxman Adlı Kullanıcıdan Alıntı: [ -> ]Sorunu çözdük de unuttuğumuz bir şey var nasıl anlatacağım? Ben olaya giriyorum artık ne kadar anlatabilirsek. 


Öncellikle bu olay için Windows API'lerinden olan UpdateResource ve EndUpdateResource adlı API'leri kullanacağız.

Child Application:

Bu aplikasyona önceden hazırlamış olduğumuz resource dosyasını gömüyoruz. Gömme işlemini başarılı bir şekilde tamamladıktan sonra artık bu Child aplikasyon ile işimiz kalmıyor. Sadece gömdüğünüz resource dosyası içinde ki dosya adı önemli.

Ben adını DEGER koydum.

Ana Application:

Bu aplikasyon da ise belirtmiş olduğum Windows API'lerinden yaralanacağız. Aşağıya kodu bırakayım sonra açıklayayım. 

procedure TForm1.Button2Click(Sender: TObject);
type
 TBuffer = array[0..0] of Byte;
 PBuffer = ^TBuffer;
var
 FS: TFileStream;
 ResHandle: THandle;
 DataLe: DWord;
 Data: PBuffer;
begin
 ResHandle := BeginUpdateResource(pChar(ExtractFilePath(Application.ExeName)+'ChildApp.exe'), False);

 FS := TFileStream.Create('DEGER.txt', fmOpenRead);
 FS.Seek(0, soFromBeginning);
 DataLe := FS.Size;
 GetMem(Data, DataLe);
 FS.Read(Data^, DataLe);
 FS.Free;
  
 UpdateResource(ResHandle, RT_RCDATA, pChar('DEGER'), LANG_SYSTEM_DEFAULT, Data, DataLe);
 EndUpdateResource(ResHandle, False);
end;


If, Free gibi olayları yazmadım özet niteliğinde olduğu için kapsamlı bir örnek daha sonrasında yapmayı düşünüyorum. Şimdi olayımıza dönelim. İlk olarak ResHandle değişkeni ile BeginUpdateResource API yardımı ile proje yolumuzu(Resource update olacak uygulama) belirtiyoruz. Sonrasında FS (TFileStream) değişkenimizi TFileStream sınıfı olarak oluşturuyoruz. "DEGER.txt" dosyası bizim içeriye göndermeyi planladığımız dosya içeriği. Bu dosya içinde yazan değeri biz DEGER olarak kaydettiğimiz Child aplikasyondaki değer ile değiştireceğiz. DataLe değişkeni dosyamızın büyüklüğünü, Data değişkeni ise dosyamızı memory içine alıyor. Sonrasında FS.Free ederek FS değişkeninden kurtuluyoruz(Çünkü artık DataLe ve Data adlı değişkenlere atandı gerekli bilgiler.). UpdateResource  API'si ile gerekli atamaları yapıyoruz. API içinde gördüğünüz "pChar('DEGER')" bölümü bizim önceden koyduğumuz isim; hani güncelleyeceğimiz. 

Devam ediyorum...

Sonrasında EndUpdateResource  API'si ile Update işlemini sonlandırıyoruz. Bu kadar...

ResourceHacker adlı uygulama ile değişikliği görebilirsiniz. Biliyorum biraz karışmış olabilir; sorun yaşarsanız buradayım ben Big Grin

Saygılarımla,
Halil Han Badem.

Geri bildiriminiz ve paylaşımınız için teşekkürler.