1.C語言中的數(shù)據(jù)類型
常量:就是程序中不可變化的量抛姑,是不可以被賦值的逮栅。
通過#define定義常量裆操,在C語言中叫做宏定義。實(shí)例:#define x 100
const定義一個(gè)只讀變量疗绣,即在初始化賦值之后,不能對const所定義的變量進(jìn)行任何修改铺韧。需要注意的是一定要初始化賦值多矮,不然以后就不能賦值了。
字符串常量:在C語言當(dāng)中“”引用的字符串都是字符串常量祟蚀,常量一旦定義也是不可以被修改的工窍。
位:計(jì)算機(jī)內(nèi)部都是二進(jìn)制的,一個(gè)二進(jìn)制的位前酿,就叫一個(gè)位患雏,也稱bit。小寫的b代表bit(位)罢维。
字節(jié):八位二進(jìn)制稱為一個(gè)字節(jié)Byte淹仑。是計(jì)算機(jī)內(nèi)存最小單位,主要是位太小了肺孵,不能作為內(nèi)存的最小單位匀借,大寫的B代表Byte(字節(jié))
字:兩個(gè)字節(jié)稱為一個(gè)字word。兩個(gè)字稱為一個(gè)雙字(dword)平窘。
sizeof關(guān)鍵字:sizeof是計(jì)算數(shù)據(jù)在內(nèi)存當(dāng)中占多大空間吓肋,單位是字節(jié),不是函數(shù)瑰艘,是運(yùn)算符是鬼。sizeof返回值數(shù)據(jù)類型是size_t,size_t類型數(shù)據(jù)一定是個(gè)無符號數(shù)紫新,也就是一個(gè)大于零的數(shù)均蜜。
int類型:一個(gè)int類型占據(jù)4個(gè)字節(jié)大小的內(nèi)存,在16位操作系統(tǒng)下int是2個(gè)字節(jié)芒率,在32和64位系統(tǒng)下的int是4個(gè)字節(jié)囤耳。數(shù)據(jù)類型決定了內(nèi)存空間的大小,如int a代表著開辟了4個(gè)字節(jié)大小的內(nèi)存空間。
小端對齊:高地址放高位充择,低地址放低位德玫。
大端對齊:高地址放低位,低地址放低位聪铺。
對于UnixCPU都是按照大端對齊存儲數(shù)據(jù)的化焕。
對于x86構(gòu)架CPU、ARM是按照小端對齊存儲數(shù)據(jù)的铃剔。
%x表示輸出小寫的十六進(jìn)制字符撒桨,如a、b键兜、c凤类、d、e普气、f
%X表示輸出大寫的十六進(jìn)制字符谜疤,如A、B现诀、C夷磕、D、E仔沿、F
%o表示輸出八進(jìn)制數(shù)據(jù)坐桩。
在32位操作系統(tǒng)下:
short=2個(gè)字節(jié)
long和int一樣是4個(gè)字節(jié)
long long是8個(gè)字節(jié)
在64位操作系統(tǒng)下:
int是4個(gè)字節(jié)
long在多數(shù)64位操作系統(tǒng)下是8個(gè)字節(jié)
unsigned表示無符號,無符號需要聲明封锉,signed是默認(rèn)的绵跷。
如果是匯編編寫的運(yùn)算,不要讓CPU通過內(nèi)存的讀寫來運(yùn)算成福,而是通過寄存器來運(yùn)算碾局。
char:是字符類型,一個(gè)字節(jié)奴艾。
%c表示輸出一個(gè)字符净当。
ASCII碼值:字符a對應(yīng)ASCII碼值97,字符A對應(yīng)65蕴潦,A和a的規(guī)律是相差32像啼,按十六進(jìn)制來看就是0x20。
轉(zhuǎn)義字符:\a報(bào)警品擎、\b退格埋合、\n換行备徐、\r回車萄传、\t制表、\\斜杠、\'單引號秀菱、\"雙引號振诬、\?問號
浮點(diǎn)數(shù):float(%f)、double(%f)衍菱、long double(%lf)類型
volatile關(guān)鍵字:告訴編譯器不要自作聰明的優(yōu)化代碼(把變量優(yōu)化到寄存器里面計(jì)算)赶么,只要是volatile類型變量,每一步都要去內(nèi)存中讀取數(shù)據(jù)脊串。
register關(guān)鍵字:恰恰與volatile關(guān)鍵字相反辫呻,建議編譯器register類型變量只要在寄存器中用就好了。注意只是建議琼锋。
字符串是內(nèi)存中一段連續(xù)的char空間放闺,以'\0‘結(jié)尾
%d對應(yīng)int類型:有符號的十進(jìn)制整數(shù)
%u對應(yīng)unsigned int類型:無符號十進(jìn)制整數(shù)
%o對應(yīng)unsigned in類型:無符號8進(jìn)制整數(shù)
%x或%X對應(yīng)unsigned int類型:無符號16進(jìn)制整數(shù)
%hd對應(yīng)short int類型:短整型
%hu對應(yīng)unsigned short int類型:無符號短整型
%f對應(yīng)float類型:單精度浮點(diǎn)數(shù)
%lf對應(yīng)或double類型:雙精度浮點(diǎn)數(shù)
%e或%E對應(yīng)double類型:科學(xué)計(jì)數(shù)法表示的數(shù)
%c對應(yīng)char類型:字符型,可以進(jìn)行相對應(yīng)的ASCII碼轉(zhuǎn)換
%s或%S對應(yīng)char *或wchar_t *類型:字符串
%p對應(yīng)void *類型:以16進(jìn)制形式輸出
l字符可以附加在d/u/x/o面前缕坎,表示長整型
-字符表示左對齊
m:代表一個(gè)整數(shù)怖侦,表示數(shù)據(jù)的最小寬度,可以用0補(bǔ)上也可以用空格補(bǔ)上
0:將輸出的前面補(bǔ)上0谜叹,直到指定列寬為止
N:代表一個(gè)整數(shù)匾寝,寬度至少N位,不夠以空格填充
#define _CRT_SECURE_NO_WARNINGS:安全模式
左值:在等號左邊荷腊,表示可以被更改的數(shù)據(jù)對象艳悔,
右值:能賦給左值的量,在等號右邊停局。
2.小案例
該案例用用到MessageBoxA函數(shù)很钓,而該函數(shù)包含在windows.h頭文件中,所以預(yù)處理要加上該頭文件董栽,首先打開VS2013码倦,具體代碼內(nèi)容如下:
具體實(shí)現(xiàn):
成功實(shí)現(xiàn)該程序,那么如何將該程序注入別的應(yīng)用程序中呢锭碳?這時(shí)候就需要一個(gè)注入的工具袁稽,如:
而且代碼也需要改動(dòng)以下,注入是注入別的應(yīng)用程序擒抛,所以是以應(yīng)用程序擴(kuò)展的方式注入推汽,也就是.dll文件。代碼做如下改動(dòng):
并且也要對該項(xiàng)目的屬性配置也要改動(dòng)一下歧沪,不能作為.exe歹撒,要改為.dll,如下:
.dll 不是可執(zhí)行文件诊胞,所以只能編譯它暖夭,ctrl+F5。接下來是注入到別的程序,這里我們以百度云為例迈着,打開注入工具
選好路徑竭望,和執(zhí)行函數(shù),如
?
注入成功
現(xiàn)在你打開任務(wù)管理器裕菠,看到的是這個(gè)中獎(jiǎng)信息是百度網(wǎng)盤這個(gè)軟件發(fā)出的咬清。我們可以改成李彥宏請你共進(jìn)晚餐之類的,在這里我們只需要了解應(yīng)用擴(kuò)展文件.dll是如何注入到程序當(dāng)中去的就可以了奴潘。
3.外掛小案例
以植物大戰(zhàn)僵尸為例旧烧,首先需要一個(gè)工具叫Cheat Engine,打開植物大戰(zhàn)僵尸和Cheat Engine画髓,如:
在Cheat Engine上選擇植物大戰(zhàn)僵尸程序粪滤,如
接下來我們要尋找陽光這個(gè)變量,先在Cheat Engine上輸入值50雀扶,尋找一下杖小,經(jīng)過首次掃描,找到這么多的內(nèi)存地址愚墓,
接下來予权,看游戲中的陽光的值加到100,如
我們輸入100浪册,再次掃描扫腺,就找到了,如:
這個(gè)1DAF34D0就是陽光這個(gè)變量的地址村象,我們可以編寫C語言程序笆环,去改變它的值,程序代碼內(nèi)容如下:定義一個(gè)指針變量厚者,指向它躁劣,然后賦新值給指針即可。
打開項(xiàng)目屬性库菲,設(shè)置好配置類型即可账忘,如下 ? ? 然后編譯一下,注入植物大戰(zhàn)僵尸即可
這就是外掛的簡單演示熙宇。
4.自動(dòng)操作電腦案例
直接上代碼把鳖擒!
這里用到的函數(shù)不多,就是休眠函數(shù)Sleep烫止、鍵盤輸入函數(shù)keybd_event蒋荚、WinExec函數(shù)、mouse_event函數(shù)馆蠕、SetCursorPos函數(shù)這五個(gè)函數(shù)期升,而且都包含在Windows.h頭文件中广鳍,這樣就可以自動(dòng)打開notepad,和自動(dòng)輸入我愛你了吓妆,自動(dòng)保存了;