【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 start
最后配上一张程序运行图