学习版本:CS1.6 v3248
子弹:[[[[cstrike.exe+11069BC]+7C]+5EC]+CC]
护甲:[[[[cstrike.exe+11069BC]+7C]+04]+1BC]
生命:[[[[cstrike.exe+11069BC]+7C]+04]+160]
金钱:[[[cstrike.exe+11069BC]+7C]+1CC]
判断当前金钱是否足够:[cstrike.exe+61B9FC]
基本思路:换枪-换图-重启
每射一发子弹扫描一下,得到196个地址
全部加入候选,然后采用二分法,每次取一半数值进行操作
把数值从21改成12,如果马上变回21,删掉这一半
把数值从21改成12,如果另一半全部变12,删掉另一半
把数值从21改成12,如果另一半有部分不变成12,会发现发射一颗子弹后子弹是20,即改值失败,删掉这一半(或者只保留没变的地址)
最后剩下一个黑址,找到是什么改写了这个地址,射一发,得到esi+偏移CC
新的扫描十六进制esi的值,得到四个黑址,切换武器,只有两个有变化,添加这两个到候选
分别对这两个候选的地址找到是什么访问了这个地址,一个偏移是5EC,一个偏移是5F0,但是都同自于同一个基址(本笔记测试时是0B910008)
新的扫描十六进制0B910008,得到十多个黑址,我们尝试切换地图,虽然子弹最终地址是变了,但是[0B910008+5EC]+CC依然正确指向当前的武器子弹数,换言之0B910008这个地址仍然有效,把十多个黑址中没有指向0B910008的删掉,循环换图并删除,删剩十个以下的黑址
对剩下的黑址全部尝试找到是什么访问了这个地址,只有一个黑址得到有效指令,是eax+偏移7C
新的扫描十六进制eax的值,会看到两个绿址和若干黑址,加入机器人后发现cstrike.exe+1033240的值会变化(遍历其他玩家的子弹),故删掉
得到[[[[cstrike.exe+11069BC]+7C]+5EC],重启游戏,依然正确,完
开局买护甲搜100,买炸弹炸自己,再搜剩余生命值,如此循环,可以得到一个绿色地址与一个偏移地址
我们同时修改两个地址的值,会发现马上变回原值,修改失败,表示这两个地址都不对
重新开局买护甲搜单浮点的100,买炸弹炸自己,再搜剩余生命值,如此循环,会得到一个存小数的黑色地址(本测试中是0C15DDB8),他的整数部分与游戏屏幕显示的值相同
假设这个地址是80,我改成1,再买炸弹买自己,护甲变0,有效,下面开始找他的完整偏移路径
找出是什么改写了这个地址,炸自己,得到1FD0F2F1 - D9 9E BC010000 - fstp dword ptr [esi+000001BC] <<,其中esi=0C15DBFC
新的扫描十六进制,数值是0C15DBFC,得到两个黑色地址
刷新地图,0C15DDB8的值变0,再买护甲,变100,仍然正确,而两个黑色地址仍然指向0C15DBFC,也正确,下面开始对两个地址进行讨论(就是不断这么找,总会找到)
对第一个地址228C300C找出是什么访问了这个地址,得到esi+04=228C300C,其中esi=228C3008,新的扫描十六进制228C3008,得到7个地址,刷新地址,有一个变成0删掉,然后对这六个地址分别进行找出是什么访问了这个地址(就是不断这么找,总会找到)
对2276C0AC找出是什么访问了这个地址,无结果,买炸弹炸自己,无结果,删去这个地址
对0C15DBF8找出是什么访问了这个地址,得到eax+7C,其中eax=0C15DB7C,新的扫描十六进制0C15DB7C,有两个基地址,分别生成完整偏移指针[[[cstrike.exe+1033240]+7C]+04]+1BC与[[[cstrike.exe+11069BC]+7C]+04]+1BC
重启游戏,再买炸弹炸自己,发现只有cstrike.exe+11069BC为基地址的数值是保持正确的,得到结果
买炸弹炸自己,搜剩余生命值,如此循环,发现找不到数据
同护甲一样猜测是浮点数,搜剩余生命值,如此循环,得到194个值
全部加入候选,然后采用二分法,每次取一半数值进行操作
把数值从18改成99,如果马上变回18,删掉这一半
把数值从18改成99,如果另一半变99,删掉另一半
把数值从18改成99,如果有部分不变成99,保留没变的地址
最后得到一个地址,是他改了之后其他地址都跟着改的,然后验证他的正确性,刷新地图,把血从100改成1,然后较远距离炸自己死亡,就表示正确
找出是什么改写了这个最终地址,得到偏移eax+160,其中eax=0C1EBBFC
先十六进制首次搜索0C1EBBFC(因为无论是基地址还是寄存器还是寄存器加偏移,这三种情况都是先得到某个内存地址再读出里面的值),得到两个黑色地址,炸自己没变化,刷新地图后最终地址正确,两个黑色地址也没变化,分别讨论
取第一个地址,找到是什么访问了这个地址,无结果,炸自己,发现只能得到他本身访问了这个地址,不是由基地址偏移产生的,删掉
取第二个地址,找到是什么访问了这个地址,得到esi+04,其中esi=22CF0008,(这里可以猜测一个结论:就是找到是什么访问这个地址时有不断刷新的往往就是要找的)
新的扫描十六进制22CF0008,得到9个地址,刷新地图,得到三个地址,下面同样是对三个地址进行讨论
我们对三个地址找到是什么访问了这个地址,其中两个地址我炸自己都没结果,删掉,还有一个不断刷新访问计数,得到eax+7C,其中eax=0C1EBB7C
新的十六进制搜索0C1EBB7C,得到两个绿色地址:cstrike.exe+1033240与cstrike.exe+11069BC,添加两个指针,[[[cstrike.exe+1033240]+7C]+04]+160,[[[cstrike.exe+11069BC]+7C]+04]+160
重启游戏,买炸弹炸自己,只有[[[cstrike.exe+11069BC]+7C]+04]+160正确,得到结果
买装备,利用金币值查找,得到一个绿色地址,一个黑色地址
修改这两个值,并且购买东西,可以发现黑色地址是真正能修改金币值的地址,而绿色地址是显示在屏幕上面的地址,且每次购物时会先与绿色地址的值比较,只有足够的情况下才会读取黑色地址的值,计算后再刷新绿色地址
对黑址找出是什么修改了这个地址,得到esi+1CC,其中esi=06ACC0A0
新的扫描十六进制06ACC0A0,得到五个黑址,全部查看是什么访问了这个地址,然后买东西,三个没有指令,删掉,一个只有个je,删掉,只有一个得到eax+7C,其中eax=0C28EB7C
新的扫描0C28EB7C,得到cstrike.exe+1033240与cstrike.exe+11069BC两个基地址,创建两个指针,[[cstrike.exe+1033240]+7C]+1CC与[[cstrike.exe+11069BC]+7C]+1CC
重启游戏,发现两个指针依然正确,买装备,仍正确,修改任意一个指针的值,另一个也会马上跟着修改,得到结果(后来深入学习,发现cstrike.exe+1033240这个基址用于遍示表示机器人/其他玩家的数值)
shift++:加机器人
F1:扔C4
F2:拆C4
`:控制台
1:主枪
2:副枪
3:小刀
4:炸弹
5:C4
6:取消炸弹选择显示
-:减一个机器人
+:加一个机器人
tab:显示玩家列表
q:切换武器
w:前
r:装弹
t:喷漆
y:say
u:teamsay
o:买装备
]:查看当前装备
a/s/d:左后右
f:电筒
g:扔当前装备
h:控制列表
、:显示当前时间
enter:发射
z/x/c:无线电
v/ctrl:蹲下
b:购买菜单
·:控制台
空格:跳