免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
本次游戲沒法給
內容參考于:微塵網絡安全
工具下載:
鏈接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取碼:6tw3
復制這段內容后打開百度網盤手機App,操作更方便哦
上一個內容:8.x86游戲實戰-OD詳解
OD使用過程中會經常卡死,只能通過任務管理器結束,然后重新來
有時候OD附加完進程,下圖紅框位置是空白的(什么也沒有)
![]()
這時點一下下圖紅框位置的C就好了
![]()
然后有時候進程的線程會停止,需要檢查一下
![]()
如果有線程停止了(不是激活狀態),如下圖點擊 Resume All threads讓線程啟動
![]()
學習匯編代碼,就要寫代碼,就要執行代碼,最簡單的方式就是使用OD附加一個進程,然后找這個進程一直運行的代碼,然后在一直運行的代碼里下斷點(后面就能看到斷點是什么東西了),下了斷點之后寫匯編代碼,然后使用斷點的功能一行一行的執行代碼
進程中什么位置會一直執行?ws2_32.send,send函數是網絡程序用于給服務器發送數據包的(有的游戲不使用send,其它的后面在寫)
OD附加進程,這里多一嘴OD也可以不用管理員啟動也能附加進程,用不用管理員要看要被附加的進程,所以為了省心直接全用管理員啟動就好了
鼠標按住下圖紅框位置,然后拖到要附加的程序窗口上,然后放開鼠標
![]()
然后點是就可以了
![]()
然后會到入口點,如下圖,這時被附加程序會卡死,OD的狀態如下圖也是暫停,這時點下圖紅框位置讓附加進程運行起來
![]()
OD附加完進程之后,點擊下圖紅框位置,也就是點擊代碼段區域
![]()
然后按ctrl+g,然后輸入 ws2_32.send,然后點OK,如果點了OK沒反應,那就重新操作幾次
![]()
然后就能跳轉到send函數了,跳轉到send函數的頭部,也就是send函數的第一行,ws2_32是模塊名,ws2_32.send意思是跳轉到ws2_32模塊里的send函數,有多個函數叫send所以需要指定模塊名,然后為什么用ws2_32模塊里的send函數?別管為什么這里記住用ws2_32里的send函數就行,后面就能知道原因了
![]()
首先選中下圖紅框位置(send函數的第一行)
![]()
然后按f2,下圖紫色框框起來的位置就變成紅色了,這說明這里下了斷點,當程序執行到這時會卡主
![]()
然后在程序做一個可以發送數據包的操作,停下來(或者說斷下來)的樣子,如下圖
![]()
然后多選幾行代碼,然后鼠標右擊選擇填充為NOP
![]()
NOP的意思是沒有代碼,處理器執行到NOP時不做任何操作,然后繼續往下執行,NOP的硬編碼是0x90
![]()
然后開始寫mov指令,雙擊下圖紅框位置
![]()
然后輸入mov eax, 1
![]()
然后點匯編,點了匯編按鈕之后窗口不會自動關閉,需要手動關
![]()
然后就有了 mov eax, 1 代碼
![]()
然后接下來按 f8,讓它運行一下看看效果,如下圖,可以看到eax變成了1
![]()
然后寫mov ecx, [0x1484438],取地址的值
![]()
然后點了匯編之后,它給我們添加dword ptr,ptr表示地址,dword是數據寬度(4字節寬度)
![]()
然后按f8執行代碼看看效果,這就是一個取內存地址里面值的效果
![]()
然后還能寫 mov [0x1484438], 2,給內存地址里的值修改掉
![]()
然后點匯編的時候它讓寫一個操作數大小
![]()
這里寫一個dword,4字節大小
![]()
然后點匯編就變成了下圖的樣子
![]()
然后按f8執行代碼的效果,游戲崩潰了,這說明改成功了,我們是把0x1484438里的值改成了2,0x1484438原本的值是一個內存地址,然后2不是一個正常的內存地址,所以它蹦了
![]()
然后如下圖紅框,有的時候寫了內存地址,點擊匯編之后,它會變成英文,這是翻譯的問題,它把內存地址翻譯成了函數名(一般之后函數才會被翻譯成英文)
![]()
c/c++寫匯編,下方的代碼是32位的匯編寫法,64位匯編沒法用_asm寫,64位的匯編后面用到的時候會寫
![]()
#include <iostream> #include "Windows.h"int main() {int a = 1;int b = 1;_asm {mov a,2mov eax,3mov b, eax}printf("%d, %d", a, b); }
?