2009-01-07 20 views
5

Bu garip bir soru gibi görünebilir, ancak .dll dosyasındaki bir işlevi nasıl çalıştırabileceğimi bilmek istiyorum. Aslında nasıl çalıştığını pek anlamıyorum ama buna çok ihtiyacım vardı. Hafıza imzasını ve adresini biliyorsanız, bir .dll içinde kayıtlı olmayan işlevleri çalıştırmanın bir yolu. Örneğin, bunlar var:Python ile kaydedilmemiş .dll işlevlerini çalıştırma

respawn_f "_ZN9CCSPlayer12RoundRespawnEv" 
respawn_sig "568BF18B06FF90B80400008B86E80D00" 
respawn_mask "xxxxx?xxx??xxxx?" 

Ve bir .dll içinde işlevlerini çalıştırmak için kullanabilir bazı oldukça şık C++ kodu kullanarak. Yani http://wiki.alliedmods.net/Signature_Scanning

o ctypes veya bu iç piton yapmak için başka bir yol kullanılarak mümkündür: Burada

üzerinde bir de açıkladı makale nedir?

cevap

2

Zaten bunları C++ kullanarak çalıştırabilirseniz, yazdığınız C++ kodu için python sarmalayıcıları oluşturmak için SWIG kullanmayı deneyebilirsiniz. SWIG kullanarak buldum

http://www.swig.org/

Bazı uyarılar:

Swig bir dize değerine dayalı türlerini arar. Örneğin, Python'da (int) bir tamsayı türü, 'un cpp türünün "int" olduğundan emin olmak için bakacaktır; aksi takdirde, sweat, türünü eşleşmeyle ilgili olarak şikayet edecektir. Otomatik dönüşüm yoktur.

Kopya kopyalar kaynak kodu, aynı ad alanı içindeki nesneler bile 'un tam olarak nitelenmesi gerekir, böylece cxx dosyasının düzgün şekilde derlenmesi sağlanır.

Bu yardımcı olur umarım.

0

Dışa aktarılmayan bir işlevi çağırmaya çalıştığınızı; Bildiğim kadarıyla, bu Python'dan mümkün değil. Ancak, probleminiz sadece ismin karıştırıldığı gibi görünüyor.

Klişeleri kullanarak rasgele bir dışa aktarma işlemi gerçekleştirebilirsiniz. İsim karıştırıldığı ve geçerli bir Python tanımlayıcısı olmadığı için getattr() öğesini kullanabilirsiniz.

Doğru bilgiye sahipseniz başka bir yaklaşım da, dışa aktarma yöntemini bulmaktır. Bu, adın hiç dışa aktarılmadığı durumlarda yapmanız gereken bir şeydir. Ordinal almanın bir yolu, birçok Windows derlenmiş dilde bulunan dumpbin.exe'yi kullanıyor olabilir. Aslında linker için bir ön uç, bu yüzden MS LinK.exe'ye sahipseniz, bunu uygun komut satırı anahtarları ile de kullanabilirsiniz. ,

ithalat ctypes fonk = getattr (ctypes.windll.msvcrt:

gibi bir şey kullanabilirsiniz (bunun adresine bağlı bir "fonksiyonu-işaretçisi" nesnedir) işlevini referansını almak için "@@ myfunc") retval = func (Yok)

Doğal olarak, 'msvcrt' yerine özel olarak aramak istediğiniz dll ile yer değiştirirsiniz.

Burada göstermediğim, çağrı imzasını türetmek için adın nasıl çözüleceği ve bu nedenle gerekli olan argümanlardır. Bunu yapmak bir demangler gerektirir ve bu DLL oluşturmak için kullanılan C++ derleyicisi VE VERSION markasına çok özgüdür.

Eğer işlev stdcall ise, bir miktar hata kontrolü vardır, bu sayede bazen doğru olana kadar bazı şeylerle uğraşabilirsiniz. Ancak işlev cdecl ise, otomatik olarak denetlemenin bir yolu yoktur. Aynı şekilde, eğer uygunsa, bu parametreyi eklemeyi unutmayın.

İlgili konular