Cara mengubah output dari program yang Anda tidak memiliki kode sumbernya

89

Di perusahaan kami, kami memiliki program kecil (ukuran .exe 500Kb) yang melakukan perhitungan matematis dan pada akhirnya mencantumkan hasilnya pada lembar bentang Excel yang kami gunakan untuk melanjutkan alur kerja kami.

Saya ingin memodifikasi kolom, format spasi dan menambahkan logika VBA dll pada spreadsheet Excel tetapi karena parameter ini tidak dapat dikonfigurasi dalam program itu, menurut saya satu-satunya cara untuk mengubahnya adalah dengan memecah / merekayasa balik .exe

Tidak ada yang tahu dalam bahasa apa itu diprogram, satu-satunya hal yang kita tahu adalah:

  1. Dikembangkan 20+ tahun yang lalu
  2. Pengembang pensiun 10 tahun lalu
  3. Aplikasi GUI
  4. Menjalankan mandiri
  5. Ukuran 500Kb

Ada saran opsi apa yang harus saya tangani dengan masalah seperti itu? Apakah teknik reverse adalah satu-satunya pilihan, atau apakah ada pendekatan yang lebih baik?

Alec
sumber
149
Apakah Anda tahu perhitungan apa yang dijalankannya? Jika demikian, tulis aplikasi baru, dorong beberapa data uji melalui keduanya untuk memeriksa yang baru berfungsi sama, lalu buang yang lama. Kemudian buat perubahan yang ingin Anda lakukan.
David Arno
13
Komentar @DavidArno akan memberikan jawaban yang baik. Membalikkan rekayasa dimungkinkan, tetapi merinci dan menulis ulang aplikasi akan jauh lebih murah / mudah / cepat.
Dan Pichelman
44
Cara lain untuk memodifikasinya adalah dengan mengambil hasil yang dihasilkan oleh program asli dan memfilternya menjadi apa pun yang Anda inginkan.
Blrfl
9
@Alec jika Anda membuka .exe dengan hex editor, Anda dapat memperoleh petunjuk tentang apa yang ditulis. Misalnya, nama kompiler mungkin disematkan. Dari sana Anda akan tahu lebih banyak tentang opsi penguraian yang mungkin.
GrandmasterB
26
Atau, Anda dapat mencoba mencari pria yang menulis aplikasi dan melihat apakah dia bersedia untuk satu atau dua hari (mungkin beberapa jam setiap hari) sebagai konsultan. Jika dia seorang pensiunan pengembang, ada kemungkinan moderat bahwa dia mungkin menghargai sedikit pengeluaran uang pada tingkat $ 100-150 / jam sambil benar-benar menikmati saat melakukan sedikit pekerjaan untuk periode singkat jika waktu.
RLH

Jawaban:

234

Reverse engineering bisa menjadi sangat sulit, bahkan lebih jika Anda tidak hanya ingin memahami logika program, tetapi ubah dan kompilasi ulang. Jadi hal pertama yang akan saya coba adalah mencari solusi yang berbeda.

Saya ingin memodifikasi kolom, format spasi dan menambahkan logika VBA dll di lembar kerja Excel

Jika itu adalah satu-satunya hal yang Anda inginkan, dan perhitungan yang dilakukan oleh program baik-baik saja, mengapa tidak menulis program dalam bahasa pilihan Anda (mungkin makro Excel) yang menyebut warisan Anda "exe", mengambil output dan memprosesnya lebih lanjut.

Doc Brown
sumber
9
Mengapa program baru harus memanggil EXE yang lama? Mengapa tidak membuat program baru independen dan kemudian menulis skrip yang memanggil keduanya dan mengoordinasikan output dan input? Pengalaman saya menunjukkan bahwa membiarkan bahasa baris perintah seperti bash, PowerShell, atau command prompt menangani proses koordinat umumnya lebih sederhana daripada mencoba kode sendiri dalam bahasa imperatif. Kalau tidak, +1.
jpmc26
8
@ jpmc26: Itu benar sampai Anda harus berurusan dengan aturan mengutip yang absurd dari Bash. Ya, mereka sebagian besar (POSIX-compliant). Tidak, mereka tidak masuk akal. $ FOO seharusnya tidak memisahkan kata, misalnya.
Kevin
16
@ jpmc26: Saya tidak pernah kesulitan menelepon subprocess.run(), secara pribadi.
Kevin
3
@ jpmc26: Perpipaan apa? Ini buku masak murni; jika Anda ingin stdout, Anda melewati PIPEkonstanta sihir . Jika tidak, Anda tidak melakukannya dan akan dibuang. Apa yang bisa dipahami?
Kevin
3
... Saya harus menambahkan bahwa saya pernah menggunakan Excel dengan VBA di masa lalu sebagai antarmuka perintah baris ke depan sangat berhasil lebih dari sekali. Strukturnya selalu sama: lembar untuk memasukkan parameter sebagai "UI orang miskin", tombol "Mulai" pada lembar itu. Dalam kode VBA, seseorang perlu Shellpanggilan dalam Excel VBA seperti ini: stackoverflow.com/questions/8902022/… , seseorang dapat menyalurkan stdout / stderr dari utilitas cmd ke file terpisah dan kemudian menerapkan format output.
Doc Brown
114

Selain jawaban yang sudah diberikan oleh Doc Brown dan Telastyn, saya ingin menyarankan pendekatan alternatif (dengan asumsi itu misi kritis).

Jika Anda tidak tahu perhitungan yang dilakukan dan kalkulasi (agak) kritis-misi: Buat logika asli dalam .exefile dengan cara apa pun yang diperlukan. Decode menggunakan decompiler / disassembler seperti IDA jika perlu. Sewa konsultan (atau sekelompok konsultan) jika perlu.

Tentu, kerjakan saja untuk saat ini menggunakan solusi mereka, tetapi jangan biarkan itu terjadi.

Alasan saya menyarankan adalah sebagai berikut: Anda telah mengakui bahwa perhitungannya sangat kompleks (menurut seorang insinyur yang Anda ajak bicara). Ini juga penting untuk misi. Jadi jika entah bagaimana yang asli .exeberhenti bekerja karena perubahan pada platform yang Anda miliki (mungkin dukungan 16-bit dijatuhkan?), Anda baru saja kehilangan sepotong pengetahuan kritis-misi .

Sekarang, saya tidak khawatir kehilangan .exe, tetapi tentang kehilangan pengetahuan yang dikodekannya. Pengetahuan itu harus dipulihkan.

Seperti sebelumnya: jika pengetahuan itu sudah tersedia, pastikan untuk menuliskannya dalam format yang tidak akan hilang dalam waktu dekat. Kalau tidak, pulihkan dan tulis.

Sjoerd Job Postmus
sumber
14
Dekompiler modern sebenarnya menghasilkan kode yang biasanya cukup terbaca, terutama jika sumber aslinya berada di dataran C atau assembler, dan bukan bahasa tingkat yang lebih tinggi.
phyrfox
4
Poin yang sangat bagus. Juga: Hanya menambalnya agar berfungsi lagi hanya akan berfungsi sampai perbaikan selanjutnya perlu diimplementasikan.
Daniel Jour
33
@ phyrfox 20 tahun ... pengembang pensiun 10 tahun yang lalu ... hanya outputnya yang merupakan spreadsheet Excel ... Saya akan menghasilkan uang dengan menjadi aplikasi VB6.
J ...
10
@ micaho: atau perusahaan masih ada dan orang yang tahu cara memverifikasi hasil dan asumsi tersembunyi baru saja ditabrak truk. Tentu saja, ini risiko bisnis sehingga pada akhirnya para pemangku kepentingan harus memutuskan. Saya hanya ingin menekankan bahwa "bungkus" akan berfungsi sekarang, tetapi hanya menambah hutang teknis.
Sjoerd Job Postmus
22
@ J ...: Jika VB6 maka poster aslinya beruntung. Anda dapat memulihkan kode sumber dari kompilasi VB6 dengan cukup mudah.
Eric Lippert
74

Tanyakan kepada programmer asli, jika memungkinkan.

Beberapa minggu yang lalu saya telah dihubungi oleh sebuah perusahaan yang saya gunakan untuk bekerja selama 10 tahun yang lalu dengan pertanyaan yang sama tentang file mdb yang dikembangkan pada pertengahan 90-an.

Paolo
sumber
52
Ini adalah buah rendah nyata. Semua orang (termasuk saya) meromantisasi penggunaan keterampilan pemrograman keras seperti rekayasa terbalik, menerapkan kembali fungsi program atau menambahkan lapisan pada pemrosesan data. Pada kenyataannya, tempat terbaik untuk memulai adalah email yang ramah yang mungkin akan kembali dalam satu jam dengan lokasi kode sumber atau solusi ideal lainnya.
user1717828
2
Ketika di rumah dengan aplikasi 10 tahun saya juga saya jalankan disassembler tetapi selama jam kerja tujuannya berbeda ^^
Paolo
2
Apakah Anda ingat sesuatu tentang itu? :)
Ángel
2
tentu saja! sayangnya perusahaan mengalami 3 akuisisi & penggabungan sehingga banyak informasi hilang dan sebagian cadangan ada di kantong yang hilang ... pengembangannya ada di mesin mereka, jadi saya tidak punya salinan sumbernya dan hanya itu.
Paolo
1
Pindai EXE untuk string tertanam yang mungkin menyertakan nama pengembang atau sesuatu. Itu lebih mudah daripada perakitan penuh!
JDługosz
55

Ada saran opsi apa yang harus saya tangani dengan masalah seperti itu?

Jika yang ingin Anda lakukan hanyalah memodifikasi output, mengapa tidak menggunakan komposisi saja?

Alih-alih memodifikasi kotak hitam yang tidak dapat Anda akses dengan mudah, Anda membuat program baru yang mengambil output Excel, dan apakah pemformatan / kolom Anda juga berubah . Kemudian Anda dapat membuat exe / skrip baru yang memanggil kedua program secara berurutan, sehingga tampaknya bagi pengguna akhir bahwa hanya ada satu program yang melakukan semua pekerjaan - meskipun itu dua langkah berbeda di bawah tenda.

Telastyn
sumber
2
@Alec Apakah java adalah bahasa yang cocok atau tidak terutama tergantung pada jumlah data yang perlu Anda tangani / jumlah perhitungan yang perlu Anda lakukan. Jika keduanya rendah, java baik-baik saja. Jika salah satu penting, lebih baik Anda turun ke C atau C ++. Tetapi karena Anda tampaknya hanya menggunakan sejumlah data yang sesuai dengan spreadsheet Excel, saya kira tidak cukup data yang terlibat untuk menjadikan java pilihan yang buruk (Excel kemungkinan akan meledak sebelum aplikasi Anda melakukannya).
cmaster
18
@ cmaster gagasan bahwa Java adalah penghalang untuk perhitungan berat adalah gagasan yang sudah ketinggalan zaman. The terburuk patokan tercantum di sini bahkan tidak 4x (kebanyakan 2x atau kurang) dan jika skalar satu digit adalah titik melanggar Anda, tabungan dalam keselamatan (yang diterjemahkan langsung ke dolar pengembang) lebih dari kemungkinan besar akan mengimbangi kinerja hit .
corsiKa
8
@ Alec bahasa apa pun akan berfungsi. VBA tampaknya merupakan pilihan yang baik karena sudah terintegrasi dengan Excel dengan baik.
Kapten Man
4
@corsiKa Itu sepenuhnya tergantung pada skala aplikasi Anda. Jika satu menjalankan mengkonsumsi beberapa puluh ribu CPU-jam, faktor 2 atau 4 menjadi penghalang: Ini diterjemahkan langsung ke dalam jumlah hasil yang bisa Anda dapatkan dari mesin multi-juta. Juga, aplikasi seperti itu biasanya bekerja berbatasan, sehingga pengumpulan sampah adalah racun murni untuk kinerjanya, gangguan kecil akan bertambah banyak dengan jumlah proses. Saya beri tahu Anda, aplikasi semacam itu ada, dan pastinya tidak ditulis dalam Java. Mereka tidak digunakan oleh bisnis internet rata-rata.
cmaster
7
@cmaster Kita berbicara tentang beberapa perhitungan sederhana, bukan mesin game AAA yang penuh dengan pencahayaan global realtime, rendering berbasis fisik, animasi octox sparce voxel, simulasi bidang fisika universal dan sejenisnya. Jangan tersinggung, tetapi memasukkan argumen apa pun kinerja RE di sini buruk. Kemudahan penggunaan harus menjadi # 1, dan sebagai seseorang yang telah menggunakan C ++ selama beberapa tahun ini adalah bahasa terakhir yang saya sarankan dalam hal ini.
3

Ada perusahaan yang berspesialisasi dalam masalah seperti ini. Mereka menggunakan kode hak milik untuk mendekompilasi kode asli ke bahasa tingkat tinggi, kemudian menerapkan keahlian manusia untuk membuatnya berguna (misalnya memberikan variabel nama yang sesuai).

Beberapa tahun yang lalu majikan saya menggunakan ini untuk memigrasi beberapa kode mainframe S / 390 asli ke server Linux. Kami memberi mereka biner, mereka memberi kami kode sumber dalam C.

Apakah ini perlu dalam kasus Anda, terserah Anda. Jika Anda hanya peduli dengan format output, Anda dapat memijat output setelah diproduksi. Namun seperti yang telah ditunjukkan oleh orang lain, menyembunyikan logika bisnis dalam gumpalan biner bisa menjadi risiko yang berkelanjutan.

ramping
sumber
3

Tulis pembungkus sederhana di sekitar program, ambil hasilnya. Tidak rumit untuk melakukan banyak bahasa ( Java , C ++ , Python , .NET , misalnya) memiliki cara untuk ini. Mengurai output dan menghasilkan yang lain, dalam bentuk yang diinginkan. Pengguna akan memanggil program baru Anda. Eksekusi lama akan tetap di sebelahnya, atau bahkan dapat diekstraksi secara otomatis dari sumber daya, sebelum menjalankannya.

Solusi ini tentu saja berfungsi cukup baik hanya ketika output terstruktur dengan baik sehingga mudah diurai.

Itu adalah aplikasi GUI, bukan masalah pemblokiran. Anda dapat meluncurkannya, menghasilkan keluaran, dan kemudian secara otomatis memposting prosesnya ketika GUI ini berakhir.

h22
sumber
3
Apa bedanya dengan jawaban terpilih Doc Brown?
Laf
Saya tidak setuju dengan anggapan jawaban Doc ditulis dengan buruk. Jelas dan ringkas.
Tiang
1
Jika Anda akan melihat teks dari jawaban ini, Anda akan melihat bahwa satu-satunya bagian informatif membuat akhir kalimat terakhir "yang menyebut warisan Anda" exe ", mengambil output dan memprosesnya lebih lanjut."
h22
2
Bukan downvoter, dan tidak melihat mengapa ini mendapat -3 ... apakah Meta melakukannya lagi? tetapi secara terpisah, saya akan menyarankan agar tidak mencerca jawaban orang lain karena "mengandung banyak bla yang melemahkan otak" ketika (A) itu penilaian subyektif dan (B) menurut pendapat subyektif saya, Anda hanya berisi itu!
underscore_d
Ini juga dapat ditulis ulang sebagai "berisi pembicaraan generik yang tidak informatif yang hanya mengalihkan perhatian dari topik yang menghabiskan waktu pembaca", jika cara itu terlihat lebih bermanfaat. Memberikan petunjuk untuk pendekatan yang tepat pada paruh kedua kalimat terakhir. Ini tidak punya niat untuk menghina. Komentar dihapus.
h22
1

Tulis beberapa tes yang melatih sebanyak mungkin kasus pada kode lama. Temukan casing sudut, uji input yang salah, dan uji input yang benar.

Jelaskan apa output yang benar diberikan berbagai kasus, dan kemudian mencoba untuk menulis implementasi yang memenuhi tes yang sama .

Saya tidak akan pergi ke rute reverse engineering. Sangat rumit untuk membalikkan kode mesin, dan Anda seharusnya sudah tahu apa tujuan exe itu. Reverse engineering adalah pekerjaan yang terlalu banyak untuk apa yang Anda cari.

Jika perangkat lunak ini dikembangkan oleh satu orang 20 tahun yang lalu, itu mungkin bukan sesuatu yang membutuhkan banyak kekuatan modern. Program GUI yang meregangkan mesin 20 tahun yang lalu hampir tidak akan mendaftar pada mesin modern, jadi Anda mungkin melihat sesuatu yang relatif mudah untuk direproduksi.

Carlos
sumber
0

Cobalah untuk merekayasa balik exe. Hanya untuk tujuan menemukan logika perhitungan atau setidaknya untuk mendapatkan petunjuk yang adil tentang apa yang sebenarnya dilakukannya dan jika rekayasa balik Anda dapat mengarahkan Anda ke titik itu, Anda dapat menulis aplikasi baru berdasarkan logika perhitungan tersebut. Selain itu, saya tidak melihat jalan keluar lain.

Lebih mudah dikatakan daripada dilakukan, merekayasa balik sebuah exe yang dibuat 20 tahun yang lalu adalah tantangan nyata.

Mukesh Adhvaryu
sumber
12
Kencan exe seharusnya tidak terlalu penting
Ángel
1
Bahkan, dengan pengoptimal yang semakin pintar setiap tahun, rekayasa balik hanya menjadi lebih sulit.
MSalters