【WIN32編程】利用匯編寫cs1.6輔助
這篇文章本來在2018.5.1號就寫完發圈子去了,這兩天跟朋友在網吧打單擊才想起來,就順便把內容發上去把
作者:admin-神風
-
用CE找到功能的地址
CS1.6下載地址:https://pan.baidu.com/s/1zaW6FmbZg50WV3EKX_IqHw 密碼: srcs
CE下載地址:https://pan.baidu.com/s/1_tVrikxFx2PAHhmlhWVfFQ 密碼: dsn9
打開遊戲,並利用CE打開遊戲進程
這裏我們以人物金錢和子彈為例,找到人物基址
①查找金錢
進入遊戲後,我們發現金錢數量為800
這時候我們在CE中搜索800
找到141個數據
我們買點子彈
再搜索剩下的錢
通過發現,地址為01A1B9FC上的數值是屏幕上顯示的
地址為04949DA4上的數值才是真正的金錢數量
同理,我們通過更改子彈數量,但是當我們搜索到剩余198個數據的時候,發現之後的子彈無論怎麽更改,這198個數據都隨之變動
我們這裏就靠一個個測試,但我們有個小技巧,就是看地址,發現地址很多都是連續的,我們就找一些在這198個數據中不常見的。
經過排除
選出這些地址做測試,最後得到地址為012CE474的數據是真實子彈的數據(有一個數據是用來迷惑的,更改數值後並沒有什麽卵用)
二、找到人物基址
因為遊戲裏的地址都會變動,比如金錢的地址,血量的地址。
都會隨著遊戲的重啟而變動
但唯一不變的,就是基址,只要通過基址,加上偏移來找金錢、血量的地址
就可以達到在其他的電腦上,也能實現功能了。
我們就通過金錢的地址來找人物的基址
首先我們右鍵地址為04949DA4的數據
點擊“找出是什麽訪問了這個地址”
會出來一個框框,可能剛開始沒數據,我們返回遊戲再買點東西
這時候出現如下數據
我們看mov ecx,[esi+000001CC]這個數據
指針基址可能是=04949BD8
同時通過紅色的數據mov ecx,[esi+000001CC],可以發現,偏移是1CC.
這時候我們用CE再去搜索這個04949BD8地址
一定要勾上Hex再搜索
發現搜索後沒有綠色的地址(CE中綠色地址代表靜態地址也就是基址)
竟然沒有基址,那咱們就繼續往下面搜
經過測試,只有057FCBF8這個地址才有數據
隨便點開一個
指針基址可能是=057FCB7C
偏移上=7C
這次發現一個綠色的地址:025069BC
我們通過CE的功能“手動添加地址”,來驗證我們的基址是不是對的
可以看到720,的確是我們的金錢數量。
到這裏,我們就完工找到人物基址了。
貼上win32編程要用到的功能的基址及偏移
金錢:
血量:
子彈前彈夾:
超市功能:
三、利用win32匯編寫出輔助
竟然已經找出了各個功能的基址及偏移,我們就用最常用的ReadProcessMemory讀取數據,並用WriteProcessMemory寫入數值。
.if eax == ID_TIME1 invoke ReadProcessMemory,hProcess,baseaddr,addr bloodbuf,4,0 add bloodbuf,7Ch invoke ReadProcessMemory,hProcess,bloodbuf,addr bloodbuf,4,0 add bloodbuf,04h invoke ReadProcessMemory,hProcess,bloodbuf,addr bloodbuf,4,0 add bloodbuf,160h invoke WriteProcessMemory,hProcess,bloodbuf,addr nvblood,4,0
上述代碼就是血量基址加偏移的搜索並寫入
接著,我們就創建一個模態窗口用來做一個界面
invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
建立模態窗口的同時要在rc資源文件的窗口屬性中定義成IDC_MODALFRAME
同時利用消息處理機制來達到功能的實現
創建完窗口後,就要找遊戲進程並打開
invoke FindWindow,NULL,addr szCs .if eax invoke GetWindowThreadProcessId,eax,offset pid invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,pid .if eax mov hProcess,eax
在這裏用SetTimer函數來建立一個時鐘,好鎖定我們的值不讓其他程序改變。(這裏千萬不要用死循環去鎖定數值,不然程序有可能會崩潰)
SetTimer,hWnd,ID_TIME1,100,NULL
這裏的SetTimer函數建立了一個名字為ID_TIME1,周期為0.1s(100ms)的時鐘
然後在到消息處理列表添加一個處理WM_TIMER消息的程序
.if eax == WM_TIMER MOV eax,wParam .if eax == ID_TIME1 要執行的程序... .endif .endif
關閉窗口之後,會發送WM_CLOSE消息,同時一定要關閉時鐘
.if eax == WM_CLOSE
invoke KillTimer,hWnd,ID_TIME1
invoke EndDialog,hWnd,NULL
最後利用EndDialog結束模態窗口
下面貼上資源文件cs.rc的代碼
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #include <resource.h> //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #define ICO_MAIN 0x1000 //圖標 #define DLG_MAIN 1 #define IDB_1 1 #define IDC_MONEY 100 #define IDC_BLOOD 101 #define IDC_BULLET 102 #define IDC_SHOP 103 #define IDC_MODALFRAME 104 //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ICO_MAIN ICON "Main.ico" IDB_1 BITMAP "Picture1.bmp" //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DLG_MAIN DIALOG 193, 180, 220, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | IDC_MODALFRAME CAPTION "CS1.6輔助 author:admin-神風" FONT 9, "宋體" { GROUPBOX "功能", -1, 55, 5, 155, 100 AUTOCHECKBOX "修改金錢為16000", IDC_MONEY, 65, 25, 120, 15 AUTOCHECKBOX "鎖定人物血量為255", IDC_BLOOD, 65, 45, 120, 15 AUTOCHECKBOX "鎖定所有槍械前彈夾子彈為50", IDC_BULLET, 65, 65, 120, 15 AUTOCHECKBOX "隨時隨地購物", IDC_SHOP, 65, 85, 120, 15 CONTROL "", -1, "Static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 5, 110, 210, 1 CTEXT "author:admin-神風 QQ:1976604307", -1,5,115,150,20 PUSHBUTTON "退出(&X)", IDCANCEL, 165, 115, 50, 14 CONTROL IDB_1, -1, "Static", SS_BITMAP | WS_CHILD | WS_VISIBLE, 5, 5, 80, 95
以及cs.asm的匯編程序
1 .386 2 .model flat, stdcall 3 option casemap :none 4 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 5 include windows.inc 6 include user32.inc 7 includelib user32.lib 8 include kernel32.inc 9 includelib kernel32.lib 10 include gdi32.inc 11 includelib gdi32.lib 12 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 13 ID_TIME1 equ 1 14 ID_TIME2 equ 2 15 ID_TIME3 equ 3 16 ID_TIME4 equ 4 17 ICO_MAIN equ 1000h 18 DLG_MAIN equ 1 19 IDB_1 equ 1 20 IDC_MONEY equ 100 21 IDC_BLOOD equ 101 22 IDC_BULLET equ 102 23 IDC_SHOP equ 103 24 IDC_MODALFRAME equ 104 25 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 26 .data 27 nvShop db 1 28 nvblood REAL4 255.0 29 nvmoney dd 16000 30 nvbullet dw 50 31 32 .data? 33 hProcess dd ? 34 hInstance dd ? 35 hBmp1 dd ? 36 pid dd ? 37 bloodbuf dd ? 38 moneybuf dd ? 39 bulletbuf dd ? 40 shopbuf dd ? 41 42 43 .const 44 moneyaddr dd 01A1B9FCh 45 baseaddr dd 025069BCh 46 47 szCs db ‘Counter-Strike‘,0 48 Box db ‘System Message‘,0 49 Findsb db ‘Not Find !‘,0 50 Opencg db ‘Open the Successful !‘,0 51 Opensb db ‘Open the failure !‘,0 52 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 53 .code 54 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 55 _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam 56 57 mov eax,wMsg 58 .if eax == WM_CLOSE 59 invoke KillTimer,hWnd,ID_TIME1 60 invoke KillTimer,hWnd,ID_TIME2 61 invoke KillTimer,hWnd,ID_TIME3 62 invoke KillTimer,hWnd,ID_TIME4 63 invoke EndDialog,hWnd,NULL 64 invoke DeleteObject,hBmp1 65 .elseif eax == WM_TIMER 66 MOV eax,wParam 67 .if eax == ID_TIME1 68 invoke ReadProcessMemory,hProcess,baseaddr,addr bloodbuf,4,0 69 add bloodbuf,7Ch 70 invoke ReadProcessMemory,hProcess,bloodbuf,addr bloodbuf,4,0 71 add bloodbuf,04h 72 invoke ReadProcessMemory,hProcess,bloodbuf,addr bloodbuf,4,0 73 add bloodbuf,160h 74 invoke WriteProcessMemory,hProcess,bloodbuf,addr nvblood,4,0 75 .elseif eax == ID_TIME2 76 invoke ReadProcessMemory,hProcess,baseaddr,addr moneybuf,4,0 77 add moneybuf,7Ch 78 invoke ReadProcessMemory,hProcess,moneybuf,addr moneybuf,4,0 79 add moneybuf,1CCh 80 invoke WriteProcessMemory,hProcess,moneybuf,addr nvmoney,4,0 81 invoke WriteProcessMemory,hProcess,moneyaddr,addr nvmoney,4,0 82 .elseif eax == ID_TIME3 83 invoke ReadProcessMemory,hProcess,baseaddr,addr bulletbuf,4,0 84 add bulletbuf,7Ch 85 invoke ReadProcessMemory,hProcess,bulletbuf,addr bulletbuf,4,0 86 add bulletbuf,5D4h 87 invoke ReadProcessMemory,hProcess,bulletbuf,addr bulletbuf,4,0 88 add bulletbuf,0CCh 89 invoke WriteProcessMemory,hProcess,bulletbuf,addr nvbullet,4,0 90 .elseif eax == ID_TIME4 91 invoke ReadProcessMemory,hProcess,baseaddr,addr shopbuf,4,0 92 add shopbuf,7Ch 93 invoke ReadProcessMemory,hProcess,shopbuf,addr shopbuf,4,0 94 add shopbuf,3A8h 95 invoke WriteProcessMemory,hProcess,shopbuf,addr nvShop,4,0 96 .endif 97 .elseif eax == WM_INITDIALOG 98 invoke LoadIcon,hInstance,ICO_MAIN 99 invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax 100 101 invoke LoadBitmap,hInstance,IDB_1 102 mov hBmp1,eax 103 .elseif eax == WM_COMMAND 104 mov eax,wParam 105 .if ax == IDCANCEL 106 invoke KillTimer,hWnd,ID_TIME1 107 invoke KillTimer,hWnd,ID_TIME2 108 invoke KillTimer,hWnd,ID_TIME3 109 invoke KillTimer,hWnd,ID_TIME4 110 invoke EndDialog,hWnd,NULL 111 invoke DeleteObject,hBmp1 112 .elseif ax == IDC_SHOP 113 invoke IsDlgButtonChecked,hWnd,IDC_SHOP 114 .if eax == BST_CHECKED 115 invoke SetTimer,hWnd,ID_TIME4,100,NULL 116 .else 117 invoke MessageBeep,-1 118 invoke KillTimer,hWnd,ID_TIME4 119 .endif 120 .elseif ax == IDC_BLOOD 121 invoke IsDlgButtonChecked,hWnd,IDC_BLOOD 122 .if eax == BST_CHECKED 123 invoke SetTimer,hWnd,ID_TIME1,100,NULL 124 .else 125 invoke MessageBeep,-1 126 invoke KillTimer,hWnd,ID_TIME1 127 .endif 128 .elseif ax == IDC_MONEY 129 invoke IsDlgButtonChecked,hWnd,IDC_MONEY 130 .if eax == BST_CHECKED 131 invoke SetTimer,hWnd,ID_TIME2,2000,NULL 132 .else 133 invoke MessageBeep,-1 134 invoke KillTimer,hWnd,ID_TIME2 135 .endif 136 .elseif ax == IDC_BULLET 137 invoke IsDlgButtonChecked,hWnd,IDC_BULLET 138 .if eax == BST_CHECKED 139 invoke SetTimer,hWnd,ID_TIME3,100,NULL 140 .else 141 invoke MessageBeep,-1 142 invoke KillTimer,hWnd,ID_TIME3 143 .endif 144 .endif 145 .else 146 mov eax,FALSE 147 ret 148 .endif 149 mov eax,TRUE 150 ret 151 _ProcDlgMain endp 152 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 153 start: 154 invoke FindWindow,NULL,addr szCs 155 .if eax 156 invoke GetWindowThreadProcessId,eax,offset pid 157 invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,pid 158 .if eax 159 mov hProcess,eax 160 invoke MessageBox,NULL,offset Opencg,offset Box,MB_OK 161 invoke GetModuleHandle,NULL 162 mov hInstance,eax 163 invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL 164 invoke ExitProcess,NULL 165 .else 166 invoke MessageBox,NULL,offset Opensb,offset Box,MB_OK 167 .endif 168 .else 169 invoke MessageBox,NULL,offset Findsb,offset Box,MB_OK 170 invoke ExitProcess,NULL 171 .endif 172 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 173 end startView Code
最後配上一張程序運行圖
【WIN32編程】利用匯編寫cs1.6輔助