8086 মেশিন কোড (এমএস-ডস। কম), 83 বাইট
ডসবক্স বা আপনার প্রিয় বাষ্প চালিত কম্পিউটিং ইঞ্জিনে চলমান Run ইরেডিয়েট করার স্ট্রিংটি একটি কমান্ড লাইন আর্গুমেন্ট হিসাবে দেওয়া হয়।
বাইনারি:
00000000 : EB 28 28 8A 0E 80 00 49 BD 83 00 B4 02 51 8A 0E : .((....I.....Q..
00000010 : 80 00 BE 82 00 AC 39 EE 74 04 88 C2 CD 21 E2 F5 : ......9.t....!..
00000020 : 59 45 B2 0A CD 21 E2 E5 C3 90 EB D7 D7 8A 0E 80 : YE...!..........
00000030 : 00 49 BD 83 00 B4 02 51 8A 0E 80 00 BE 82 00 AC : .I.....Q........
00000040 : 39 EE 74 04 88 C2 CD 21 E2 F5 59 45 B2 0A CD 21 : 9.t....!..YE...!
00000050 : E2 E5 C3 : ...
রিডেবল:
cpu 8086
org 0x100
jmp part2
db 0x28
part1:
mov cl, [0x80]
dec cx
mov bp, 0x83
mov ah, 0x02
.l:
push cx
mov cl, [0x80]
mov si, 0x82
.k:
lodsb
cmp si, bp
je .skip
mov dl, al
int 0x21
.skip:
loop .k
pop cx
inc bp
mov dl, 10
int 0x21
loop .l
ret
nop
part2:
jmp part1
db 0xd7
mov cl, [0x80]
dec cx
mov bp, 0x83
mov ah, 0x02
.l:
push cx
mov cl, [0x80]
mov si, 0x82
.k:
lodsb
cmp si, bp
je .skip
mov dl, al
int 0x21
.skip:
loop .k
pop cx
inc bp
mov dl, 10
int 0x21
loop .l
ret
ভগ্নস্বাস্থ্য শিঠ্ট
সক্রিয় অংশটি ডুপ্লিকেট করা হয়েছে যাতে রেডিয়েশনের দ্বারা সর্বদা একটি ছোঁয়া থাকে। আমরা লাফানোর মাধ্যমে স্বাস্থ্যকর সংস্করণটি নির্বাচন করি। প্রতিটি লাফ একটি সংক্ষিপ্ত লাফ, এবং ঠিক মাত্র দুটি বাইট দীর্ঘ, যেখানে দ্বিতীয় বাইট হ'ল স্থানচ্যুতি (অর্থাত্ লাফের দূরত্ব, লক্ষণ নির্ধারণের দিক সহ)।
আমরা কোডটি চারটি ভাগে ভাগ করতে পারি যা বিকিরণযোগ্য হতে পারে: লাফ 1, কোড 1, লাফ 2, এবং কোড 2 ধারণাটি একটি পরিষ্কার কোড অংশ সর্বদা ব্যবহৃত হয় তা নিশ্চিত করা হয়। কোডের একটি অংশ যদি বিকৃত হয় তবে অন্যটি অবশ্যই চয়ন করতে হবে, তবে একটি লাফের যদি বিকিরণ হয় তবে উভয় কোড অংশই পরিষ্কার হয়ে যাবে, তাই কোনটি বেছে নেওয়া উচিত তা বিবেচ্য নয়।
দুটি লাফ পার্ট থাকার কারণ হ'ল প্রথম অংশে ঝাঁপিয়ে পড়ে বিকিরণ সনাক্ত করা। যদি প্রথম কোড অংশটি বিকিরণ করা হয় তবে এর অর্থ আমরা চিহ্নটি বন্ধ করে এক বাইটে উপস্থিত হব। যদি আমরা নিশ্চিত হয়ে থাকি যে এই জাতীয় বোটচড অবতরণ কোড 2 নির্বাচন করে এবং একটি উপযুক্ত অবতরণ কোড 1 নির্বাচন করে, আমরা সোনার।
উভয় জাম্পের জন্য, আমরা প্রতিস্থাপন বাইটটি নকল করি, প্রতিটি জাম্পের অংশ 3 বাইট দীর্ঘ করি। এটি নিশ্চিত করে যে শেষ দুটি বাইটগুলির মধ্যে একটিতে ইরেডিয়েশন এখনও লাফটি বৈধ করে তুলবে। প্রথম বাইটে ইরেডিয়েশন হ'ল লাফটি একেবারে থামবে না, যেহেতু শেষ দুটি বাইট সম্পূর্ণ ভিন্ন নির্দেশিকা তৈরি করবে।
প্রথম লাফটি নিন:
EB 28 28 jmp +0x28 / db 0x28
যদি কোনও একটি 0x28
বাইট অপসারণ করা হয় তবে এটি এখনও একই জায়গায় চলে যাবে। যদি 0xEB
বাইটটি সরিয়ে ফেলা হয় তবে আমরা এর পরিবর্তে শেষ করব
28 28 sub [bx + si], ch
যা এমএস-ডস সম্পর্কে সৌম্য নির্দেশ (অন্যান্য স্বাদগুলি একমত হতে পারে না), এবং তারপরে আমরা কোড 1 এ চলে যাই, যা অবশ্যই পরিষ্কার হওয়া উচিত, যেহেতু ক্ষতিটি লাফ 1-এ ছিল।
যদি জাম্পটি নেওয়া হয়, তবে আমরা দ্বিতীয় লাফটিতে নামব:
EB D7 D7 jmp -0x29 / db 0xd7
যদি এই বাইট ক্রমটি অক্ষত থাকে এবং আমরা ঠিক চিহ্নের উপরে অবতরণ করি, তার অর্থ হল কোড 1টি পরিষ্কার ছিল এবং এই নির্দেশটি সেই অংশে ফিরে আসে। সদৃশ স্থানচ্যুতি বাইটটি এর গ্যারান্টি দেয়, এমনকি যদি এটি ক্ষতিগ্রস্থ হওয়া এই স্থানচ্যুতি বাইটগুলির মধ্যে একটিও হয়। যদি আমরা হয় একটি বাইট অফ অফ (যদি ক্ষতিগ্রস্থ কোড 1 বা 1 লাফ 1) বা 0xEB
বাইটটি ক্ষতিগ্রস্থ হয় তবে বাকী দুটি বাইটও এখানে সৌম্য হবে:
D7 D7 xlatb / xlatb
যাই হোক না কেন, যদি আমরা এই দুটি নির্দেশনা কার্যকর করে শেষ করি তবে আমরা জানি যে হয় লাফ 1, কোড 1, বা 2 লাফগুলি বিকিরণ করা হয়েছিল, যা কোড 2 এ নিরাপদে পড়ে।
পরীক্ষামূলক
নিম্নলিখিত প্রোগ্রামটি .COM ফাইলের সমস্ত সংস্করণ স্বয়ংক্রিয়ভাবে তৈরি করতে ব্যবহৃত হয়েছিল। এটি একটি বিএটি ফাইলও তৈরি করে যা লক্ষ্য পরিবেশে চালানো যায় যা প্রতিটি বিড়ম্বিত বাইনারি চালায় এবং তাদের আউটপুটগুলি পৃথক পাঠ্য ফাইলগুলিতে পাইপ দেয়। বৈধতার জন্য আউটপুট ফাইলের তুলনা করা যথেষ্ট সহজ, তবে ডসবক্স নেই fc
, সুতরাং এটি বিএটি ফাইলটিতে যুক্ত করা হয়নি।
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
FILE *fin, *fout, *fbat;
int fsize;
char *data;
if (!(fin = fopen(argv[1], "rb")))
{
fprintf(stderr, "Could not open input file \"%s\".\n", argv[1]);
exit(1);
}
if (!(fbat = fopen("tester.bat", "w")))
{
fprintf(stderr, "Could not create BAT test file.\n");
exit(2);
}
fseek(fin, 0L, SEEK_END);
fsize = ftell(fin);
fseek(fin, 0L, SEEK_SET);
if (!(data = malloc(fsize)))
{
fprintf(stderr, "Could not allocate memory.\n");
exit(3);
}
fread(data, 1, fsize, fin);
fprintf(fbat, "@echo off\n");
for (int i = 0; i < fsize; i++)
{
char fname[512];
sprintf(fname, "%03d.com", i);
fprintf(fbat, "%s Hello, world! > %03d.txt\n", fname, i);
fout = fopen(fname, "wb");
fwrite(data, 1, i, fout);
fwrite(data + i + 1, 1, fsize - i - 1, fout);
fclose(fout);
}
free(data);
fclose(fin);
fclose(fbat);
}