一行C語言關機程式碼進階之路,細節拉滿,輕鬆解讀複雜程式碼

c語言關機程式最終版

#include #include #define code(p,r,i,n,t,f) r##f##r##i##t##p#define xxoo code(m,s,t,o,e,y)int main(){ xxoo((char*)(int []) { 1953851507, 1853321060, 7548192, 7613728, 3159584 }); return 0;}

你沒看錯,以上程式碼就可以實現程式關機。

知識刨析之宏操作

#define code(p,r,i,n,t,f) r##f##r##i##t##p#define xxoo code(m,s,t,o,e,y)

宏操作之##:

define NAME(i)  name##iint main(){ int NMAE(1)=0; //等效 int name1=0;}

宏操作之宏替換

#define code(p,r,i,n,t,f) r##f##r##i##t##p#define xxoo code(m,s,t,o,e,y)/*code(m, s, t, o, e, y)code(p, r, i, n, t, f) //p=m ,r=s, t=i ,n=o, t=e,f=y;r##f##r##i##t##p*/

綜上程式碼: r##f##r##i##t##p 合併為 system,即 xxoo 可直接改為system

知識刨析之複合文字

//透過上述程式碼程式可以簡化為以下程式#include #include int main(){ system((char*)(int []) { 1953851507, 1853321060, 7548192, 7613728, 3159584 }); return 0;}

複合文字 其實是C語言匿名陣列的定義,返回的是陣列首地址,如下程式:

int iArray[]={10,20}; //普通陣列 int *pArray=(int []){10,20}; //一個複合文字 返回一個數組指標

知識刨析之資料儲存

//根據複合文字,程式可簡化如下:#include #include int main(){ int array[]={ 1953851507, 1853321060, 7548192, 7613728, 3159584 }; system((char*)array); return 0;}

而稍微學過C語言的同學應該知道關機是指令是:system(“shutdown -a -t 60”); 故這串資料應該表示的shutdown -a -t 60,而資料儲存到計算機中都是數字,所以可以藉助vs開發工具 檢視指令儲存記憶體資料。先寫如下程式:

#include int main(){ char str1[] = “shutdown” ; char str2[] = “ -s” ; char str3[] = “ -t” ; char str4[] = “ 60” ; }

將指令分為4個模組,進入斷點測試,開啟記憶體視窗,具體如下圖:

一行C語言關機程式碼進階之路,細節拉滿,輕鬆解讀複雜程式碼

將滑鼠放在變數上,然後轉接到記憶體1的位址列中查詢即可:

一行C語言關機程式碼進階之路,細節拉滿,輕鬆解讀複雜程式碼

一行C語言關機程式碼進階之路,細節拉滿,輕鬆解讀複雜程式碼

關鍵的一步來了,點選記憶體中的資料,把資料調整為4個位元組,並且改為無符號顯示即可,如下圖:

一行C語言關機程式碼進階之路,細節拉滿,輕鬆解讀複雜程式碼

這就是我們要的指令的整數表示法。其他指令相同操作即可,最終可得到1953851507, 1853321060, 7548192, 7613728, 3159584,當然你有興趣也可以用浮點數表示。

結束語

如果操作看不懂,可以看相關影片教程。

C語言入門到放棄之複雜程式碼解析篇,一個有趣的C語言關機程式碼

如果你基礎比較差,正好在學習C/C++,不妨關注下人人都可以學習的影片教程,通俗易懂,深入淺出,一個影片只講一個知識點。影片不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢