本帖最后由 yiting888 于 2021-8-7 10:14 编辑
1、背景
最近重玩太阁5,玩玩发现的时候,卡片技能用过了,就不能再用了,这个设定开发者原来是为了游戏更加有挑X性,但是我想可以重复就好了。 所有了这次逆向的过程。
2、目标:
合战,野站时,要使合战卡片技能可以重复使用。
3、工具 : IDA ,OD ,CE脚本(找了好久)
4、过程
结合IDA分析:
(此处有图片,但是无法上传,说不良信息,完全搞不明白。总之,就是图片不能传)
(1)曾经有伟人说过:站在巨人的肩膀上, 不要重复造车轮子。
面向百度编程,发现有CE的脚本,但是功能太强了,发现是对内存字节的动态修改,也没有说明地址的作用,用OD跟踪,发现CE脚本更改了此处代码,分析一下:
此方法也是合战卡片初始化的函数:
int __cdecl sub_4CE650(int a1, int a2, int a3)
{
int result; // eax
char v4; // dl
char v5; // bl
char v6; // bl
result = a2 / 8; // 猜测最多8个技能点
v4 = 1 << a2 % 8;
v5 = *(_BYTE *)(a2 / 8 + a1);
if ( a3 )
v6 = v4 | v5;
else
v6 = ~v4 & v5;
*(_BYTE *)(result + a1) = v6;
return result;
}
查看交叉应用:定位到调用处:
int __thiscall sub_4A6F50(_BYTE *this, int a2)
{
int result; // eax
_BYTE *v3; // esi
result = a2;
v3 = this;
if ( a2 < 61 )
{
sub_4CE650((int)(this + 32), a2, 1); // 合战特技使用过的无法使用方法
result = (v3[14] ^ (unsigned __int8)(16 * sub_6A8700((unsigned __int8)(v3[14] >> 4), 1u))) & 0xF0;
*((_WORD *)v3 + 7) ^= result;
}
v3[9] |= 0x80u;
return result;
}
直接NOP sub_4ee650 的CALL,发现这个CALL是公用的,敌方也会调用。 本想区分敌方和我方,发现这里无法区分,放入的是人物的地址,暂时没有办法,还是公平一点吧。
4、结论:
新手入门,花了一整天的时间,初步逆向,跟踪没有办法找到关键的函数,能力不够。 只能按照内存地址断点逐步调试。不能向大航海时代一样完整的逆向。
附件我来放个百度网盘。
有兴趣,大家一起研究呀。
链接:https://pan.baidu.com/s/1X8ombKCdoxxFhnWmu3oaEQ
提取码:7p1m
|