ชุดประกอบการเรียนรู้ [ปิด]


102

ฉันตัดสินใจเรียนภาษา Assembly เหตุผลหลักในการทำเช่นนั้นคือความสามารถในการทำความเข้าใจรหัสถอดประกอบและอาจสามารถเขียนส่วนของโค้ดที่มีประสิทธิภาพมากขึ้น (เช่นผ่าน c ++) ทำบางอย่างเช่นถ้ำรหัสเป็นต้นฉันเห็นว่ามีการประกอบที่แตกต่างกันเป็นพันล้านรสชาติ ดังนั้นสำหรับจุดประสงค์ที่ฉันพูดถึงฉันควรเริ่มอย่างไร ฉันควรเรียนรู้การประกอบแบบไหน? ฉันต้องการเรียนรู้ด้วยการทำโปรแกรมง่าย ๆ ก่อน (เช่นเครื่องคิดเลข) แต่เป้าหมายคือการได้รับการยอมรับเพื่อให้ฉันเข้าใจรหัสที่แสดงตัวอย่างเช่นโดย IDA Pro

ฉันใช้ windows (ถ้ามันสร้างความแตกต่าง)

แก้ไข: ดูเหมือนทุกคนจะชี้ไปที่ MASM แม้ว่าฉันจะเข้าใจว่ามันมีความสามารถระดับสูง แต่ทั้งหมดนั้นดีสำหรับโปรแกรมเมอร์รหัสแอสเซมบลีนั่นไม่ใช่สิ่งที่ฉันกำลังมองหา ดูเหมือนว่าจะมีคำสั่ง if เรียกใช้และอื่น ๆ ที่ไม่แสดงใน deassemblers ยอดนิยม (เช่น IDA) ดังนั้นสิ่งที่ฉันอยากได้ยินถ้าเป็นไปได้คือความคิดเห็นของใครก็ตามที่ใช้ ASM เพื่อวัตถุประสงค์ที่ฉันขอ (อ่านโค้ดของ exe deassembled ใน IDA) ไม่ใช่แค่โปรแกรมเมอร์แอสเซมบลี "ทั่วไป"

แก้ไข: ตกลง ฉันเรียนรู้การประกอบอยู่แล้ว ฉันกำลังเรียนรู้ MASM ไม่ใช่ใช้ของระดับสูงที่ไม่สำคัญกับฉัน สิ่งที่ฉันกำลังทำอยู่ตอนนี้คือการลองใช้โค้ดของฉันเกี่ยวกับคำสั่ง __asm ​​ใน c ++ ดังนั้นฉันจึงสามารถลองทำสิ่งต่างๆได้เร็วกว่าที่ฉันต้องทำทุกอย่างตั้งแต่เริ่มต้นด้วย MASM


คำถามที่คล้ายกันกับstackoverflow.com/questions/1355524/…
TrueWill

ใช่ฉันกำลังอ่านเรื่องนั้นด้วย แต่คำถามของฉัน "เน้น" มากกว่าเล็กน้อยฉันจะบอกว่า
กินเอลิเซียม

หากคุณใช้ windows เป้าหมาย (นั่นคือโปรเซสเซอร์และชุดคำสั่ง) คือ x86 หรือ x86-64 เว้นแต่คุณจะได้รับเครื่องอื่นหรือบอร์ด MCU หรือใช้โปรแกรมจำลอง ดังนั้นคำถามที่ฉันควรใช้แอสเซมเบลอร์คืออะไร? หรือคุณถามจริงๆว่าจะกำหนดเป้าหมายสถาปัตยกรรมอะไร? โดยส่วนตัวแล้วฉันชอบชุดคำสั่งมุมฉากที่ดีบนชิปซีรีส์ m68k อนิจจา alack
dmckee --- อดีตผู้ดูแลลูกแมว

2
"ดูเหมือนว่าจะมีคำสั่ง if, เรียกและอื่น ๆ " - มาโครเหล่านี้คือมาโคร (ตัว 'M' ใน "MASM") และคุณไม่จำเป็นต้องใช้แม้ว่าแอสเซมเบลอร์จะรองรับก็ตาม
ChrisW

3
เป็นการตัดสินใจที่ยากลำบากที่จะให้คำถามคะแนนโหวตเพิ่มขึ้นครั้งที่ 65 64 เป็นตัวเลขที่สวยงาม . .
735Tesla

คำตอบ:


40

เริ่มต้นด้วยmasm32และจากที่นั่นดูที่FASM แต่คุณจะสนุกไปกับ MASM


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

1
โดยพื้นฐานแล้วจะเหมือนกับการเขียนรหัส op ซึ่งไม่สมเหตุสมผล การเรียนรู้ MASM32 จะช่วยให้คุณเข้าใจว่าโค้ดมีลักษณะอย่างไรในดีบักเกอร์ คุณอาจต้องการตรวจสอบ OllyDbg: ollydbg.de
Noon Silk

7
คุณไม่เข้าใจการประกอบ คุณต้องเข้าใจมัน opcode คือตัวเลข ผู้แก้จุดบกพร่องจะพยายามแก้ไข opcodes ตามคำแนะนำของพวกเขา (บางครั้งก็ยาก) คุณต้องเข้าใจคำแนะนำพื้นฐาน การเรียนรู้ MASM จะช่วยให้คุณทำสิ่งนี้ได้ ไม่จำเป็นต้องพูดอีกต่อไป
เที่ยงผ้าไหม

5
คุณไม่จำเป็นต้องใช้ฟีเจอร์ MASM ทั้งหมดเพียงเพราะมันอยู่ที่นั่น คุณสามารถอ่านสิ่งต่างๆได้ยากเท่าที่คุณต้องการหากคุณคิดว่าจะเรียนรู้เพิ่มเติมด้วยวิธีนั้น
JasonTrue

3
MASM ด้วยความแปลกจุดบกพร่องและคุณสมบัติระดับสูงที่เรียกว่าทำให้โปรแกรมเมอร์แอสเซมบลีสับสนได้มากกว่าที่คิด
IJ Kennedy

44

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

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

1) เรียนรู้ชุดคำสั่งสำหรับโปรเซสเซอร์เฉพาะ

2) เรียนรู้ความแตกต่างของวิธีการเขียนโค้ดในการประกอบสำหรับโปรเซสเซอร์ดังกล่าวเพื่อให้คุณสามารถกระดิกบิต opcode ทุกคำสั่งได้

3) คุณเรียนรู้ชุดคำสั่งได้ดีกว่าวิศวกรส่วนใหญ่ที่ใช้ชุดคำสั่งนั้นในการหาเลี้ยงชีพ

ในกรณีของคุณมีปัญหาสองสามข้อโดยปกติฉันแนะนำให้ใช้ชุดคำสั่ง ARM ในวันนี้มีผลิตภัณฑ์ที่ใช้ ARM มากกว่าที่จัดส่งในวันนี้มากกว่าเครื่องอื่น ๆ (รวมคอมพิวเตอร์ x86) แต่ความเป็นไปได้ที่คุณจะใช้ ARM ในขณะนี้และไม่รู้จักแอสเซมเบลอร์เพียงพอสำหรับการเขียนโค้ดเริ่มต้นหรือกิจวัตรอื่น ๆ ที่รู้ว่า ARM อาจช่วยหรือไม่ช่วยในสิ่งที่คุณกำลังพยายามทำ เหตุผลที่สองและสำคัญกว่าสำหรับ ARM อันดับแรกเป็นเพราะความยาวคำสั่งมีขนาดคงที่และจัดแนว การแยกชิ้นส่วนคำสั่งที่มีความยาวผันแปรเช่น x86 อาจเป็นฝันร้ายในโครงการแรกของคุณและเป้าหมายคือเพื่อเรียนรู้ชุดคำสั่งที่จะไม่สร้างโครงการวิจัย Third ARM เป็นชุดคำสั่งที่ทำได้ดีมีการสร้างรีจิสเตอร์ให้เท่ากันและไม่มีความแตกต่างพิเศษของแต่ละบุคคล

ดังนั้นคุณจะต้องหาโปรเซสเซอร์ที่คุณต้องการเริ่มต้นด้วย ฉันขอแนะนำ msp430 หรือ ARM ก่อนจากนั้น ARM ก่อนหรือสองจากนั้นจึงเกิดความโกลาหลของ x86 ไม่ว่าจะใช้แพลตฟอร์มใดแพลตฟอร์มใดก็ตามที่คุ้มค่าจะมีเอกสารข้อมูลหรือคู่มืออ้างอิงโปรแกรมเมอร์ที่ไม่ต้องเสียค่าใช้จ่ายจากผู้ขายซึ่งรวมถึงชุดคำสั่งตลอดจนการเข้ารหัสของ opcodes (บิตและไบต์ของภาษาเครื่อง) เพื่อจุดประสงค์ในการเรียนรู้ว่าคอมไพเลอร์ทำอะไรและวิธีการเขียนโค้ดที่คอมไพลเลอร์ไม่ต้องดิ้นรนมันเป็นการดีที่จะรู้ชุดคำสั่งสองสามชุดและดูว่าโค้ดระดับสูงเดียวกันนั้นถูกนำไปใช้อย่างไรในแต่ละชุดคำสั่งกับคอมไพเลอร์แต่ละตัวด้วยการปรับให้เหมาะสม การตั้งค่า. คุณไม่ต้องการเพิ่มประสิทธิภาพโค้ดของคุณเพียงเพื่อพบว่าคุณได้ทำให้ดีขึ้นสำหรับคอมไพเลอร์ / แพลตฟอร์มเดียว แต่แย่กว่าสำหรับทุก ๆ

โอ้สำหรับการแยกชุดคำสั่งความยาวตัวแปรแทนที่จะเริ่มต้นที่จุดเริ่มต้นและแยกส่วนคำสี่ไบต์ทุกคำแบบเชิงเส้นผ่านหน่วยความจำเช่นเดียวกับที่คุณทำกับ ARM หรือทุกๆสองไบต์เช่น msp430 (msp430 มีคำแนะนำความยาวผันแปรได้ แต่คุณยังสามารถทำได้โดย ไปตามเส้นตรงผ่านหน่วยความจำถ้าคุณเริ่มต้นที่จุดเข้าจากตารางเวกเตอร์ขัดจังหวะ) สำหรับความยาวผันแปรคุณต้องการค้นหาจุดเข้าตามตารางเวกเตอร์หรือความรู้เกี่ยวกับวิธีที่โปรเซสเซอร์บู๊ตและปฏิบัติตามโค้ดตามลำดับการดำเนินการ คุณต้องถอดรหัสแต่ละคำสั่งอย่างสมบูรณ์เพื่อให้ทราบจำนวนไบต์ที่ใช้ถ้าคำสั่งนั้นไม่ใช่สาขาที่ไม่มีเงื่อนไขถือว่าไบต์ถัดไปหลังจากคำสั่งนั้นเป็นคำสั่งอื่น คุณต้องจัดเก็บที่อยู่สาขาที่เป็นไปได้ทั้งหมดด้วยและถือว่าเป็นที่อยู่ไบต์เริ่มต้นสำหรับคำแนะนำเพิ่มเติม ครั้งหนึ่งที่ฉันประสบความสำเร็จฉันทำหลายครั้งผ่านไบนารี เริ่มต้นที่จุดเริ่มต้นฉันทำเครื่องหมายว่าไบต์นั้นเป็นจุดเริ่มต้นของคำสั่งจากนั้นถอดรหัสเชิงเส้นผ่านหน่วยความจำจนกระทั่งกดปุ่มกิ่งที่ไม่มีเงื่อนไข เป้าหมายสาขาทั้งหมดถูกแท็กเป็นที่อยู่เริ่มต้นของคำสั่ง ฉันทำการส่งผ่านไบนารีหลายครั้งจนกว่าฉันจะไม่พบเป้าหมายสาขาใหม่ หากเมื่อใดก็ตามที่คุณพบว่าคำสั่ง 3 ไบต์ แต่ด้วยเหตุผลบางประการคุณได้ติดแท็กไบต์ที่สองเป็นจุดเริ่มต้นของคำสั่งแสดงว่าคุณมีปัญหา หากโค้ดถูกสร้างขึ้นโดยคอมไพเลอร์ระดับสูงสิ่งนี้ไม่ควรเกิดขึ้นเว้นแต่คอมไพเลอร์จะทำสิ่งที่ชั่วร้าย หากโค้ดมีแอสเซมเบลอร์ที่เขียนด้วยมือ (เช่นเกมอาร์เคดรุ่นเก่า) เป็นไปได้มากทีเดียวที่จะมีกิ่งก้านตามเงื่อนไขที่ไม่สามารถเกิดขึ้นได้เช่น r0 = 0 ตามด้วยการกระโดดหากไม่ใช่ศูนย์ คุณอาจต้องแก้ไขสิ่งเหล่านั้นออกจากไบนารีเพื่อดำเนินการต่อ สำหรับเป้าหมายเฉพาะของคุณซึ่งฉันคิดว่าจะอยู่ที่ x86 ฉันไม่คิดว่าคุณจะมีปัญหา

ฉันแนะนำเครื่องมือ gcc mingw32 เป็นวิธีง่ายๆในการใช้เครื่องมือ gcc บน Windows ถ้า x86 เป็นเป้าหมายของคุณ ถ้าไม่ใช่ mingw32 plus msys เป็นแพลตฟอร์มที่ยอดเยี่ยมสำหรับการสร้าง cross compiler จาก binutils และ gcc source (โดยทั่วไปค่อนข้างง่าย) mingw32 มีข้อดีกว่า cygwin เช่นโปรแกรมที่เร็วกว่าอย่างมากและคุณหลีกเลี่ยงนรก dll ของ cygwin gcc และ binutils จะช่วยให้คุณสามารถเขียนใน C หรือแอสเซมเบลอร์และถอดรหัสของคุณออกและมีหน้าเว็บมากกว่าที่คุณจะอ่านได้ซึ่งแสดงให้คุณเห็นวิธีการทำอย่างใดอย่างหนึ่งหรือทั้งหมดในสาม หากคุณกำลังจะทำสิ่งนี้กับชุดคำสั่งที่มีความยาวผันแปรฉันขอแนะนำให้คุณใช้ชุดเครื่องมือที่มีตัวถอดชิ้นส่วน ตัวอย่างเช่นการถอดชิ้นส่วนของบุคคลที่สามสำหรับ x86 จะเป็นความท้าทายในการใช้งานเนื่องจากคุณไม่มีทางรู้ว่ามีการถอดชิ้นส่วนอย่างถูกต้องหรือไม่ บางส่วนก็ขึ้นอยู่กับระบบปฏิบัติการเช่นกันเป้าหมายคือการรวบรวมโมดูลเป็นรูปแบบไบนารีที่มีข้อมูลการทำเครื่องหมายคำแนะนำจากข้อมูลเพื่อให้ตัวแยกชิ้นส่วนสามารถทำงานได้แม่นยำยิ่งขึ้น ทางเลือกอื่นของคุณสำหรับเป้าหมายหลักนี้คือการมีเครื่องมือที่สามารถรวบรวมโดยตรงไปยังแอสเซมเบลอร์สำหรับการตรวจสอบของคุณจากนั้นหวังว่าเมื่อรวบรวมเป็นรูปแบบไบนารีจะสร้างคำสั่งเดียวกัน

คำตอบสั้น ๆ (สั้นกว่าเล็กน้อย) สำหรับคำถามของคุณ เขียนตัวแยกชิ้นส่วนเพื่อเรียนรู้ชุดคำสั่ง ฉันจะเริ่มต้นด้วยสิ่งที่ยากและง่ายต่อการเรียนรู้เช่น ARM เมื่อคุณทราบชุดคำสั่งหนึ่งชุดคำสั่งอื่น ๆ จะง่ายต่อการหยิบขึ้นมาบ่อยครั้งในเวลาไม่กี่ชั่วโมงโดยชุดคำสั่งที่สามคุณสามารถเริ่มเขียนโค้ดได้เกือบจะในทันทีโดยใช้แผ่นข้อมูล / คู่มืออ้างอิงสำหรับไวยากรณ์ โปรเซสเซอร์ทั้งหมดที่ควรค่าแก่การใช้มีแผ่นข้อมูลหรือคู่มืออ้างอิงที่อธิบายคำแนะนำลงไปจนถึงบิตและไบต์ของ opcodes เรียนรู้โปรเซสเซอร์ RISC เช่น ARM และ CISC เช่น x86 เพียงพอที่จะเข้าใจถึงความแตกต่างเช่นต้องผ่านการลงทะเบียนสำหรับทุกสิ่งหรือสามารถดำเนินการโดยตรงบนหน่วยความจำโดยมีการลงทะเบียนน้อยลงหรือไม่มีเลย คำสั่งตัวถูกดำเนินการสามคำกับสองคำสั่ง ฯลฯ ในขณะที่คุณปรับแต่งโค้ดระดับสูงของคุณ คอมไพล์สำหรับโปรเซสเซอร์มากกว่าหนึ่งตัวและเปรียบเทียบเอาต์พุต สิ่งที่สำคัญที่สุดที่คุณจะได้เรียนรู้คือไม่ว่าโค้ดระดับสูงจะเขียนคุณภาพของคอมไพเลอร์ได้ดีเพียงใดและตัวเลือกการเพิ่มประสิทธิภาพที่สร้างความแตกต่างอย่างมากในคำแนะนำจริง ฉันแนะนำ llvm และ gcc (พร้อม binutils) ไม่ผลิตรหัสที่ดีแต่เป็นหลายแพลตฟอร์มและหลายเป้าหมายและทั้งสองมีเครื่องมือเพิ่มประสิทธิภาพ และทั้งสองอย่างนั้นฟรีและคุณสามารถสร้างคอมไพเลอร์ข้ามจากแหล่งสำหรับโปรเซสเซอร์เป้าหมายต่างๆได้อย่างง่ายดาย


ขอบคุณสำหรับการตอบกลับ. แต่ฉันไม่รู้ด้วยซ้ำว่าจะเขียนตัวแยกชิ้นส่วนอย่างไร
กินเอลิเซียม

8
"เขียนตัวแยกชิ้นส่วนของคุณเอง" - ฉันยอมรับว่าเป็นวิธีที่ฉันเรียนรู้ได้ดีที่สุด (เกิดอะไรขึ้นกับ "But I don't even know how to write an disassembler?) ฮ่า ๆ
slashmais

ฉันจะไปกับคุณ! เพิ่งซื้อ MSP430 และหนังสือเล่มหนึ่ง ... :)
Pepe

1
ฉันมีตัวอย่าง msp430 github.com/dwelch67พร้อมชุดคำสั่งจำลองสองสามชุดสำหรับการทดลองรวมถึงการเรียนรู้ asm เป็นต้น
old_timer

ฉันชอบความคิดนี้มาก
Millie Smith

33

ชุดประกอบที่คุณเขียนด้วยมือและชุดประกอบที่สร้างโดยคอมไพเลอร์มักจะแตกต่างกันมากเมื่อมองจากระดับสูง แน่นอนว่าภายในของโปรแกรมจะคล้ายกันมาก (มีเพียงวิธีการเข้ารหัสที่แตกต่างกันมากมายa = b + c) แต่ก็ไม่ใช่ปัญหาเมื่อคุณพยายามทำวิศวกรรมย้อนกลับบางอย่าง คอมไพเลอร์จะเพิ่มโค้ดสำเร็จรูปจำนวนตันให้กับไฟล์ปฏิบัติการง่ายๆ: ครั้งที่แล้วที่ฉันเปรียบเทียบ "Hello World" ที่รวบรวมโดย GCC มีขนาดประมาณ 4kB ในขณะที่ถ้าเขียนด้วยมือในการประกอบจะมีขนาดประมาณ 100 ไบต์ แย่กว่าใน Windows: ครั้งที่แล้วฉันเปรียบเทียบ (ยอมรับว่านี่คือศตวรรษที่แล้ว) "Hello World" ที่เล็กที่สุดที่ฉันสามารถหาคอมไพเลอร์ Windows ของฉันได้จากตัวเลือกในการสร้างคือ 52kB! โดยปกติแล้วแผ่นสำเร็จรูปนี้จะดำเนินการเพียงครั้งเดียวถ้าเป็นเช่นนั้นดังนั้นจึงไม่ส่งผลต่อความเร็วของโปรแกรมมากนักเช่นที่ฉันกล่าวไว้ข้างต้นแกนหลักของโปรแกรมส่วนที่ใช้เวลาดำเนินการส่วนใหญ่มักจะค่อนข้างคล้ายกันไม่ว่าจะเป็นคอมไพล์หรือ เขียนด้วยมือ

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

สิ่งที่คุณต้องการทำคือคว้าคู่มือสถาปัตยกรรม IA-32 และ AMD64 (ทั้งสองอย่างรวมอยู่ด้วยกัน) จากIntelและAMDและดูคำแนะนำและรหัสในส่วนต้น ๆ อาจจะอ่านบทช่วยสอนหรือสองภาษาเกี่ยวกับภาษาแอสเซมบลีเพื่อทำความเข้าใจพื้นฐานของภาษาแอสเซมบลี จากนั้นคว้าขนาดเล็กโปรแกรมตัวอย่างของที่คุณสนใจและแยกชิ้นส่วนออก: ก้าวผ่านขั้นตอนการควบคุมและพยายามทำความเข้าใจว่ากำลังทำอะไรอยู่ ดูว่าคุณสามารถแก้ไขเพื่อทำอย่างอื่นได้หรือไม่ จากนั้นลองอีกครั้งกับโปรแกรมอื่นและทำซ้ำจนกว่าคุณจะสบายใจพอที่จะพยายามบรรลุเป้าหมายที่เป็นประโยชน์มากขึ้น คุณอาจสนใจสิ่งต่างๆเช่น "รอยแตก" ที่เกิดขึ้นโดยชุมชนวิศวกรรมย้อนรอยซึ่งเป็นความท้าทายสำหรับผู้ที่สนใจในวิศวกรรมย้อนรอยที่จะได้ลองทำและหวังว่าจะได้เรียนรู้บางสิ่งไปพร้อมกัน พวกเขามีความยากตั้งแต่พื้นฐาน (เริ่มที่นี่!) ไปจนถึงเป็นไปไม่ได้

เหนือสิ่งอื่นใดคุณก็ต้องปฏิบัติ ในขณะที่สาขาอื่น ๆ อีกมากมายด้วยวิศวกรรมย้อนกลับ, การทำให้สมบูรณ์ ... หรืออย่างน้อยดีกว่า


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

3
ความกังวลของฉันคือในทางทฤษฎีแล้วฉันสามารถอ่านเอกสารและเข้าใจความหมายได้จนกระทั่งฉันเริ่มเขียนสิ่งต่างๆด้วยตัวเองฉันไม่เชื่อว่าฉันจะเข้าใจมันอย่างแท้จริง คุณบอกว่าฉันสามารถเริ่มต้นด้วยการเปลี่ยนส่วนเล็ก ๆ ของโค้ด แต่ก่อนอื่นฉันต้องรู้ก่อนว่า IDA pro "รสชาติ" ประกอบแบบไหนใช้อย่างไร
กินเอลิเซียม

MSVC ++ ใช้อะไรสำหรับรหัสแอสเซมบลีแบบอินไลน์ มาสก์?
กินเอลิเซียม

15

ฉันจะเปรียบเทียบกับคำตอบส่วนใหญ่และแนะนำสถาปัตยกรรม MIPS RISC ของ Knuth ที่เป็นตัวแปรMMIX มันจะไม่มีประโยชน์ในทางปฏิบัติเท่ากับภาษาแอสเซมบลี x86 หรือ ARM (ไม่ใช่ว่าพวกเขาทั้งหมดมีความสำคัญกับงานในชีวิตจริงส่วนใหญ่ในทุกวันนี้ ... ;-) แต่มันจะปลดล็อคความมหัศจรรย์ของ Knuth ล่าสุดให้คุณ ผลงานชิ้นเอกที่ยิ่งใหญ่ที่สุดเท่าที่เคยมีมาเกี่ยวกับความเข้าใจอัลกอริทึมและโครงสร้างข้อมูลในระดับต่ำ - TAOCP "The Art of Computer Programming" ลิงก์จากสอง URL ที่ฉันยกมาเป็นวิธีที่ดีในการเริ่มต้นสำรวจความเป็นไปได้นี้!


12

(ฉันไม่รู้เกี่ยวกับคุณ แต่ฉันตื่นเต้นกับการชุมนุม)

มีการติดตั้งเครื่องมือง่ายๆสำหรับการทดลองประกอบในพีซีของคุณแล้ว

ไปที่เมนูเริ่ม -> เรียกใช้และพิมพ์debug

debug (คำสั่ง)

debugคือคำสั่งใน DOS, MS-DOS, OS / 2 และ Microsoft Windows (เฉพาะรุ่น x86 ไม่ใช่ x64) ซึ่งเรียกใช้โปรแกรม debug.exe (หรือ DEBUG.COM ใน DOS เวอร์ชันเก่า) การดีบักสามารถทำหน้าที่เป็นแอสเซมเบลอร์ตัวถอดชิ้นส่วนหรือโปรแกรมการถ่ายโอนข้อมูลฐานสิบหกช่วยให้ผู้ใช้ตรวจสอบเนื้อหาหน่วยความจำแบบโต้ตอบ (ในภาษาแอสเซมบลีเลขฐานสิบหกหรือ ASCII) ทำการเปลี่ยนแปลงและเลือกดำเนินการ COM, EXE และไฟล์ประเภทอื่น ๆ นอกจากนี้ยังมีคำสั่งย่อยหลายคำสั่งที่ใช้เพื่อเข้าถึงดิสก์เซ็กเตอร์พอร์ต I / O และที่อยู่หน่วยความจำ MS-DOS Debug ทำงานที่ ระดับกระบวนการแบบ 16 บิตและดังนั้นจึงจะมีข้อ จำกัด ในการใช้โปรแกรมคอมพิวเตอร์ FreeDOS Debug มีเวอร์ชัน "DEBUGX" ที่รองรับโปรแกรม DPMI 32 บิตเช่นกัน

บทแนะนำ:


หากคุณต้องการเข้าใจโค้ดที่คุณเห็นในIDA Pro (หรือOllyDbg ) คุณจะต้องเรียนรู้ว่าโค้ดที่คอมไพล์นั้นมีโครงสร้างอย่างไร ขอแนะนำหนังสือReversing: Secrets of Reverse Engineering

ฉันทดลองสองสามสัปดาห์กับdebugตอนที่ฉันเริ่มเรียนรู้การชุมนุม (15 ปีที่แล้ว)
โปรดทราบว่าdebugทำงานที่ระดับเครื่องพื้นฐานไม่มีคำสั่งประกอบระดับสูง

และตอนนี้เป็นตัวอย่างง่ายๆ:

ให้aเพื่อเริ่มเขียนรหัสแอสเซมบลี - พิมพ์โปรแกรมด้านล่าง - และสุดท้ายให้gรัน

ข้อความแสดงแทน


( INT 21แสดงบนหน้าจอถ่าน ASCII ที่เก็บไว้ในDLรีจิสเตอร์หากAHตั้งค่ารีจิสเตอร์เป็น2- INT 20ยุติโปรแกรม)


ฉันต้องกด ctrl-c ก่อนจึงจะเข้าสู่ "g"
ericp

2
@ericp คุณไม่จำเป็นต้องกด ctrl-c ตัวอย่างเช่นคุณพิมพ์a& [enter] เพื่อเริ่มเขียนรหัสแอสเซมบลี หากคุณกด [enter] สองครั้งคุณจะออกจากโหมดประกอบ g& [enter] เพื่อเรียกใช้ (ชดเชย 100 โดยค่าเริ่มต้น)
Nick Dandoulakis

มันทำให้เกิดสแต็กล้นหรือแค่เขียนลงบนหน้าจอ?
Janus Troelsen

1
@user มันเขียนชื่อของไซต์นี้ :-)
Nick Dandoulakis

@JanusTroelsen ตัวเลขเหล่านั้น (53, 74, 61, ฯลฯ ) คือรหัส ASCII สำหรับ 'S' 't' 'a' ... การเรียก Int21 แต่ละครั้งจะพิมพ์ทีละอักขระ! นี่คือสาเหตุที่การประกอบไม่เร็วขึ้น :)
doug65536

8

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

อย่าถูกถอดยศ ส่วนแรกของหนังสือเล่มนี้คือ "การแฮ็ก" ในความหมายของคำว่า Eric Raymond นั่นคือวิธีที่สร้างสรรค์น่าประหลาดใจเกือบจะส่อเสียดในการแก้ปัญหาที่ยากลำบาก ฉัน (และอาจจะเป็นคุณ) ไม่ค่อยสนใจด้านความปลอดภัย


7

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

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

ฉันคิดว่าพื้นฐานคือ:

  • รีจิสเตอร์: มีกี่ตัวชื่ออะไรและขนาดเท่าไหร่?
  • คำสั่งตัวถูกดำเนินการ: add eax, ebxหมายถึง "เพิ่ม ebx ไปยัง eax และจัดเก็บผลลัพธ์ใน eax"
  • FPU: เรียนรู้พื้นฐานของสแต็กจุดลอยตัวและวิธีที่คุณแปลงเป็น / จาก fp
  • โหมดที่อยู่: [ฐาน + ออฟเซ็ต * ตัวคูณ] แต่ตัวคูณสามารถเป็น 1, 2 หรือ 4 เท่านั้น (หรืออาจจะเป็น 8?)
  • การเรียกประชุม: พารามิเตอร์ส่งผ่านไปยังฟังก์ชันได้อย่างไร?

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

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

คำแนะนำอื่น ๆ ของฉันคือใช้ไวยากรณ์ของ Intel แทน AT&T เสมอเมื่อคุณมีทางเลือก ฉันเคยค่อนข้างเป็นกลางในประเด็นนี้จนถึงวันที่ฉันตระหนักว่าคำสั่งบางอย่างแตกต่างกันโดยสิ้นเชิงระหว่างสองคำสั่ง (ตัวอย่างเช่นmovslqในไวยากรณ์ AT&T เป็นmovsxdไวยากรณ์ของ Intel) เนื่องจากคู่มือทั้งหมดเขียนขึ้นโดยใช้ไวยากรณ์ของ Intel เพียงแค่ยึดตามนั้น

โชคดี!


3

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


3

ข้อเสนอแนะในการใช้การดีบักเป็นวิธีที่สนุกและสามารถทำได้ด้วยเทคนิคที่เป็นระเบียบมากมาย อย่างไรก็ตามสำหรับระบบปฏิบัติการสมัยใหม่การเรียนรู้แอสเซมบลี 16 บิตอาจมีประโยชน์น้อยกว่าเล็กน้อย ลองใช้ ntsd.exe แทน มีอยู่ใน Windows XP (น่าเสียดายที่ถูกดึงออกมาใน Server 2003 ขึ้นไป) ซึ่งทำให้เป็นเครื่องมือที่สะดวกในการเรียนรู้เนื่องจากมีให้บริการอย่างกว้างขวาง

ที่กล่าวว่าเวอร์ชันดั้งเดิมใน XP มีข้อบกพร่องหลายประการ หากคุณต้องการใช้มันจริงๆ (หรือ cdb หรือ windbg ซึ่งโดยพื้นฐานแล้วเป็นอินเทอร์เฟซที่แตกต่างกันโดยมีไวยากรณ์คำสั่งเดียวกันและการดีบักแบ็คเอนด์) คุณควรติดตั้งแพคเกจเครื่องมือดีบัก windowsฟรี

ไฟล์ debugger.chm ที่รวมอยู่ในแพ็คเกจนั้นมีประโยชน์อย่างยิ่งเมื่อพยายามหาไวยากรณ์ที่ผิดปกติ

สิ่งที่ยอดเยี่ยมเกี่ยวกับ ntsd คือคุณสามารถป๊อปอัปบนเครื่อง XP ใดก็ได้ที่คุณอยู่ใกล้และใช้เพื่อประกอบหรือถอดชิ้นส่วน มันทำให้เครื่องมือการเรียนรู้การประกอบ a / great / X86 ตัวอย่างเช่น (ใช้ cdb เนื่องจากอินไลน์ในพรอมต์ dos จึงเหมือนกัน):

(ข้อผิดพลาดของสัญลักษณ์ถูกข้ามไปเนื่องจากไม่เกี่ยวข้อง - ฉันหวังว่าการจัดรูปแบบนี้จะใช้งานได้นี่เป็นโพสต์แรกของฉัน)

C:\Documents and Settings\User>cdb calc

Microsoft (R) Windows Debugger Version 6.10.0003.233 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: calc
Symbol search path is: *** Invalid ***
Executable search path is:
ModLoad: 01000000 0101f000   calc.exe
ModLoad: 7c900000 7c9b2000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 7c9c0000 7d1d7000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f02000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 77f10000 77f59000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
(f2c.208): Break instruction exception - code 80000003 (first chance)
eax=001a1eb4 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c90120e esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c90120e cc              int     3
0:000> r eax
eax=001a1eb4
0:000> r eax=0
0:000> a eip
7c90120e add eax,0x100
7c901213
0:000> u eip
ntdll!DbgBreakPoint:
7c90120e 0500010000      add     eax,100h
7c901213 c3              ret
7c901214 8bff            mov     edi,edi
7c901216 8b442404        mov     eax,dword ptr [esp+4]
7c90121a cc              int     3
7c90121b c20400          ret     4
ntdll!NtCurrentTeb:
7c90121e 64a118000000    mov     eax,dword ptr fs:[00000018h]
7c901224 c3              ret
0:000> t
eax=00000100 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c901213 esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
ntdll!DbgUserBreakPoint+0x1:
7c901213 c3              ret
0:000>`

นอกจากนี้ - ในขณะที่คุณเล่นกับ IDA อย่าลืมตรวจสอบ IDA Pro Book โดย Chris Eagle (ยกเลิกการเชื่อมโยงเนื่องจาก StackOverflow ไม่ต้องการให้ฉันโพสต์ลิงก์มากกว่าสองลิงก์สำหรับโพสต์แรกของฉัน) เป็นการอ้างอิงที่ดีที่สุดในมือลง


1
+1 สำหรับหนังสือของ Chris Eagle ต้องใส่ความรักที่นั่นให้กับ Sk3wl ของ r00t;)
mrduclaw

3

ฉันเพิ่งเรียนวิชาระบบคอมพิวเตอร์ หนึ่งในหัวข้อคือ Assembly เป็นเครื่องมือในการสื่อสารกับฮาร์ดแวร์

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

ด้วยเหตุนี้ฉันจึงมีแนวโน้มที่จะแนะนำหนังสือเรียนของฉัน:

ระบบคอมพิวเตอร์: มุมมองของโปรแกรมเมอร์

ระบบคอมพิวเตอร์: มุมมองของโปรแกรมเมอร์
(ที่มา: cmu.edu )

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


2

ฉันคิดว่าคุณต้องการเรียนรู้การจำ opcode แบบ ASCII (และพารามิเตอร์) ซึ่งส่งออกโดย disassembler และซึ่งเข้าใจได้โดย (สามารถใช้เป็นอินพุตไปยัง) แอสเซมเบลอร์

แอสเซมเบลอร์ (เช่น MASM) จะทำ

และ / หรืออาจจะดีกว่าถ้าคุณอ่านหนังสือเกี่ยวกับเรื่องนี้ (มีหนังสือแนะนำเกี่ยวกับ SO ฉันจำไม่ได้ว่าเล่มไหน)


2

คุณทำงาน dev อื่น ๆ บน windows หรือไม่? IDE ใด หากเป็น VS ก็ไม่จำเป็นต้องมี IDE เพิ่มเติมเพียงเพื่ออ่านรหัสที่ถอดประกอบ: ดีบักแอปของคุณ (หรือแนบกับแอปภายนอก) จากนั้นเปิดหน้าต่างการถอดชิ้นส่วน (ในการตั้งค่าเริ่มต้นนั่นคือ Alt + 8) ขั้นตอนและดูหน่วยความจำ / ลงทะเบียนตามที่คุณทำผ่านรหัสปกติ คุณอาจต้องการเปิดหน้าต่างการลงทะเบียนไว้ (Alt + 5 โดยค่าเริ่มต้น)

Intel ให้คู่มือฟรีซึ่งให้ทั้งแบบสำรวจสถาปัตยกรรมพื้นฐาน (รีจิสเตอร์หน่วยประมวลผล ฯลฯ ) และข้อมูลอ้างอิงคำแนะนำแบบเต็ม ในขณะที่สถาปัตยกรรมเติบโตขึ้นและมีความซับซ้อนมากขึ้นคู่มือ 'สถาปัตยกรรมพื้นฐาน' จึงมีจำนวนน้อยลงและอ่านได้น้อยลง หากคุณสามารถรับมือกับเวอร์ชันที่เก่ากว่าได้คุณอาจมีจุดเริ่มต้นที่ดีกว่า (แม้แต่คู่มือ P3 - พวกเขาอธิบายสภาพแวดล้อมการดำเนินการพื้นฐานเดียวกันได้ดีกว่า)

หากคุณสนใจที่จะลงทุนในหนังสือนี่คือข้อความแนะนำที่ดี ค้นหา amazon สำหรับ 'x86' และคุณจะได้รับอื่น ๆ อีกมากมาย คุณจะได้รับทิศทางอื่น ๆ จากหลายคำถามอื่นที่นี่

สุดท้ายคุณก็สามารถได้รับประโยชน์ไม่น้อยจากการอ่าน บาง ต่ำ - ระดับบล็อก บิตข้อมูลขนาดไบต์เหล่านี้ทำงานได้ดีที่สุดสำหรับฉันโดยส่วนตัว


2

สิ่งนี้ไม่จำเป็นต้องช่วยให้คุณเขียนโค้ดได้อย่างมีประสิทธิภาพ!

รหัส op i86 เป็นรูปแบบ "ดั้งเดิม" ที่ยังคงมีอยู่เนื่องจากมีปริมาณโค้ดและไบนารีปฏิบัติการสำหรับ Windows และ Linux มากขึ้นหรือน้อยลง

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

ดังนั้นคอมไพเลอร์จึงสร้างรหัส x86 ตามค่าเริ่มต้นและชิปสมัยใหม่จะอ่านรหัส anceint Op และแปลงสิ่งที่เห็นเป็นคำสั่ง risc คู่ขนานด้วยการเรียงลำดับใหม่การดำเนินการเชิงเก็งกำไรการไปป์ไลน์และอื่น ๆ รวมทั้งใช้ประโยชน์จาก 32 หรือ 64 อย่างเต็มที่ลงทะเบียนโปรเซสเซอร์ มีอยู่จริง (ตรงข้ามกับ 8 ที่น่าสมเพชที่คุณเห็นในคำแนะนำ x86)

ตอนนี้คอมไพเลอร์ที่ปรับให้เหมาะสมทั้งหมดรู้ว่านี่คือสิ่งที่เกิดขึ้นจริงดังนั้นพวกเขาจึงเขียนโค้ดลำดับของรหัส OP ซึ่งพวกเขารู้ว่าชิปสามารถปรับให้เหมาะสมได้อย่างมีประสิทธิภาพแม้ว่าลำดับเหล่านี้บางส่วนจะดูไม่มีประสิทธิภาพสำหรับโปรแกรมเมอร์ประมาณปี 1990. asm

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

วิธีที่ง่ายและสะดวกที่สุดในการรับรันไทม์ที่มีประสิทธิภาพมากขึ้นคือการซื้อคอมไพเลอร์ Intel C / C ++ พวกเขามีตลาดเฉพาะสำหรับคอมไพเลอร์ที่มีประสิทธิภาพและมีข้อดีคือสามารถถามนักออกแบบชิปเกี่ยวกับสิ่งที่เกิดขึ้นภายใน


เรื่องราวของคุณค่อนข้างบ่งบอกว่าโปรเซสเซอร์ CISC ได้กลายเป็นโปรเซสเซอร์ RISC ภายใน ฉันอาจเข้าใจผิด แต่นี่ไม่เป็นความจริง และน่าสมเพช 8? โปรเซสเซอร์สมัยใหม่ (เช่นตั้งแต่ปี 2542) มีอีกมากมาย: 10 gpr: EAX-EFLAGS, 80 บิต FP0-FP7, 64-bit MMX0-MMX7, 128-bit XMM0-XMM7, เซ็กเมนต์: CS-GS, พิเศษ: CR0-CR4 , DR0-DR7, TR3-TR7, GDTR, IDTR, LDTR, MSRs และบน x86-64 รวมถึง R8-R15 สิ่งเหล่านี้ไม่สามารถเข้าถึงได้ทั้งหมดจาก ring-3 แต่ส่วนใหญ่จะถูกใช้โดยคอมไพเลอร์ GCC / VC ++ ล่าสุด (หลังปี 2006) โดยรวมมากกว่า "น่าสมเพช 8" เล็กน้อย;)
Abel

2

ในการทำสิ่งที่คุณต้องการทำฉันแค่ใช้Intel Instruction Set Reference (อาจไม่ใช่โปรแกรมที่แน่นอนที่ฉันใช้ แต่ก็ดูเพียงพอแล้ว) และโปรแกรมง่ายๆที่ฉันเขียนใน Visual Studio และเริ่มโยนลงใน IDAPro / Windbg . เมื่อฉันขยายโปรแกรมของตัวเองออกไปซอฟต์แวร์ที่แคร็กมีประโยชน์

ฉันสมมติว่าคุณมีความเข้าใจพื้นฐานเกี่ยวกับการทำงานของโปรแกรมบน Windows แต่จริงๆแล้วสำหรับการอ่านแอสเซมบลีมีเพียงไม่กี่คำแนะนำในการเรียนรู้และคำแนะนำไม่กี่รสชาติ (เช่นมีคำแนะนำในการกระโดดการกระโดดมีรสชาติไม่กี่อย่างเช่นการกระโดดหากเท่ากับการกระโดดถ้า-ecx-is-zero ฯลฯ ) เมื่อคุณเรียนรู้คำแนะนำพื้นฐานแล้วมันก็ค่อนข้างง่ายที่จะเข้าใจส่วนสำคัญของการทำงานของโปรแกรม มุมมองกราฟของ IDA ช่วยได้และหากคุณกำลังติดตามโปรแกรมด้วย Windbg มันค่อนข้างง่ายที่จะเข้าใจว่าคำแนะนำกำลังทำอะไรอยู่หากคุณไม่แน่ใจ

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

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


1

หนึ่งในภาษาแอสเซมบลีการสอนมาตรฐานมี MIPS คุณสามารถหาเครื่องจำลอง MIPS (spim) และสื่อการสอนต่างๆได้

ส่วนตัวไม่ได้เป็นแฟนคลับ ฉันค่อนข้างชอบ IA32


MIPS เป็นสิ่งที่ดี 68000 ก็เช่นกันและถ้าคุณเรียนรู้ 68000 คุณสามารถเขียนไบนารีที่ทำงานใน MAME ได้ :-)
Nosredna

1

รายการโปรดส่วนตัวของฉันคือ NASM ส่วนใหญ่เป็นเพราะหลายแพลตฟอร์มและรวบรวม MMX, SSE, 64-bit ...

ฉันเริ่มคอมไพล์ซอร์สไฟล์ C ง่ายๆด้วย gcc และ "ทรานส์โค้ด" คำสั่งแอสเซมเบลอร์จากรูปแบบ gcc เป็นรูปแบบ NASM จากนั้นคุณสามารถเปลี่ยนโค้ดส่วนเล็ก ๆ และตรวจสอบการปรับปรุงประสิทธิภาพที่ได้มา

เอกสาร NASM นั้นสมบูรณ์มากฉันไม่จำเป็นต้องค้นหาข้อมูลจากหนังสือหรือแหล่งอื่น ๆ


1

ลิงก์บางลิงก์ที่คุณอาจพบว่ามีประโยชน์ในการเรียนรู้แอสเซมบลี - การแมปรหัสแหล่งที่มา -

การประกอบและศิลปะการดีบั๊ก

การดีบัก - การแก้ไขโค้ดที่รันไทม์

หวังว่าคุณจะพบว่ามีประโยชน์เหล่านี้


0

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


0

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

การตรวจสอบโค้ด c / c ++ ที่ไม่ได้เพิ่มประสิทธิภาพจะช่วยสร้างลิงก์ไปยังชนิดของโค้ดที่คอมไพเลอร์สร้างขึ้นสำหรับซอร์สของคุณ คอมไพเลอร์บางตัวมีคำสงวน ASM บางประเภทซึ่งช่วยให้คุณสามารถแทรกคำสั่งเครื่องในโค้ดของคุณได้

คำแนะนำของฉันคือการเล่นกับเครื่องมือประเภทนี้สักพักและทำให้เท้าของคุณเปียกแล้วก้าวขึ้น? ลง? เพื่อให้ตรงกับรหัสแอสเซมเบลอร์บนแพลตฟอร์มที่คุณใช้งานอยู่

มีเครื่องมือดีๆมากมายอยู่ที่นั่น แต่คุณอาจพบว่ามันสนุกกว่านี้เพื่อหลีกเลี่ยงช่วงการเรียนรู้ที่สูงชันในตอนแรก


0

เราเรียนรู้การประกอบด้วยชุดพัฒนาไมโครคอนโทรลเลอร์ (Motorola HC12) และแผ่นข้อมูลแบบหนา


0

นอกหัวข้อฉันรู้ แต่เนื่องจากคุณเป็นโปรแกรมเมอร์ Windows ฉันจึงอดไม่ได้ที่จะคิดว่าอาจเป็นการใช้เวลาเรียนรู้ MSIL ที่เหมาะสมกว่าและ / หรือดีกว่า ไม่มันไม่ใช่แอสเซมบลี แต่น่าจะเกี่ยวข้องมากกว่าในยุค. NET นี้


0

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


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

0

คุณสามารถดูหลักสูตรวิดีโอ xorpd x86 Assemblyหลักสูตรวิดีโอ (ฉันเขียนมัน) หลักสูตรได้รับการชำระเงิน แต่แบบฝึกหัดเป็นแบบโอเพนซอร์สบน github หากคุณมีประสบการณ์ในการเขียนโปรแกรมมาบ้างฉันคิดว่าคุณควรจะสามารถทำงานกับแบบฝึกหัดและเข้าใจทุกอย่างได้

โปรดทราบว่ารหัสสำหรับแพลตฟอร์ม Windows และเขียนโดยใช้ประกอบ FASM หลักสูตรและแบบฝึกหัดไม่มีโครงสร้างระดับสูง แต่คุณสามารถใช้ Fasm เพื่อสร้างมาโครที่ซับซ้อนมากได้หากคุณต้องการทำเช่นนั้น

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