返回列表 发帖

关于在 War3 屏幕上提示,征集解决方案

如题~

要能做到比较稳定的显示一到两秒
最好能不用增加 dll 文件去 hook War3


请路过的朋友不吝赐教哈~

要显示的时候再去hook dx的相关api,然后在每帧里都写入文字信息,再通过dx输入到屏幕上。

TOP

我的那个软件除非在功能上有大改进,否则基本上不会再更新了。

TOP

1.24b版本
游戏运行起来后,bp 6F605300(Game.dll的基址6F000000)
然后断下来时看ecx的值,ecx指向一个描述结构,+178的值表示是否有消息要显示,+17C的值是一个指针指向另一个结构,大概是表示待显示的消息属性的吧,在那个结构中,第一个DWORD是指向待显示的字符串,第二个DWORD不知,第三个float应该与消息显示的时间有关,第四个DWORD不知
在6F605300断下时,修改[ecx+178] = 1,[ecx+17C] = 消息属性的地址,然后再构造那个消息属性结构应该差不多行了
6F605300这个函数是会被循环调用的,进入时ecx一共有4个值,分别是底部(如 某建筑 已完成)的显示区域,顶部(如 低维护费用)的显示区域,第三个没注意,左侧即聊天时的显示区域
另外,断下时查看ecx指向的内存,向上翻一点可以看到CGameUI.c字符串,+17C指向的内存向上翻点也可以看到CMessageFrame.c字符串,于是大致由此猜测这两块内存的功能的

具体要实现,不hook的话,不知道搜索内存(CGameUI之类的字符串)的方法行不行,如果hook的话,最好能先hook LoadLibrary,得到Game.dll的基址,然后hook 6F605300得到ecx的值,不过这要求游戏在程序运行之后再运行。如果游戏已经运行,再去hook 6F605300的话,不知道会不会出问题

最后,ym溪流gg~

TOP

似乎ff下编辑帖子有问题……
上面昨天写的略有点问题,那两块内存前面的字符串是CGameUI.cpp和AUMessageData,不过后者无所谓,昨天晚上写了个丑陋的程序,已经可以实现显示预先设定的字符串了,字符串是放在自己申请的空间中的,为获得那4个ecx指向的描述结构的地址Hook了Game.dll+6F5300这个函数

TOP

哇,ym如嫣MM~~

TOP

嘻嘻,等明天回到学校后把代码整理下,贴到小白版去骗钻石~~
不过我的代码现在有两个问题,一个是有内存泄漏,VirtualAlloc的内存没Free掉,不过这个改下代码,把字符串存放的地方换下应该可以解决,还一个就是存在内存非法访问,在游戏结束后再去按设定的键会访问已经被war3释放了的内存……这个还要研究下,要加个异常处理或是内存校验吧……

TOP

有没有代码可以参考下?多谢!

TOP

都是大牛啊

TOP

返回列表