Bagaimana cara mengubah segmen .code saat runtime?

Saya ingin menulis sebuah program yang dapat mengubah segmen kode itu sendiri. misalnya pertimbangkan kode perakitan ini:

Kode asli:

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

kode hasil yang saya ingin dibuat saat runtime dengan kode yang sama:

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 

Anda melihat i2 berubah setelah menjalankan instruksi i". i" wajib mengubah instruksi kode penerusannya.

Sekarang pertanyaan saya adalah:

  1. Bagaimana cara mengubah segmen kode? Atau Bagaimana cara mengatasi area memori segmen kode?
  2. Apakah kami diperbolehkan untuk memodifikasinya dari segmen kode yang sama (Bukan program lain yang tidak memiliki akses ke sana)?
  3. bagaimana kita dapat mengatasi masalah yang disebabkan oleh perubahan ukuran segmen kode?
  4. masalah terakhir mungkin adalah anti-virus! yang mana mereka memeriksa perilaku program pada saat runtime dan sensitif terhadap modifikasi diri.

Terima kasih teman-temanku.


person Ali Adlavaran    schedule 24.02.2014    source sumber
comment
1) menulis ke memori. 2) Mungkin. 3) Sulit, yang terbaik adalah menyisakan ruang pada awalnya (masukkan nop yang banyak). 4) Ak.   -  person Kerrek SB    schedule 24.02.2014
comment
Harap tambahkan detail yang relevan (OS, CPU) - ini menunjukkan sedikit usaha.   -  person MSalters    schedule 24.02.2014
comment
Hai. Ada panduan pembelajaran mendalam yang bagus, terletak di sini: ic.unicamp.br/~pannain/mc404/aulas/pdfs/ . Halaman 136 dengan bab 3.6.7 akan membantu Anda. Saya melakukannya 5 tahun yang lalu.   -  person icbytes    schedule 24.02.2014
comment
sebenarnya kami ingin menerapkan program modifikasi mandiri yang mengubah kode eksekusinya. Detail CPU atau OS tidak menjadi masalah karena kita hanya perlu memodifikasi kodenya saja. misalnya mereplikasi instruksi tertentu dalam kode.   -  person Ali Adlavaran    schedule 25.02.2014
comment
@KerrekSB Bagaimana cara menulis ke memori kode? dan, pertanyaan kedua: pikirkan situasi di mana terdapat tiga instruksi tanpa ada celah di sana, dan kami ingin menambahkan beberapa instruksi di antara keduanya. Bagaimana caranya? Menggeser instruksi penerusan mungkin memerlukan waktu lama! dan di sisi lain juga menambahkan lompatan ke tempat lain lagi membutuhkan setidaknya satu shift. Jadi ...! Bagaimana Anda mengatasi masalah-masalah ini? Terima kasih.   -  person Ali Adlavaran    schedule 25.02.2014
comment
Jika Anda tidak punya ruang, ini sangat rumit, karena kode normal menggunakan alamat hardcode dan target lompat. Anda dapat mengukir bagian kode yang lebih besar dan memindahkannya ke tempat lain, namun menguraikannya untuk melihat apakah perlu diperbaiki, dan mengisi lubang dengan lompatan ke kode Anda sendiri, yang melakukan tugasnya, lalu mengeksekusi kode asli yang telah dipindahkan. , lalu melompat mundur. Itu semua tergantung pada seberapa banyak pekerjaan yang ingin Anda lakukan dan seberapa jahat peretasan yang perlu Anda lakukan. Jika itu kode Anda sendiri, maka Anda sebaiknya mengkompilasi ulangnya dengan spasi.   -  person Kerrek SB    schedule 25.02.2014


Jawaban (1)


Dalam realmode 16 bit dan mode v86 kita dapat dengan mudah menulis ke segmen kode:

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

Beladau

person Dirk Wolfgang Glomp    schedule 28.02.2014