Kaynak kodunuz olmayan bir programın çıktısı nasıl değiştirilir?


89

Şirketimizde matematiksel hesaplama yapan küçük bir programımız (.exe 500Kb boyutu) var ve sonuçta iş akışımızı devam ettirmek için kullandığımız bir Excel elektronik tablosunda sonuç yayılıyor.

Sütunları değiştirmek, boşluk biçimlerini değiştirmek ve Excel elektronik tablosuna VBA mantığı vb. Eklemek istiyorum, ancak bu parametreler bu programda yapılandırılamadığından, değiştirmenin tek yolu .exe'yi bozmak / tersine çevirmek.

Hiç kimse hangi dilde programlandığını bilmiyor, bildiğimiz tek şey:

  1. 20+ yıl önce geliştirildi
  2. Geliştirici 10 yıl önce emekli oldu
  3. GUI Uygulaması
  4. Bağımsız çalışır
  5. Boyut 500Kb

Herhangi bir öneriniz ne tür sorunlarla başa çıkmak zorunda seçenekler? Tersine mühendislik tek seçenek midir, yoksa daha iyi bir yaklaşım var mı?


149
Hesaplamanın ne yaptığını biliyor musun? Öyleyse, yeni bir uygulama yazın, yenisinin aynı şekilde çalışıp çalışmadığını kontrol etmek için her ikisinden de bazı test verilerini bastırın, ardından eskisini atın. Ardından yapmak istediğiniz değişiklikleri yapın.
David Arno

13
@DavidArno'nun yorumu iyi bir cevap olurdu. Tersine mühendislik mümkündür, ancak uygulamayı yeniden tanımlayıp yeniden yazmak çok daha ucuz / daha kolay / daha hızlı olacaktır.
Dan Pichelman

44
Bunu değiştirmenin diğer yolu, orijinal programın ürettiği sonucu almak ve istediğinizi içine koymaktır.
Blrfl

9
@Alec Bir hex editörüyle .exe açarsanız, ne yazıldığına dair ipuçları alabilirsiniz. Örneğin, derleyici adı gömülü olabilir. Oradan, olası açma seçenekleri hakkında daha fazla bilgi sahibi olacaksınız.
GrandmasterB

26
Alternatif olarak, başvuruyu yazan beyefendiyi bulmaya çalışıp danışman olarak bir veya iki gün (belki de her gün birkaç saat) gelip gelmeyeceğini görmek isteyebilirsiniz. Emekli bir geliştirici ise, 100-150 $ / saat oranında biraz para harcayarak para kazanma şansını yakalayabileceği gibi orta bir şansı var.
RLH

Yanıtlar:


234

Yalnızca programın mantığını anlamak istemiyorsanız değiştirip yeniden derleyin, tersine mühendislik çok daha zor olabilir. Bu yüzden deneyeceğim ilk şey farklı bir çözüm aramak.

Excel elektronik tablosunda sütunları, boşluk biçimlerini değiştirmek ve VBA mantığı vb. Eklemek istiyorum.

İstediğiniz tek şey buysa ve program tarafından yapılan hesaplama tamamsa, neden sizin "eski" sıranızı çağırıp, seçtiğiniz dilde bir program yazmıyorsunuz (belki bir Excel makrosu). Daha ileri.


9
Yeni program neden eski EXE'yi aramak zorunda? Neden yeni programı bağımsız kılmıyor, sonra ikisini de çağıran ve çıktıyı ve girişi koordine eden bir komut dosyası yazmıyorsunuz? Tecrübelerime göre bash, PowerShell veya komut istemi işleme koordinatı gibi komut satırı dillerine izin vermenin zorunlu bir dilde kendiniz kodlamaya çalışmaktan daha basittir. Aksi takdirde, +1.
jpmc26

8
@ jpmc26: Bash'in saçma alıntı kurallarıyla uğraşmak zorunda kalana kadar bu doğru. Evet, bunlar (çoğunlukla) POSIX uyumlu. Hayır, hiçbir anlam ifade etmiyorlar. Örneğin $ FOO, split kelimesini kullanmamalıdır.
Kevin

16
@ jpmc26: subprocess.run()Kişisel olarak arama konusunda hiçbir sıkıntı yaşamadım .
Kevin,

3
@ jpmc26: Hangi borular? Saf yemek kitabı; stdout istiyorsanız, sihirli PIPEsabitini geçersiniz . Aksi takdirde, yapmazsınız ve atılır. Anlayacak ne var ki?
Kevin,

3
... Geçmişte Excel'i VBA ile geçmişte bir defadan daha başarılı bir şekilde komut satırında kullanmak için bir ön uç olarak kullandığımı eklemeliyim. Yapı daima aynıdır: Parametreleri "fakir bir adamın kullanıcı arayüzü" olarak girmek için bir sayfa, bu sayfadaki bir "Başlat" düğmesi. VBA kodunda, bunun Shellgibi bir Excel VBA'da bir çağrı yapılması gerekir : stackoverflow.com/questions/8902022/… , biri stdout / stderr'i cmd yardımcı programından ayrı dosyalara yönlendirebilir ve ardından çıktı biçimlendirmesini uygulayabilir.
Doc Brown

114

Daha önce Doc Brown ve Telastyn tarafından verilen cevaplara ek olarak, alternatif bir yaklaşım önermek istiyorum (bu varsayımın kritik olduğu varsayımı altında).

Gerçekleştirdiği hesaplamaları bilmiyorsanız ve hesaplamalar (bir şekilde) kritik öneme sahip ise: .exeDosyadaki orijinal mantığı, gerekli herhangi bir yöntemle kesin . Gerekirse IDA benzeri bir kod çözücü / parçalayıcı kullanarak kodunu çözün . Gerekirse bir danışman (veya bir grup danışman) kiralayın.

Elbette, çözümlerini kullanarak şimdilik çalışın, ancak olmasına izin vermeyin.

Önerdiğim sebep şu şekilde: Hesapların çok karmaşık olduğunu kabul ettiniz (konuştuğunuz mühendise göre). Aynı zamanda kritik görev. Öyleyse, bir şekilde .exesahip olduğunuz platformlardaki değişiklikler nedeniyle orijinal çalışmayı durdurursa (belki 16 bitlik destek düşer mi?), Sadece kritik bir bilgi parçasını kaybettiniz .

Şimdi, kaybetmekten endişe duymuyorum .exeama kodladığı bilgiyi kaybetmekle ilgileniyorum . Bu bilgi geri kazanılmalıdır.

Daha önce olduğu gibi: eğer bu bilgi zaten mevcutsa, yakında kaybedilmeyecek bir formatta yazdığınızdan emin olun. Aksi takdirde, kurtarın ve bir yere yazın.


14
Modern decompilers aslında, özellikle orijinal kaynak düz C veya assembler ise ve daha yüksek bir dilde değilse, genellikle oldukça okunaklı kod üretir.
phyrfox 27:16

4
Çok iyi bir nokta. Ayrıca: Sadece tekrar çalışacak şekilde düzeltmek, bir sonraki düzeltmenin uygulanması gerekene kadar çalışacaktır.
Daniel Jour

33
@phyrfox 20 yaşında ... geliştirici 10 yıl önce emekli oldu ... sadece çıktı bir Excel tablosu ... VB6 uygulaması olduğu için para harcadım.
J ...

10
@micaho: veya şirket hala var ve sonuçları ve gizli varsayımları doğrulamak için bilgi birikimine sahip kişi henüz bir kamyona çarptı. Tabii ki, bu bir iş riski, sonuçta paydaşların karar vermesi gerekiyor. Sadece "sarmalayıcı" nın çalışacağını vurgulamak istedim, ancak yalnızca teknik borcu ekledi.
Sjoerd Job Postmus, 11

22
@J ...: Eğer VB6 ise orijinal poster şansta. Kaynak kodunu bir VB6 derlemesinden kolayca alabilirsiniz.
Eric Lippert

74

Mümkünse, orijinal programlayıcıya danışın.

Birkaç hafta önce, 90'lı yılların ortalarında geliştirilen bir mdb dosyasıyla ilgili aynı soru ile 10 yıl önce çalıştığım bir firma tarafından temasa geçildim.


52
Asıl meyvenin asıl meyvesi bu. Herkes (kendim dahil) tersine mühendislik, programın işlevselliğini yeniden uygulamak veya veri işlemeye katmanlar eklemek gibi zor programlama becerilerinin kullanımını romantikleştirir. Gerçekte, başlamak için en iyi yer, kaynak kodun veya başka bir ideal çözümün bulunduğu konumla bir saat içinde geri dönebilecek olan arkadaşça bir e-postadır.
user1717828

2
10 yaşında bir uygulamayla evdeyken ben de bir sökücüyü ateşledim ama çalışma saatlerinde hedef farklıydı ^^
Paolo

2
Bununla ilgili bir şey hatırladın mı? :)
Ángel,

2
tabii ki! Maalesef, şirket 3 satın alma ve birleştirme işlemine girdi, bu yüzden birçok bilgi kaybedildi ve yedeklerin bir kısmı kayıp çantadaydı ... geliştirmeler kendi makineleriyle yapıldı ve kaynağın bir kopyası yoktu.
Paolo

1
Bir geliştiricinin adı veya başka bir şey içerebilecek gömülü dizeler için EXE'i tarayın. Tam bir sökme işleminden daha kolay!
JDługosz

55

Herhangi bir öneriniz ne tür sorunlarla başa çıkmak zorunda seçenekler?

Tek yapmanız gereken çıktıyı değiştirmek ise, neden sadece kompozisyon kullanmıyorsunuz?

Bunun yerine kolayca erişemez kara kutuyu değiştirme, Excel çıkışını alır ve biçimlendirme / sütun değiştirir yapar yeni bir program oluşturmak çok . Sonra sırayla iki programı çağıran yeni bir exe / script hazırlayabilirsiniz, böylece son kullanıcı için tüm işi yapan tek bir program olduğu görünür - başlık altında iki ayrı adım olsa bile.


2
@Alec Java'nın uygun bir dil olup olmadığı, büyük ölçüde kullanmanız gereken veri miktarına / yapmanız gereken hesaplama miktarına bağlıdır. Her ikisi de düşükse, java iyidir. İkisinden biri kritikse, C veya C ++ 'a bıraksanız iyi olur. Ancak yine de bir Excel elektronik tablosuna sığacak miktarda veri kullanıyor göründüğünüz için, java'yı kötü bir seçenek haline getirmek için yeterli veri olduğunu sanmıyorum (Excel uygulamanızdan önce patlar).
cmaster

18
Cmaster, yoğun hesaplama için Java'nın yasaklayıcı olduğu fikrini güncellememiştir. En kötü Burada listelenen kriter bile 4x değil (en 2x veya daha az) ve tek haneli sayıl sizin kırılma noktası ise, (geliştirici dolar doğrudan tercüme) güvenlik içinde tasarruf olasılıkla performans isabet dengelemek için gidiş daha fazlasıdır .
corsiKa

8
@Alec herhangi bir dil çalışacaktır. VBA iyi bir seçim gibi görünüyor çünkü zaten Excel ile çok iyi bütünleşiyor.
Kaptan Adam

4
@corsiKa Bu tamamen uygulamanızın ölçeğine bağlıdır. Tek bir çalıştırma on binlerce CPU-saatini tüketirse, 2 veya 4 faktörü yasaklayıcı hale gelir: Doğrudan bir multi milyon makineden elde edebileceğiniz sonuçların miktarına dönüşür. Ayrıca, bu tür uygulamalar tipik olarak kilitlenerek çalışır, bu nedenle çöp toplama işlemi performansları için saf zehirdir, küçük kesintiler işlem sayısıyla çarpacaktır. Size söylüyorum, bu tür uygulamalar var ve kesinlikle Java ile yazılmamışlar. Sadece ortalama bir internet işletmesi tarafından kullanılmıyorlar.
cmaster

7
@cmaster Gerçek zamanlı küresel aydınlatma, fiziksel temelli renderleme, hareketli seyrek voksel oktre, evrensel fizik alan simülasyonu ve benzeri ile tam gelişmiş bir AAA oyun motoru değil, bazı basit hesaplamalar hakkında konuşuyoruz. Alınma, ama burada herhangi bir argüman RE performansı eklemek kötüdür. Kullanım kolaylığı 1 numara olmalıdır ve birkaç yıldan beri C ++ kullanan biri olarak bu durumda tavsiye edeceğim son dildir.

3

Bu tür problemlerde tam olarak uzmanlaşmış şirketler var. Yerel kodu yüksek bir dile ayırmak için özel kod kullanırlar, daha sonra yararlı olması için insan uzmanlığı uygularlar (örneğin, değişkenlere uygun adlar vermek).

Birkaç yıl önce işverenim bunu bazı S / 390 ana bilgisayar kodlarını Linux sunucularına geçirmek için kullandı. Onlara bir ikili verdik, bize kaynak kodu verdiler.

Bu durumda gerekli olup olmadığı size kalmış. Çıktının sadece biçimini umursuyorsanız, çıktıktan sonra çıktıya kolayca masaj yapabilirsiniz. Bununla birlikte, başkalarının da belirttiği gibi, ikili bir blobun içine gizlenmiş iş mantığına sahip olmak devam eden bir risk olabilir.


3

Çıktısını yakalayan programın etrafına basit bir sarmalayıcı yazın. Bunun için birçok dili ( örneğin , Java , C ++ , Python , .NET ) yapmak karmaşık değildir . Çıktıyı çözümleyin ve istenen biçimde başka bir tane oluşturun. Kullanıcı yeni programınızı arayacaktır. Eski çalıştırılabilir dosya yanında kalır veya hatta çalıştırmadan önce kaynaktan otomatik olarak çıkarılabilir.

Elbette bu çözüm, yalnızca çıktıların ayrıştırılması çok kolay bir şekilde yapılandırıldığı zaman yeterince işe yarar.

Bir GUI uygulaması, engelleme sorunu değil. Başlatabilir, çıktı üretebilir ve ardından bu GUI sona erdiğinde işlemi otomatik olarak gönderebilirsiniz.


3
Bunun Doc Brown'un en çok oy alan cevabından farkı ne?
Laf,

Doc'un cevabının kötü yazılmış olduğu varsayımına katılmıyorum. Açık ve özlü.
Mast

1
Bu cevabın metnine bakacak olursanız, sadece bilgilendirici kısmın "eski mirasınızı" exe "olarak niteleyen, çıktısını alıp daha fazla işleyen" son cümlenin sonuna kadar geldiğini göreceksiniz.
h22

2
Düşürücü değil ve neden -3 aldığını görmüyor musun? ama ayrı olarak, (A) öznel bir yargılama ve (B) öznel görüşüme göre, sizinkini de içerdiğinde, (B) öznel bir yargılama olduğunda “Beyin seyreltici filan” için bir başkasının cevabını kınamaya karşı tavsiye ederim.
underscore_d

Bu, aynı zamanda daha yararlı görünüyorsa, "okuyucuların zamanını boşa harcayan konudan sadece rahatsız edici olan ve genel olmayan konuşmacı konuşmalar" olarak da yeniden yazılabilir. Son cümlenin ikinci yarısında doğru yaklaşıma bir ipucu sağlar. Bunun hakaret etme niyeti yoktu. Yorum kaldırıldı.
h22

1

Eski kodda mümkün olduğu kadar çok egzersiz yapan bazı testler yazın. Köşe kasalarını bulun, yanlış girişi test edin ve doğru girişi test edin.

Çeşitli durumlarda verilen çıktının ne olduğunu tespit edin ve aynı testleri karşılayan bir uygulama yazmaya çalışın .

Tersine mühendislik rotasından aşağı inmezdim. Makine kodunu tersine çevirmek inanılmaz derecede karmaşık bir durum ve exe'nin amacının ne olduğunu zaten bilmelisin. Tersine mühendislik, peşinde olduğun şey için biraz fazla iş.

Yazılım 20 yıl önce bir adam tarafından geliştirildi, muhtemelen çok fazla modern güç gerektiren bir şey değil. Makineyi 20 yıl önce genişleten bir GUI programı, modern bir makineye zorla girebiliyor, bu nedenle muhtemelen çoğaltılması kolay olan bir şeye bakıyorsunuz.


0

Exe'i tersine çevirmeyi dene. Yalnızca hesaplama mantığını bulma veya en azından gerçekte ne yaptığına dair net bir ipucu elde etmek amacıyla ve tersine mühendisliğiniz sizi bu noktaya ulaştırabilirse, bu hesaplama mantığına dayalı yeni bir uygulama yazabilirsiniz. Bunun dışında başka bir yol göremiyorum.

Söylemesi yapmaktan daha kolay, tersine mühendis 20 yıl önce oluşturulan bir exe gerçek bir meydan okumadır.


12
Exe'nin buluşması gerçekten önemli olmamalı
Ángel,

1
Aslında, optimize ediciler her yıl daha akıllı hale geldiğinde, tersine mühendislik yalnızca zorlaşıyor.
MSalters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.