[Assembly(X86)] Resource Çıkartma (?)
-
Assembly ile Exe nin rsrc bölümündeki bir dosyayı nasıl dışarı çıkartabilirim? (NOT: Başka uygulamanın değil kendi exe sinin.
-
Şunu bi dene baba:
http://www.at4re.com/download.php?view.135
Caliber tarafından 02/Oca/13 20:27 tarihinde düzenlenmiştir
-
Sorunu yanlış anlamadıysam reshacker işini görür.
-
Sistem servislerini kullanmadan yapamazsın hocam, internette assembly öğreten dökümanlar dos zamanından kalma ve 8086 dökümanları olduğu için assembly tek başına herşeyi yapar gibi bir izlenime kapılıyor okuyanlar, o zamanlar öyleydi int 21h ile yapılamayacak şey yoktu.
Hangi apileri kullanman lazım? sırayla, FindResource -> LoadResource -> SizeofResource -> LockResource -> (burada bellek elinde istediğini yap) -> FreeResource.
Assembler olarak nasm öneririm ama malesef linkeri yok, eğer bilgisayarında mingw (devc++ la da geliyor eski bir sürümü) ya da visual C++ varsa onların linkerini kullanabilirsin, ben öyle yapıyorum. Yoksa mecbur masm32 indireceksin ki hiç haz etmem kendisinden. Nasm tek başına 700kb lik bir exeden ibaretken bu tüm dünyayı kurar bilgisayara (inc ler lib ler vs).
-
Tugberk bunu yazdı
Sistem servislerini kullanmadan yapamazsın hocam, internette assembly öğreten dökümanlar dos zamanından kalma ve 8086 dökümanları olduğu için assembly tek başına herşeyi yapar gibi bir izlenime kapılıyor okuyanlar, o zamanlar öyleydi int 21h ile yapılamayacak şey yoktu.
Hangi apileri kullanman lazım? sırayla, FindResource -> LoadResource -> SizeofResource -> LockResource -> (burada bellek elinde istediğini yap) -> FreeResource.
Assembler olarak nasm öneririm ama malesef linkeri yok, eğer bilgisayarında mingw (devc++ la da geliyor eski bir sürümü) ya da visual C++ varsa onların linkerini kullanabilirsin, ben öyle yapıyorum. Yoksa mecbur masm32 indireceksin ki hiç haz etmem kendisinden. Nasm tek başına 700kb lik bir exeden ibaretken bu tüm dünyayı kurar bilgisayara (inc ler lib ler vs).
Aradığım cevap buydu teşekkürler.
Şimdi sana soracağım şey şu abi; Native Assembly yani ollydbg ile disassemble edilen exe ye bu API ları kullanarak kendi içerisinde bulunan resource dosyasını nasıl çıkarırız?
Findresource gibi bir sıra vermişsin tam olarak kullanımı var mıdır acaba?
-
Caliber,
pcdoktor636 Teşekkürler yardımlar için, bir önceki mesajımı okuyup daha fazla yardımcı olabilirsiniz.
-
Hocam C ile kullanımı aşağıda, hata kontrolünü es geçtim,
HMODULE hModule = GetModuleHandle(NULL); HRSRC hResource = FindResource(hModule, "NAME", "TYPE"); HGLOBAL hMemory = LoadResource(hModule, hResource); DWORD dwResSize = SizeofResource(hModule, hResource); LPVOID lpResMem = LockResource(hMemory); // Burada artık resource lpResMem de boyutu da dwResSize da FreeResource(hResource);
Nasm ile api çağırmak çok basittir tek sorun link etmek için C derleyicisi yüklü olması lazım bilgisayarında.
Apiyi çağırırken _FindResource@8 olarak yazman gerekiyor __stdcall fonksiyonları bu şekilde görünür dll de, @ den sonrası parametre uzunluğu, 2 parametre alan fonksiyon için 8, parametre türü 4 bayttan farklı olabilir dikkat etmek lazım, neyseki api bulunamazsa linker hata verir zaten.
Nasm ile MessageBox kullanımı için küçük bir kod göstereyim, geri kalan hepsi aynı zaten.
[bits 32] extern _MessageBoxA@16 extern _ExitProcess@4 global _entry section .data mesaj db "selam moruk", 0x0 baslik db "nabersin", 0x0 section .text _entry: push 0 push baslik push mesaj push 0 call _MessageBoxA@16 push 0 call _ExitProcess@4
extern, bu fonksiyonlar dışardan gelcek demek, .data sectionunda yazılacak stringler var, bunları ters sırada push ediyoruz ve call ile apiyi çağırıyoruz, en son ExitProcess(0) ile çıkıyoruz.
Derlemek basit:
nasm kod.asm -f win32
sorun yoksa kod.obj çıkar, bundan sonrası link, mingw kullanıyorsan ,
C:\MinGW\bin\ld.exe kod.obj -e entry -subsystem windows -lkernel32 -luser32 -o kod.exe
aVisual C++ kullanıyorsan malesef link.exe direkt çalışmıyor dll bağımlılıkları current directory muhabbetleri yüzünden, visual studio tools klasöründe command prompt var cmd.exe simgesinde yine, onu çalıştır obj dosyasının olduğu dizine git, link.exe çalıştırılabilri bu şekilde.
link kod.obj kernel32.lib user32.lib /entry:entry /subsystem:windows
İki durumda da kod.exe çıkacak, bu kadar. Bence mingw yi indir kur, nasm ı da indir, C:\MinGW\bin klasörüne at, bu klasörü de path a ekle, masaüstünde rahat rahat çalış. Asm ile devam etmek istiyorsan tabi, şu sözü hep söylerim :)
"C# ile yapabileceğin şeyler için değil C ile bile yapamayacağın şeyler için assembly kullan"
aksi halde faydasından çok zararını görürsün, kolay gelsin
-
Tuğberk yine döktürmüş. Döküman niteliğinde cevap vermiş teşekkür ediyorum kendisine ileride benimde işime yarayacak bir cevap açıkçası. Birde tuğberk x86 için assembly öğrenmek istiyorum. Bunun için önerebileceğin döküman var mı acaba? Türkçe olursa daha iyi olur. Kitapta olabilir açıkçası.
-
Teşekkürler hocam bildiğim en iyi kaynak bu, türkçe olarak, derneğin kurs notları, ben de bu kursta gördüm ilk kez zaten.
http://www.kaanaslan.com/resource/document/download_file.php?file_id=18
-
Tugberk bunu yazdı
Hocam C ile kullanımı aşağıda, hata kontrolünü es geçtim,
HMODULE hModule = GetModuleHandle(NULL); HRSRC hResource = FindResource(hModule, "NAME", "TYPE"); HGLOBAL hMemory = LoadResource(hModule, hResource); DWORD dwResSize = SizeofResource(hModule, hResource); LPVOID lpResMem = LockResource(hMemory); // Burada artık resource lpResMem de boyutu da dwResSize da FreeResource(hResource);
Nasm ile api çağırmak çok basittir tek sorun link etmek için C derleyicisi yüklü olması lazım bilgisayarında.
Apiyi çağırırken _FindResource@8 olarak yazman gerekiyor __stdcall fonksiyonları bu şekilde görünür dll de, @ den sonrası parametre uzunluğu, 2 parametre alan fonksiyon için 8, parametre türü 4 bayttan farklı olabilir dikkat etmek lazım, neyseki api bulunamazsa linker hata verir zaten.
Nasm ile MessageBox kullanımı için küçük bir kod göstereyim, geri kalan hepsi aynı zaten.
[bits 32] extern _MessageBoxA@16 extern _ExitProcess@4 global _entry section .data mesaj db "selam moruk", 0x0 baslik db "nabersin", 0x0 section .text _entry: push 0 push baslik push mesaj push 0 call _MessageBoxA@16 push 0 call _ExitProcess@4
extern, bu fonksiyonlar dışardan gelcek demek, .data sectionunda yazılacak stringler var, bunları ters sırada push ediyoruz ve call ile apiyi çağırıyoruz, en son ExitProcess(0) ile çıkıyoruz.
Derlemek basit:
nasm kod.asm -f win32
sorun yoksa kod.obj çıkar, bundan sonrası link, mingw kullanıyorsan ,
C:\MinGW\bin\ld.exe kod.obj -e entry -subsystem windows -lkernel32 -luser32 -o kod.exe
aVisual C++ kullanıyorsan malesef link.exe direkt çalışmıyor dll bağımlılıkları current directory muhabbetleri yüzünden, visual studio tools klasöründe command prompt var cmd.exe simgesinde yine, onu çalıştır obj dosyasının olduğu dizine git, link.exe çalıştırılabilri bu şekilde.
link kod.obj kernel32.lib user32.lib /entry:entry /subsystem:windows
İki durumda da kod.exe çıkacak, bu kadar. Bence mingw yi indir kur, nasm ı da indir, C:\MinGW\bin klasörüne at, bu klasörü de path a ekle, masaüstünde rahat rahat çalış. Asm ile devam etmek istiyorsan tabi, şu sözü hep söylerim :)
"C# ile yapabileceğin şeyler için değil C ile bile yapamayacağın şeyler için assembly kullan"
aksi halde faydasından çok zararını görürsün, kolay gelsin
Teşekkürler,
Bir ara ayrıntılı inceleyeceğim.
Ya aslında forumda programcı diye geçinen en az 100 kişi vardır ama sorsan sadece C#(.Net) bilip kendini programcı zanneden tipler. Bu tür konularda gerçek programcılar ortaya çıkıyor ;).
