วิธีแก้ไขผลลัพธ์ของโปรแกรมที่คุณไม่มีซอร์สโค้ด


89

ใน บริษัท ของเราเรามีโปรแกรมขนาดเล็ก (.exe ขนาด 500Kb) ที่ใช้ในการคำนวณทางคณิตศาสตร์และในที่สุดมันจะแยกผลลัพธ์ออกเป็นสเปรดชีต Excel ที่เราใช้เพื่อดำเนินงานต่อไป

ฉันต้องการแก้ไขคอลัมน์รูปแบบระยะห่างและเพิ่มตรรกะ VBA เป็นต้นในสเปรดชีต Excel แต่เนื่องจากพารามิเตอร์นี้ไม่สามารถกำหนดค่าได้ในโปรแกรมนั้นฉันคิดว่าวิธีเดียวที่จะแก้ไขได้คือการแยก / ย้อนกลับวิศวกร. exe

ไม่มีใครรู้ในภาษาที่ตั้งโปรแกรมสิ่งเดียวที่เรารู้คือ:

  1. พัฒนามานานกว่า 20 ปีแล้ว
  2. นักพัฒนาเกษียณเมื่อ 10 ปีที่แล้ว
  3. แอปพลิเคชัน GUI
  4. รันแบบสแตนด์อโลน
  5. ขนาด 500Kb

คำแนะนำใด ๆ ที่ตัวเลือกฉันต้องจัดการกับปัญหาดังกล่าว? วิศวกรรมย้อนกลับเป็นทางเลือกเดียวหรือมีแนวทางที่ดีกว่า


149
คุณรู้หรือไม่ว่าการคำนวณนั้นมีประสิทธิภาพอย่างไร ถ้าเป็นเช่นนั้นให้เขียนแอปใหม่ดันข้อมูลทดสอบทั้งคู่เพื่อตรวจสอบแอปใหม่ที่ใช้งานได้เหมือนเดิมจากนั้นจึงทิ้งแอปเก่า จากนั้นทำการเปลี่ยนแปลงที่คุณต้องการ
David Arno

13
ความคิดเห็นของ @DavidArno จะให้คำตอบที่ดี วิศวกรรมย้อนกลับเป็นไปได้ แต่การระบุและเขียนใหม่แอปจะมีราคาถูกกว่า / ง่ายกว่า / เร็วกว่ามาก
Dan Pichelman

44
อีกวิธีหนึ่งในการปรับเปลี่ยนคือใช้ผลลัพธ์ที่โปรแกรมต้นฉบับสร้างและกรองลงในสิ่งที่คุณต้องการ
Blrfl

9
@Alec หากคุณเปิด. exe ด้วยโปรแกรมแก้ไขฐานสิบหกคุณอาจได้รับเบาะแสเกี่ยวกับสิ่งที่เขียนไว้ตัวอย่างเช่นชื่อคอมไพเลอร์อาจถูกฝังอยู่ จากตรงนั้นคุณจะรู้เพิ่มเติมเกี่ยวกับตัวเลือกการถอดรหัสที่เป็นไปได้
GrandmasterB

26
หรือคุณอาจลองหาสุภาพบุรุษผู้เขียนใบสมัครและดูว่าเขาเต็มใจที่จะเข้ามาสักวันหรือสองวัน (อาจจะสองสามชั่วโมงต่อวัน) ในฐานะที่ปรึกษา หากเขาเป็นนักพัฒนาที่เกษียณอายุราชการมีโอกาสปานกลางที่เขาจะได้ชื่นชมการใช้จ่ายเงินเพียงเล็กน้อยที่อัตรา $ 100-150 / ชม. ในขณะที่เพลิดเพลินกับช่วงเวลาของการทำงานเพียงระยะเวลาสั้น ๆ
RLH

คำตอบ:


234

วิศวกรรมย้อนกลับอาจกลายเป็นเรื่องยากยิ่งขึ้นไปอีกหากคุณไม่ต้องการเข้าใจตรรกะของโปรแกรม แต่เปลี่ยนและคอมไพล์ใหม่ ดังนั้นสิ่งแรกที่ฉันจะลองคือการหาทางออกที่แตกต่าง

ฉันต้องการแก้ไขคอลัมน์รูปแบบระยะห่างและเพิ่มตรรกะ VBA เป็นต้นในสเปรดชีต Excel

หากนั่นเป็นสิ่งเดียวที่คุณต้องการและการคำนวณที่ทำโดยโปรแกรมนั้นดีทำไมไม่เขียนโปรแกรมในภาษาที่คุณเลือก (อาจจะเป็นแมโคร Excel) ซึ่งเรียกว่า "exe" แบบดั้งเดิมของคุณใช้เอาต์พุตและประมวลผล ต่อไป


9
เหตุใดโปรแกรมใหม่จึงต้องเรียก EXE เก่า ทำไมไม่เพียงทำให้โปรแกรมใหม่เป็นอิสระแล้วเขียนสคริปต์ที่เรียกทั้งสองและประสานงานเอาต์พุตและอินพุต? ประสบการณ์ของฉันแสดงให้เห็นว่าการให้ภาษาบรรทัดคำสั่งเช่น bash, PowerShell หรือการจัดการกระบวนการพร้อมรับคำสั่งนั้นง่ายกว่าการพยายามเขียนโค้ดด้วยตัวเองในภาษาที่จำเป็น มิฉะนั้น +1
jpmc26

8
@ jpmc26: ถูกต้องจนกว่าคุณจะต้องจัดการกับกฎการอ้างอิงที่ไร้สาระของ Bash ใช่พวกเขา (ส่วนใหญ่) เป็นไปตาม POSIX ไม่พวกเขาไม่ได้ทำให้รู้สึกทารุณ $ FOO ไม่ควรแยกคำเช่น
เควิน

16
@ jpmc26: ฉันไม่เคยมีปัญหาใด ๆ โทรsubprocess.run()ส่วนตัว
เควิน

3
@ jpmc26: ท่ออะไร? มันเป็นตำราอาหารที่บริสุทธิ์ ถ้าคุณต้องการ stdout คุณจะต้องผ่านเวทย์มนตร์PIPEคงที่ มิฉะนั้นคุณทำไม่ได้และมันจะถูกทิ้ง มีอะไรให้เข้าใจ
เควิน

3
... ฉันควรจะเพิ่มว่าฉันเคยใช้ Excel กับ VBA ในอดีตเป็นส่วนหน้าของอรรถประโยชน์บรรทัดคำสั่งอย่างประสบความสำเร็จมากกว่าหนึ่งครั้ง โครงสร้างจะเหมือนกันเสมอ: แผ่นสำหรับป้อนพารามิเตอร์เป็น "UI ของคนจน" ปุ่ม "เริ่ม" บนแผ่นงานนั้น ในรหัส VBA เราต้องการการShellโทรใน Excel VBA เช่นนี้: stackoverflow.com/questions/8902022/ ......ผู้ใช้สามารถวาง stdout / stderr จากยูทิลิตี้ cmd เป็นไฟล์แยกต่างหากจากนั้นจึงใช้การจัดรูปแบบผลลัพธ์
Doc Brown

114

นอกจากคำตอบที่ได้รับจาก Doc Brown และ Telastyn แล้วฉันอยากจะแนะนำวิธีการทางเลือกอื่น (ภายใต้สมมติฐานว่าเป็นภารกิจที่สำคัญ)

หากคุณไม่ทราบว่าการคำนวณนั้นดำเนินการอย่างไรและการคำนวณนั้นค่อนข้างสำคัญต่อภารกิจ: ลดตรรกะดั้งเดิมใน.exeไฟล์ด้วยวิธีการใด ๆ ที่จำเป็น ถอดรหัสโดยใช้ตัวถอดรหัส / ตัวแยกส่วนเช่นIDAถ้าจำเป็น จ้างที่ปรึกษา (หรือชุดที่ปรึกษา) หากจำเป็น

แน่นอนว่าควรหลีกเลี่ยงในตอนนี้โดยใช้โซลูชันของพวกเขา แต่อย่าปล่อยให้เป็นเช่นนั้น

เหตุผลที่ฉันแนะนำมีดังนี้: คุณยอมรับว่าการคำนวณนั้นซับซ้อนมาก (ตามวิศวกรที่คุณพูดด้วย) มันก็เป็นภารกิจที่สำคัญเช่นกัน ดังนั้นถ้าอย่างใดเดิม.exeหยุดทำงานเนื่องจากมีการเปลี่ยนแปลงในแพลตฟอร์มที่คุณได้ (อาจจะสนับสนุน 16 บิตได้รับลดลง?) คุณได้สูญเสียเพียงชิ้นภารกิจสำคัญของความรู้

ตอนนี้ฉันไม่ได้กังวลเกี่ยวกับการสูญเสีย.exeแต่เกี่ยวกับการสูญเสียความรู้มันเข้ารหัส ความรู้นั้นจะต้องได้รับการฟื้นฟู

เหมือนก่อนหน้านี้: ถ้ามีความรู้นั้นพร้อมใช้งานแล้วตรวจสอบให้แน่ใจว่าได้เขียนลงในรูปแบบที่จะไม่สูญหายตลอดเวลาในไม่ช้า มิฉะนั้นให้กู้คืนและจดบันทึกไว้


14
Decompilers สมัยใหม่สร้างรหัสที่มักจะอ่านง่ายโดยเฉพาะอย่างยิ่งหากต้นฉบับดั้งเดิมอยู่ใน C หรือแอสเซมเบลอร์ธรรมดาและไม่ใช่ภาษาระดับสูงกว่า
phyrfox

4
จุดที่ดีมาก นอกจากนี้: เพียงแค่ทำการปรับปรุงเพื่อให้มันทำงานได้อีกครั้งจะทำงานได้จนกว่าจะต้องมีการแก้ไขครั้งต่อไป
Daniel Jour

33
@phyrfox อายุ 20 ปี ... นักพัฒนาเลิกใช้งานเมื่อ 10 ปีก่อน ... เอาท์พุทเดียวคือสเปรดชีต Excel ... ฉันจะใช้เงินเป็นแอปพลิเคชั่น VB6
เจ ...

10
@micaho: หรือ บริษัท ยังคงอยู่และคนที่มีความรู้ในการตรวจสอบผลลัพธ์และสมมติฐานที่ซ่อนอยู่เพิ่งถูกรถบรรทุกชน แน่นอนว่ามันเป็นความเสี่ยงทางธุรกิจดังนั้นในที่สุดผู้มีส่วนได้ส่วนเสียควรตัดสินใจ ฉันแค่ต้องการเน้นว่า "wrapper" จะใช้งานได้ในขณะนี้ แต่จะเพิ่มเฉพาะหนี้ทางเทคนิคเท่านั้น
Sjoerd Job Postmus

22
@J ... : ถ้าเป็น VB6 แล้วโปสเตอร์ต้นฉบับจะอยู่ในโชค คุณสามารถกู้คืนซอร์สโค้ดจากการรวบรวม VB6 ได้อย่างง่ายดาย
Eric Lippert

74

ถามโปรแกรมเมอร์ต้นฉบับถ้าเป็นไปได้

ไม่กี่สัปดาห์ที่ผ่านมาฉันได้รับการติดต่อจาก บริษัท ที่ฉันเคยทำงานเมื่อ 10 ปีก่อนโดยมีคำถามเดียวกันเกี่ยวกับไฟล์ mdb ที่พัฒนาขึ้นในช่วงกลางยุค 90


52
นี่คือผลไม้แขวนต่ำจริง ทุกคน (รวมถึงตัวฉันเอง) ทำให้การใช้ทักษะการเขียนโปรแกรมยากเช่นวิศวกรรมย้อนกลับปรับปรุงการทำงานของโปรแกรมหรือเพิ่มเลเยอร์ให้กับการประมวลผลข้อมูล ในความเป็นจริงแล้วจุดเริ่มต้นที่ดีที่สุดคืออีเมลที่เป็นมิตรซึ่งอาจกลับมาในอีกหนึ่งชั่วโมงข้างหน้าด้วยตำแหน่งของซอร์สโค้ดหรือโซลูชันที่เหมาะสมอื่น ๆ
user1717828

2
เมื่ออยู่ที่บ้านด้วยแอปพลิเคชันอายุ 10 ปีฉันด้วยฉันก็เริ่มทำการถอดแยกชิ้นส่วน แต่ในช่วงเวลาทำงานเป้าหมายแตกต่างกัน ^^
เปาโล

2
คุณจำอะไรได้บ้างไหม :)
Ángel

2
แน่นอน! โชคไม่ดีที่ บริษัท ได้รับการควบรวมกิจการ 3 ครั้งดังนั้นจึงมีข้อมูลจำนวนมากสูญหายและส่วนหนึ่งของข้อมูลสำรองอยู่ในกระเป๋าที่สูญหายไป ... การพัฒนาอยู่ที่เว็บไซต์บนเครื่องของพวกเขาดังนั้นฉันจึงไม่ได้คัดลอกแหล่งที่มา
เปาโล

1
สแกน EXE เพื่อหาสตริงที่ฝังที่อาจรวมถึงชื่อของผู้พัฒนาหรือบางสิ่ง มันง่ายกว่าการถอดชุดประกอบ!
JDługosz

55

คำแนะนำใด ๆ ที่ตัวเลือกฉันต้องจัดการกับปัญหาดังกล่าว?

หากสิ่งที่คุณต้องการทำคือปรับเปลี่ยนผลลัพธ์ทำไมไม่ใช้องค์ประกอบ

แทนที่จะปรับเปลี่ยนกล่องดำที่คุณไม่สามารถเข้าถึงได้ง่ายคุณสร้างโปรแกรมใหม่ที่รับเอาท์พุทของ Excel และการจัดรูปแบบ / คอลัมน์ของคุณก็เปลี่ยนไปเช่นกัน จากนั้นคุณสามารถสร้าง exe / สคริปต์ใหม่ที่เรียกใช้สองโปรแกรมตามลำดับดังนั้นจึงปรากฏแก่ผู้ใช้ปลายทางว่ามีเพียงโปรแกรมเดียวที่ทำงานทั้งหมดแม้ว่าจะเป็นสองขั้นตอนที่แตกต่างกันภายใต้ประทุน


2
@Alec ไม่ว่าจะเป็นภาษาจาวาที่เหมาะสมหรือไม่นั้นขึ้นอยู่กับปริมาณข้อมูลที่คุณต้องใช้ในการจัดการ / จำนวนการคำนวณที่คุณต้องทำ หากทั้งคู่มีค่าต่ำ Java ก็ใช้ได้ หากสิ่งใดสิ่งหนึ่งสำคัญคุณควรเลื่อนลงไปที่ C หรือ C ++ แต่เนื่องจากคุณดูเหมือนจะใช้ข้อมูลจำนวนหนึ่งที่พอดีกับสเปรดชีต Excel อยู่แล้วฉันไม่คิดว่ามีข้อมูลเพียงพอที่จะทำให้ java เป็นตัวเลือกที่ไม่ดี (Excel น่าจะระเบิดก่อนที่แอปของคุณจะทำ)
cmaster

18
@cmaster ความคิดที่ว่า Java เป็นสิ่งต้องห้ามสำหรับการคำนวณหนักเป็นแนวคิดที่ล้าสมัย ที่เลวร้ายที่สุด มาตรฐานอยู่ที่นี่ไม่ได้เป็นแม้กระทั่ง 4x (ส่วนใหญ่เป็น 2 เท่าหรือน้อยกว่า) และถ้าเกลาหลักเดียวคือจุดแตกหักของเงินฝากออมทรัพย์ในด้านความปลอดภัย (ซึ่งแปลโดยตรงกับนักพัฒนาดอลลาร์) เป็นมากกว่ามีแนวโน้มที่จะชดเชยตีประสิทธิภาพ .
corsiKa

8
@Alec ภาษาใดก็ได้จะทำงาน VBA เป็นตัวเลือกที่ดีเพราะมันผสานกับ Excel ได้ดี
Captain Man

4
@corsiKa ขึ้นอยู่กับขนาดของใบสมัครของคุณ หากการเรียกใช้ครั้งเดียวใช้เวลาหลายหมื่น CPU-hours จะกลายเป็นข้อห้าม 2 หรือ 4: แปลเป็นปริมาณผลลัพธ์ที่คุณสามารถออกจากเครื่องจักรหลายล้านเครื่องโดยตรง นอกจากนี้แอปพลิเคชันดังกล่าวมักจะทำงานในขั้นตอนการล็อกดังนั้นการรวบรวมขยะจึงเป็นพิษบริสุทธิ์สำหรับประสิทธิภาพการทำงานการขัดจังหวะเล็ก ๆ จะทวีคูณตามจำนวนกระบวนการ ฉันบอกคุณแล้วว่ามีแอปพลิเคชั่นดังกล่าวอยู่และแน่นอนที่สุดว่าไม่ได้เขียนด้วยภาษาจาวา พวกเขาไม่ได้ใช้งานโดยธุรกิจอินเทอร์เน็ตทั่วไป
cmaster

7
@cmaster เรากำลังพูดถึงการคำนวณอย่างง่าย ๆ ไม่ใช่เครื่องมือเกม AAA แบบเต็มรูปแบบที่มีการส่องสว่างระดับโลกแบบเรียลไทม์การแสดงผลทางกายภาพการเคลื่อนไหวแบบ sparce voxel octrees การจำลองสนามฟิสิกส์สากลและอื่น ๆ ไม่มีความผิดใด ๆ แต่การแทรกการโต้แย้งใด ๆ ประสิทธิภาพ RE ที่นี่ไม่ดี ความง่ายในการใช้ควรเป็นอันดับ 1 และในฐานะคนที่ใช้ C ++ มาสองสามปีเป็นภาษาสุดท้ายที่ฉันอยากจะแนะนำในกรณีนี้

3

มี บริษัท ที่เชี่ยวชาญในปัญหาชนิดนี้อย่างแน่นอน พวกเขาใช้รหัสที่เป็นกรรมสิทธิ์ในการแปลรหัสเนทีฟเป็นภาษาระดับสูงจากนั้นใช้ความเชี่ยวชาญของมนุษย์เพื่อทำให้เป็นประโยชน์ (เช่นการให้ชื่อตัวแปรที่เหมาะสม)

เมื่อหลายปีก่อนนายจ้างของฉันใช้สิ่งนี้เพื่อโอนย้ายรหัสเมนเฟรม S / 390 ดั้งเดิมบางตัวไปยังเซิร์ฟเวอร์ Linux เราให้เลขฐานสองแก่พวกเขาพวกเขาให้ซอร์สโค้ดเป็น C

ไม่ว่าจะเป็นสิ่งที่จำเป็นในกรณีของคุณขึ้นอยู่กับคุณ หากคุณสนใจเฉพาะรูปแบบของเอาต์พุตคุณสามารถนวดผลลัพธ์หลังจากที่ผลิตแล้ว อย่างไรก็ตามในขณะที่คนอื่น ๆ ชี้ให้เห็นว่าการใช้ตรรกะทางธุรกิจที่ซ่อนอยู่ในไบนารีหยดอาจเป็นความเสี่ยงอย่างต่อเนื่อง


3

เขียน wrapper อย่างง่าย ๆ รอบโปรแกรมจับผลลัพธ์ของมัน มันไม่ซับซ้อนที่จะทำหลายภาษา ( Java , C ++ , Python , .NETเป็นต้น) มีความหมายสำหรับสิ่งนี้ แยกวิเคราะห์ผลลัพธ์และสร้างรายการอื่นในรูปแบบที่ต้องการ ผู้ใช้จะเรียกโปรแกรมใหม่ของคุณ ไฟล์ประมวลผลแบบเก่าจะยังคงติดกับมันหรือแม้กระทั่งสามารถแยกออกมาจากทรัพยากรโดยอัตโนมัติก่อนที่จะเรียกใช้

วิธีการแก้ปัญหาของหลักสูตรนี้ทำงานได้ดีพอเฉพาะเมื่อมีโครงสร้างที่ดีดังนั้นง่ายต่อการแยกวิเคราะห์

ว่าเป็นแอปพลิเคชั่น GUI ไม่ใช่ปัญหาการบล็อค คุณสามารถเปิดใช้งานสร้างผลลัพธ์แล้วโพสต์กระบวนการโดยอัตโนมัติเมื่อ GUI นี้ยุติ


3
สิ่งนี้แตกต่างจากคำตอบที่ได้รับการโหวตสูงสุดของ Doc Brown อย่างไร
Laf

ฉันไม่เห็นด้วยกับข้อสันนิษฐานของคำตอบของหมอที่เขียนไม่ดี มันชัดเจนและรวบรัด
เสา

1
หากคุณต้องการดูข้อความของคำตอบนี้คุณจะเห็นว่าส่วนที่ให้ข้อมูลเพียงอย่างเดียวทำให้ท้ายประโยคสุดท้าย "ซึ่งเรียกว่า" exe "ที่เป็นมรดกของคุณใช้เวลาเอาต์พุตและประมวลผลต่อไป
h22

2
ไม่ใช่ downvoter และไม่เข้าใจว่าทำไมมันถึง -3 ... Meta อยู่ที่นี่อีกครั้ง? แต่แยกกันฉันจะแนะนำให้ต่อต้านคำตอบของคนอื่นว่า "มีสมองที่เจือจางจำนวนมาก" เมื่อ (A) เป็นการตัดสินส่วนตัวและ (B) ในความเห็นส่วนตัวของฉันคุณมีแค่นั้น!
underscore_d

สิ่งนี้สามารถถูกเขียนใหม่เป็น "มีการพูดคุยทั่วไปที่ไม่เป็นทางการซึ่งเพิ่งเบี่ยงเบนความสนใจจากหัวข้อที่ทำให้ผู้อ่านเสียเวลา" หากวิธีนั้นดูมีประโยชน์มากขึ้น ให้คำแนะนำเกี่ยวกับวิธีการที่ถูกต้องในช่วงครึ่งหลังของประโยคสุดท้าย สิ่งนี้ไม่มีเจตนาที่จะเป็นการดูถูก ลบความคิดเห็นแล้ว
h22

1

เขียนการทดสอบบางอย่างที่ออกกำลังกายให้มากที่สุดเท่าที่จะทำได้ในรหัสเก่า ค้นหาเคสมุมทดสอบอินพุตที่ไม่ถูกต้องและทดสอบอินพุตที่ถูกต้อง

ขาลงสิ่งที่เป็นผลลัพธ์ที่ถูกต้องได้รับกรณีต่าง ๆ แล้วพยายามที่จะเขียนการใช้งานที่ตอบสนองการทดสอบเดียวกัน

ฉันจะไม่ลงเส้นทางวิศวกรรมย้อนกลับ มันซับซ้อนอย่างเหลือเชื่อในการกลับรหัสเครื่องและคุณควรทราบว่าจุดประสงค์ของ exe คืออะไร วิศวกรรมย้อนกลับเป็นการทำงานมากเกินไปสำหรับสิ่งที่คุณตามมา

หากซอฟต์แวร์ได้รับการพัฒนาโดยชายคนหนึ่งเมื่อ 20 ปีก่อนมันอาจไม่ใช่สิ่งที่ใช้พลังงานที่ทันสมัยมาก โปรแกรม GUI ที่ยืดเครื่องเมื่อ 20 ปีที่แล้วแทบจะไม่ได้ลงทะเบียนกับเครื่องจักรที่ทันสมัยดังนั้นคุณอาจมองสิ่งที่ง่ายต่อการทำซ้ำ


0

พยายามที่จะย้อนกลับวิศวกรรม exe เพื่อจุดประสงค์ในการค้นหาตรรกะการคำนวณหรืออย่างน้อยก็เพื่อให้ได้คำแนะนำที่เป็นธรรมว่ามันทำอะไรจริง ๆ และหากวิศวกรรมย้อนกลับของคุณสามารถไปถึงจุดนั้นได้คุณสามารถเขียนแอปพลิเคชันใหม่โดยใช้ตรรกะการคำนวณนั้น นอกจากนั้นฉันไม่เห็นทางอื่น

พูดง่ายกว่าทำแบบย้อนกลับวิศวกรที่ exe สร้างขึ้นเมื่อ 20 ปีก่อนเป็นความท้าทายที่แท้จริง


12
การออกเดทของ exe ไม่ควรสำคัญจริงๆ
Ángel

1
ในความเป็นจริงด้วยการเพิ่มประสิทธิภาพได้รับอย่างชาญฉลาดทุกปีวิศวกรรมย้อนกลับจะยากขึ้น
MSalters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.