80186 মেশিন কোড + ডস, 91 বাইট
পাঠ্য সংস্করণ:
hm j j PPjzjzjgaAAA JSJJ RU Sq ReAA JdJJJ RfiJElK JEiS GtI And she said But that s his
পাঠ্য সংস্করণ, ট্যাব সহ (কোড 9) প্রতিস্থাপন 9
এবং স্পেসস (কোড 32) প্রতিস্থাপন করেছেন *
:
hm9j9j9PPjzjzjgaAAA9JSJJ9RU9Sq9ReAA9JdJJJ9RfiJElK9JEiS*GtI*And*she*said***But*that*s*his***
Hexdump:
68 6D 09 6A 09 6A 09 50 50 6A 7A 6A 7A 6A 67 61
41 41 41 09 4A 53 4A 4A 09 52 55 09 53 71 09 52
65 41 41 09 4A 64 4A 4A 4A 09 52 66 69 4A 45 6C
4B 09 4A 45 69 53 20 47 74 49 20 41 6E 64 20 73
68 65 20 73 61 69 64 20 20 20 42 75 74 20 74 68
61 74 20 73 20 68 69 73 20 20 20
মেশিন কোড এক্সটেনশন সহ একটি ফাইলে উপস্থিত হয় .com
। আমি যখন এটি চালনা করি তখন এটি প্রয়োজনীয় বার্তাটি মুদ্রণ করে এবং তারপরে হ্যাং হয়ে যায় (এলোমেলো ডেটা কার্যকর করে)।
এটি কী করে তা নিয়ে উচ্চ-স্তরের ব্যাখ্যা:
- ধ্রুবক মান সহ নিবন্ধগুলি সূচনা করে
- প্রয়োজনীয় বিশেষ প্রতীক (
,'.$
) দ্বারা বার্তায় স্পেসগুলি প্রতিস্থাপন করে
int 21
নির্দেশটি তৈরি করতে কোডটি প্যাচ করে , যা বার্তাটি মুদ্রণ করে
- ডস কল করুন
সমাবেশ কোড (এর সাথে সংকলন করা যেতে পারে tasm
):
my_bp equ 7ah
my_si equ 7ah
my_di equ 67h
my_msg equ 13bh
.model tiny
.code
.startup
.186
org 100h
push 96dh ; ax (ah = 0; al = don't care, but see below)
push 9 ; cx
push 9 ; dx
push ax ; bx = don't care
push ax ; don't care
push my_bp
push my_si
push my_di
popa
inc cx
inc cx
inc cx
or [bp+si+my_msg-my_bp-my_si+12], cx ; ,
dec dx
dec dx
or [bp+si+my_msg-my_bp-my_si+14], dx ; '
or [bp+di+my_msg-my_bp-my_di+23], dx ; '
or [bp+si+my_msg-my_bp-my_si+30], dx ; '
inc cx
inc cx
or [bp+si+my_msg-my_bp-my_si+29], cx ; .
dec dx
dec dx
dec dx
or [bp+si+my_msg-my_bp-my_si+31], dx ; $
; 0x2049 * 0x4b6c = 0x98301cc
; So this sets cx to 1cc (a temporary constant used to patch code)
imul cx, [bp+si+my_msg-my_bp-my_si-2], 4b6ch
; 0x1cc | 0x2049 = 0x21cd (the instruction which calls DOS int 21)
; Here ah = 9 ("print" mode)
or [bp+si+my_msg-my_bp-my_si-2], cx
; At address 101, there is the constant 96d, which was loaded into ax
; 0x96d * 0x7447 = 0x448013b
; So the following sets dx to 13b (adddress of the message)
imul dx, [bp+di+101h-my_bp-my_di], 7447h
int21:
dw 2049h
db 'And she said But that s his '
end
এটি popa
সমস্ত রেজিস্টারগুলিকে পপ করার নির্দেশনাটি ব্যবহার করে , কারণ নিয়মিত pop
সমস্ত প্রয়োজনীয় রেজিস্টারগুলি পূরণ করতে পারে না (যেমন pop di
একটি নিষিদ্ধ অপকোড)।
প্যাচে বাইটের ঠিকানাগুলি 0x100 ... 0x160 এর মধ্যে রয়েছে। ভাগ্যক্রমে, তাদের অনুমোদিত মান সহ 3 বাইটের যোগফল হিসাবে প্রতিনিধিত্ব করা যেতে পারে:
- 0x7a ইন
bp
- 0x7a বা 0x67 এ
si
বাdi
- তাত্ক্ষণিক মান
বার্তায় বাইটস প্যাচিং OR
0x20 (স্পেস ক্যারেক্টার) এবং একটি ছোট ধ্রুবক (4, 7, 12 বা 14) এ লজিক্যাল করে কাজ করে । ছোট ধ্রুবকটি প্রাথমিকভাবে cx
এবং dx
9 টি (ট্যাব চরিত্র) দ্বারা এবং প্রয়োজনীয়ভাবে INC
বা করার দ্বারা প্রাপ্ত হয় DEC
।
কোড প্যাচিং IMUL
নির্দেশ ব্যবহার করে । ব্রুট-ফোর্স অনুসন্ধান ব্যবহার করে গুণ করার জন্য প্রয়োজনীয় 16-বিট ধ্রুবকগুলি পেয়েছি।
শেষ পর্যন্ত, বার্তার ঠিকানা (0x13b) গুণ দ্বারা প্রাপ্ত হয়। স্থান বাঁচাতে, আমি একটি নির্দেশিকা থেকে একটি ধ্রুবক নিয়েছি, যার মধ্যে একটি তাত্ক্ষণিক মান রয়েছে 0x96d
। এখানে 9
অংশটি একটি ডস প্রিন্ট ফাংশন চয়ন করে এবং 6d
অংশটি একটি নিখরচায় প্যারামিটার। দেখা যাচ্ছে যে 6d
একমাত্র সম্ভাবনা যা গুণনের পরে 0x13b দিতে পারে।
কোড অংশ বিযুক্ত করা:
06BA:0100 686D09 PUSH 096D
06BA:0103 6A09 PUSH +09
06BA:0105 6A09 PUSH +09
06BA:0107 50 PUSH AX
06BA:0108 50 PUSH AX
06BA:0109 6A7A PUSH +7A
06BA:010B 6A7A PUSH +7A
06BA:010D 6A67 PUSH +67
06BA:010F 61 POPA
06BA:0110 41 INC CX
06BA:0111 41 INC CX
06BA:0112 41 INC CX
06BA:0113 094A53 OR [BP+SI+53],CX
06BA:0116 4A DEC DX
06BA:0117 4A DEC DX
06BA:0118 095255 OR [BP+SI+55],DX
06BA:011B 095371 OR [BP+DI+71],DX
06BA:011E 095265 OR [BP+SI+65],DX
06BA:0121 41 INC CX
06BA:0122 41 INC CX
06BA:0123 094A64 OR [BP+SI+64],CX
06BA:0126 4A DEC DX
06BA:0127 4A DEC DX
06BA:0128 4A DEC DX
06BA:0129 095266 OR [BP+SI+66],DX
06BA:012C 694A456C4B IMUL CX,[BP+SI+45],4B6C
06BA:0131 094A45 OR [BP+SI+45],CX
06BA:0134 6953204774 IMUL DX,[BP+DI+20],7447
06BA:0139 CD21 INT 21 (after the code patches itself)
মজাদার ঘটনা: সাধারণত, আমি offset message
হার্ড- 13bh
কোডডের পরিবর্তে ব্যবহার করতাম তবে এই ক্ষেত্রে, কারণ এর ঠিকানাটি বিশ্লেষণের সময় অজানা, তাসমুল 1 কোড বাইট নষ্ট করে 16-বিট তাত্ক্ষণিক অফসেট উত্পন্ন করে:
06BA:0131 098A4600 OR [BP+SI+0046],CX