一行C語言關(guān)機代碼進階之路,細節(jié)拉滿,輕松解讀復雜代碼
c語言關(guān)機程序最終版
- #include <stdio.h>
- #include <stdlib.h>
- #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;
- }
你沒看錯,以上代碼就可以實現(xiàn)程序關(guān)機。
知識刨析之宏操作
- #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##i
- int 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 <stdio.h>
- #include <stdlib.h>
- int main()
- {
- system((char*)(int []) { 1953851507, 1853321060, 7548192, 7613728, 3159584 });
- return 0;
- }
復合文字 其實是C語言匿名數(shù)組的定義,返回的是數(shù)組首地址,如下程序:
- int iArray[]={10,20}; //普通數(shù)組
- int *pArray=(int []){10,20}; //一個復合文字 返回一個數(shù)組指針
知識刨析之數(shù)據(jù)存儲
- //根據(jù)復合文字,程序可簡化如下:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int array[]={ 1953851507, 1853321060, 7548192, 7613728, 3159584 };
- system((char*)array);
- return 0;
- }
而稍微學過C語言的同學應(yīng)該知道關(guān)機是指令是:system("shutdown -a -t 60"); 故這串數(shù)據(jù)應(yīng)該表示的shutdown -a -t 60,而數(shù)據(jù)存儲到計算機中都是數(shù)字,所以可以借助vs開發(fā)工具 查看指令存儲內(nèi)存數(shù)據(jù)。先寫如下程序:
- #include <stdio.h>
- int main()
- {
- char str1[] = "shutdown" ;
- char str2[] = " -s" ;
- char str3[] = " -t" ;
- char str4[] = " 60" ;
- }
將指令分為4個模塊,進入斷點測試,打開內(nèi)存窗口,具體如下圖:
將鼠標放在變量上,然后轉(zhuǎn)接到內(nèi)存1的地址欄中查詢即可:
關(guān)鍵的一步來了,點擊內(nèi)存中的數(shù)據(jù),把數(shù)據(jù)調(diào)整為4個字節(jié),并且改為無符號顯示即可,如下圖:
這就是我們要的指令的整數(shù)表示法。其他指令相同操作即可,最終可得到1953851507, 1853321060, 7548192, 7613728, 3159584,當然你有興趣也可以用浮點數(shù)表示。