相信大家都玩过这个日本人做的小游戏罢,本人由于反应不太快,最多只玩到109层。在看雪论坛游荡了一段时间,学到不少东西,也想自己改造一下这个程序。于是按照lzqgj大侠的“打造一个游戏成无敌版”的方式搜索血条的内存地址,结果无法找到改内存地址。我用的是(GE6.4版)。
回想游戏中计算血量的方式,这个值似乎是跟血条这个位图有关。于是先用exesc6.5打开游戏资源,可以发现血条位图的大小为96x16。然后使用OllyDbg打开游戏,查找BitBlt函数,得到很多地址,但是根据我们上面的分析,可以来到
.text:00404AC5 mov [ebp+var_4], eax
.text:00404AC8 mov eax, [ebp+arg_0]
.text:00404ACB cmp dword ptr [eax+1170h], 0;<---血量值
.text:00404AD2 jge loc_404AE5 ;<---大于零,画血条
.text:00404AD8 mov eax, [ebp+arg_0] ;<--小于零,画"Gemaover"
.text:00404ADB mov dword ptr [eax+1170h], 0
.text:00404AE5
.text:00404AE5 loc_404AE5: ; CODE XREF: sub_404AA6+2Cj
.text:00404AE5 mov eax, [ebp+arg_0]
.text:00404AE8 cmp dword ptr [eax+1310h], 2
.text:00404AEF jz loc_404B45
.text:00404AF5 push 0CC0020h ; DWORD
.text:00404AFA mov eax, [ebp+arg_0]
.text:00404AFD mov eax, [eax+1170h]
.text:00404B03 shl eax, 4
.text:00404B06 push eax ; int
.text:00404B07 push 180h ; int
.text:00404B0C mov eax, [ebp+arg_0]
.text:00404B0F mov eax, [eax+1380h]
.text:00404B15 push eax ; HDC
.text:00404B16 push 10h ; int
.text:00404B18 push 60h ; int
.text:00404B1A push 20h ; int
.text:00404B1C mov eax, [ebp+arg_0]
.text:00404B1F cmp dword ptr [eax+1310h], 1
.text:00404B26 sbb eax, eax
.text:00404B28 and eax, 0FFFFFED8h
.text:00404B2D add eax, 158h
.text:00404B32 push eax ; int
.text:00404B33 mov eax, [ebp+arg_0]
.text:00404B36 mov eax, [eax+4]
.text:00404B39 push eax ; HDC
.text:00404B3A call ds:BitBlt
这个BitBlt函数就是当血量值变化时改变血条的绘图函数了。由此可以分析到[eax+1170h]是保存的血量值。这时就可以使用lzqgj大侠的方式随意改血了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)