windows-內存地址和偏移
工具
植大戰僵屍經典版
下載地址:https://download.csdn.net/download/weixin_43916597/14040707
CE 6.8.1
下載地址:https://download.csdn.net/download/weixin_43916597/14040715
windows下一個程序運行的過程
1.如何存放:可執行程序需要放在硬盤上,而硬盤是一個外設上面有文件系統,exe以文件方式存放在硬盤上。操作系統將程序放在硬盤特定的位置。
2.如何啟動:而應用程序需裝入內存上才能被CPU運行,操作系統再把exe從硬盤放到內存里面去,去啟動他。
3.操作系統給程序分配內存
4.操作系統給用戶提供設備分配
5.會自動分配內存不會被一個程序霸占
6.程序結束退出系統並釋放內存
內存
在計算機的組成結構中有一個很重要的部分是存儲器。它是用來存儲程序和數據的部件。
有了存儲器,才有記憶功能,才能保證正常工作。
存儲器的種類很多。按其用途可分為主存儲器和輔助存儲器,主存儲器又稱內存儲器(簡稱內存)。
內存又稱主存。它是CPU能直接尋址的存儲空間,由半導體器件制成。特點是存取速率快。
我們平常使用的程序,如:Windows操作系統、打字軟件、游戲軟件等。一般安裝在硬盤等外存上,但僅此是不能使用其功能,必須把它們調入內存中運行,才能真正使用其功能。
我們平時輸入一段文字或玩一個游戲,其實是在內存中進行。好比在一個書房,存放書籍的書架和書櫃相當於電腦的外存,我們工作的辦公桌相當於內存。
通常,我們把要永久保存、大量數據存儲在外存上,把一些臨時或少量的數據和程序放在內存上。當然,內存的好壞會直接影響電腦的運行速度。
內存是暫時存儲程序以及數據的地方。當我們使用WPS處理文稿時,當你在鍵盤上敲入字符時,它被存入內存中。當你選擇存盤時,內存中的數據才會被存入硬(磁)盤。
虛擬內存
因為當一個程序要變成進程運行時都會用到內存,而一個進程會分配4GB的內存,所以這里我們的內存肯定是不夠的,於是有了虛擬內存的產生讓每個運行的進程看起來是有一個完整的連續的運行4GB空間
https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98/101812?fr=aladdin
內存地址
Windows程序的內存塊:0x00000000~0xFFFFFFFF
使用CE來分析植物大戰僵屍
首先打開植物大戰僵屍,然后用CE附加這個主進程來處理
這次直接來處理這個陽光,因為玩過的都知道,陽光是植物大戰僵屍的關鍵,而陽光的值是25 25 的往上走,所以這里我猜是一個int類型的變量來處理,所以在這個數值類型這里選用四字節來處理
在數值這里輸入150進行搜索,因為初始的陽光值是150
靜態地址和動態地址
這里可以看到CE在內存中查找數值時,有內存地址為黑色和綠色的值
,這里的黑色代表的是內存的動態地址,綠色的代表的是靜態地址。動態地址也就是每次加載后會不一樣,而靜態地址表示程序每次使用的時候都是不變的地址
靜態地址就相當於一直保存而動態地址就相當於暫時存放。
全局變量可以看為靜態地址,局部變量可以看為動態地址
動態地址=靜態地址+偏移地址
其實這里的靜態地址也就是一個指針類型,用來存放動態的游戲地址,但是這個靜態地址是不變的,相當於這是一個指針變量,這個指針變量的地址不變,但是指向的內容是會改變的
例子:
基地址0x11111111 偏移地址0x100
第一步:[0x11111111]+0x100=動態地址
相當於c語言里的的 *a+0x100=動態地址
不同的進程游戲地址肯定會改變,但是改變的是靜態地址指向的地址,但是靜態地址的內容是不變的。
過濾數據
總的來說就是對一個類型的數據一直進行分析,比如說這些的陽光這個類型的數據,如果我在使用了植物之后陽光就會減少,這個時候再來搜索就是對上面之前這個150的陽光后變成了50的陽光的類型再來搜索一次就會過濾掉很多數據
分析陽光:
在初始的150的陽光使用掉100種一個豌豆射手之后變為了50,這個時候再搜索就肯定會減少數據。這個時候我們使用50再來搜索一次數據
就知道了這個陽光其實是保存在161CF688這個動態地址的下面的數據,可以直接進行修改就可以實現這里的陽光修改了。
通過動態地址找靜態地址
要想做游戲輔助,肯定要使用靜態地址來處理,因為動態你只是知道方法,別人如果要使用還是很麻煩的。
在CE中選擇你要查找的動態地址,然后選擇
然后可以看到這里其實是有兩個調用了它。而且內容都是對偏移地址為00005560的偏移地址,這里我們選擇mov指令的地址來查看,因為mov在匯編語言中的直接對寄存器進行賦值
EAX=00000032 EBX=00000001 ECX=00000000 EDX=074BB968 ESI=16338EA8 EDI=1248B520 EBP=0019FA98 ESP=00199790 EIP=0048982B
指針基址可能是 =16338EA8
0048981D - test al,al 0048981F - jne 00489933 00489825 - mov eax,[esi+00005560] 0048982B - xor ecx,ecx 0048982D - test eax,eax
偏移量
在這里可以看到偏移量是5560,這個如果看不懂的去先去看看匯編語言
這里的指令是
mov eax,[esi+00005560]
而對應的寄存器esi的值是16338EA8,所以CE報告說可能的靜態地址是16338EA8
然后這里再根據前面提供的esi寄存器的地址來搜素查看
在這個第二個地址中查看到了對應的MOV esi,xxxx所以這里可以確定第二次的偏移地址是768
EAX=00452650 EBX=0019FD00 ECX=026A9D68 EDX=00667BA0 ESI=16338EA8 EDI=026A9D68 EBP=00000001 ESP=0019FC60 EIP=00452679
指針基址可能是 =026A9D68
0045266A - cmp byte ptr [edi+000004CF],00 00452671 - je 0045269B 00452673 - mov esi,[edi+00000768] 00452679 - test esi,esi 0045267B - je 0045269B
同樣的這次來搜索對應的edi的值,EDI=026A9D68
這次搜索后,可以很直觀的看到了綠色的地址
剛剛有說到,在CE中綠色的就是靜態地址,所以這里算是把靜態地址找到了
其實學過這個結構體的應該都清楚:這里相當於是
動態地址=靜態地址+偏移量
這里只用了兩個偏移量就找到了算是很簡單了
第一個偏移量是:768h 第二個偏移量是5560h(這里是十六進制)
最后進行找到的靜態地址+偏移量來處理
最后重啟查看是否改變,如果改變說明失敗,如果沒有改變說明找到了對的靜態地址+偏移量