จะแก้ไขเซ็กเมนต์ .code ตอนรันไทม์ได้อย่างไร

ฉันต้องการเขียนโปรแกรมที่สามารถปรับเปลี่ยนส่วนโค้ดของตัวเองได้ ตัวอย่างเช่นพิจารณารหัสแอสเซมบลีนี้:

รหัสดั้งเดิม:

i1: mov eax,0
i2: mov eax,0X01

โค้ดผลลัพธ์ที่ฉันต้องการสร้างขณะรันไทม์ด้วยโค้ดเดียวกัน:

i1: mov eax,0
i": // some modifing instructions that when are excuted they change the i2 and/or add or remove some instruction such i3
i2: jmp 0x32
i3: mov ebx,0x67 

คุณเห็นว่า i2 มีการเปลี่ยนแปลงหลังจากดำเนินการตามคำสั่ง i" i" จำเป็นต้องแก้ไขคำแนะนำในการส่งต่อโค้ด

ตอนนี้คำถามของฉันคือ:

  1. จะแก้ไขส่วนของโค้ดได้อย่างไร? หรือจะระบุพื้นที่หน่วยความจำส่วนของรหัสได้อย่างไร?
  2. เราอนุญาตให้แก้ไขจากส่วนโค้ดเดียวกันได้หรือไม่ (ไม่ใช่โปรแกรมอื่นที่ไม่สามารถเข้าถึงได้)
  3. เราจะแก้ไขปัญหาที่เกิดจากการเปลี่ยนแปลงขนาดส่วนของโค้ดได้อย่างไร
  4. ปัญหาสุดท้ายอาจเป็นแอนตี้ไวรัส! โดยจะตรวจสอบพฤติกรรมของโปรแกรมขณะรันไทม์และมีความไวต่อการปรับเปลี่ยนตัวเอง

ขอบคุณเพื่อนของฉัน


person Ali Adlavaran    schedule 24.02.2014    source แหล่งที่มา
comment
1) เขียนลงในหน่วยความจำ 2) อาจจะ. 3) ยาก ควรเว้นที่ว่างไว้ก่อน (ใส่ nops ใจกว้าง) 4) อ๊าก.   -  person Kerrek SB    schedule 24.02.2014
comment
โปรดเพิ่มรายละเอียดที่เกี่ยวข้อง (OS, CPU) - นี่แสดงให้เห็นความพยายามเพียงเล็กน้อย   -  person MSalters    schedule 24.02.2014
comment
สวัสดี. มีคู่มือการเรียนรู้เชิงลึกที่ดีอยู่ที่นี่: ic.unicamp.br/~pannain/mc404/aulas/pdfs/ . หน้า 136 พร้อมบทที่ 3.6.7 น่าจะช่วยคุณได้ ฉันทำเมื่อ 5 ปีที่แล้ว   -  person icbytes    schedule 24.02.2014
comment
จริงๆ แล้วเราต้องการเสียบโปรแกรมแก้ไขตัวเองซึ่งจะแก้ไขโค้ดดำเนินการ รายละเอียด CPU หรือ OS นั้นไม่สำคัญเพราะเราแค่ต้องแก้ไขโค้ดด้วยเช่นกัน ตัวอย่างเช่นการจำลองคำสั่งเฉพาะในโค้ด   -  person Ali Adlavaran    schedule 25.02.2014
comment
@KerrekSB จะเขียนลงในหน่วยความจำรหัสได้อย่างไร? และคำถามที่สอง: ลองนึกถึงสถานการณ์ที่มีคำสั่งสามคำสั่งโดยไม่มีช่องว่าง และเราต้องการเพิ่มคำสั่งบางอย่างในระหว่างนั้น ทำเช่นนี้ได้อย่างไร? การเปลี่ยนคำแนะนำในการส่งต่ออาจใช้เวลานาน! และในทางกลับกัน การเพิ่มการข้ามไปยังสถานที่อื่นอีกครั้งจำเป็นต้องมีการเปลี่ยนแปลงอย่างน้อยหนึ่งครั้ง ดังนั้น ...! คุณจะรับมือกับปัญหาเหล่านี้อย่างไร? ขอบคุณ   -  person Ali Adlavaran    schedule 25.02.2014
comment
หากคุณไม่มีที่ว่าง ก็เป็นเรื่องยากมาก เนื่องจากโค้ดปกติใช้ที่อยู่แบบฮาร์ดโค้ดและข้ามเป้าหมาย คุณสามารถแยกส่วนโค้ดที่ใหญ่ขึ้นและย้ายไปที่อื่นได้ แต่แยกวิเคราะห์เพื่อดูว่าจำเป็นต้องแก้ไขหรือไม่ และเติมเต็มช่องโหว่ด้วยการข้ามไปยังโค้ดของคุณเอง ซึ่งทำหน้าที่ของมัน จากนั้นจึงรันโค้ดต้นฉบับที่ถูกย้ายออก แล้วกระโดดกลับ ทุกอย่างขึ้นอยู่กับว่าคุณต้องการทุ่มเทงานมากเพียงใดและแฮ็กที่คุณต้องทำนั้นชั่วร้ายแค่ไหน หากเป็นโค้ดของคุณเอง คุณก็ควรคอมไพล์ใหม่โดยมีช่องว่าง   -  person Kerrek SB    schedule 25.02.2014


คำตอบ (1)


ภายในโหมดเรียล 16 บิตและโหมด v86 เราสามารถเขียนลงในส่วนโค้ดได้อย่างง่ายดาย:

i1: inc bx         ; 43h = opcode of "INC BX"
    mov al,4Bh     ; 4Bh = opcode of "DEC BX"
    mov cs:[i1],al

เดิร์ก

person Dirk Wolfgang Glomp    schedule 28.02.2014