请选择 进入手机版 | 继续访问电脑版

 找回密码
 点一下
楼主: Soar

自制新版jAPI,兼容1.20e/1.21b/1.22(附带源代码)

[复制链接]
 楼主| 发表于 2009-2-27 12:52:33 | 显示全部楼层
引用第19楼血戮魔动冰于2009-02-27 12:49发表的  :
我真的是白痴……japi.dll用什么工具才可以查看?
还有怎样看魔兽的内存/堆栈?
winhex或者ultraedit-32就可以编辑
回复

使用道具 举报

发表于 2009-2-27 13:05:02 | 显示全部楼层
谢谢。
【还有怎样看魔兽的内存/堆栈?】这个问题~~貌似无解答~~
回复

使用道具 举报

发表于 2009-2-27 13:08:29 | 显示全部楼层
引用第13楼Soar于2009-02-26 18:37发表的  :
回楼上,我没有认真看堆栈的压入顺序,但老版本的jAPI的jNative的定义确实是__stdcall
我去看了sourceforge的w3grimoire仓库看了源代码,现在仍然是定义为__stdcall

旧版的japi好像不太稳定,这可能就是原因?

暴雪写的native都是cdecl,至少120和122是这样
回复

使用道具 举报

发表于 2009-2-27 13:08:47 | 显示全部楼层
引用第21楼血戮魔动冰于2009-02-27 13:05发表的  :
谢谢。
【还有怎样看魔兽的内存/堆栈?】这个问题~~貌似无解答~~


用OD
回复

使用道具 举报

 楼主| 发表于 2009-2-27 13:26:53 | 显示全部楼层
引用第22楼actboy168于2009-02-27 13:08发表的  :


旧版的japi好像不太稳定,这可能就是原因?

暴雪写的native都是cdecl,至少120和122是这样

我认真用OD查看了1.22里StringCase(string, boolean)这个函数
首先是sub esp,404
然后处理[esp+408]处的字符串
最后再比较[esp+40C]处的boolean值
那么根据堆栈压入的原则(写4个字节到栈顶,然后esp-=4),应该是先压入了boolean到esp+40C,然后再压字符串到esp+408
这个压入顺序应该是__stdcall(__pascal)才对,并不是__cdecl
回复

使用道具 举报

发表于 2009-2-27 13:30:07 | 显示全部楼层
OD全名什么?我要下载~~
回复

使用道具 举报

 楼主| 发表于 2009-2-27 13:43:53 | 显示全部楼层
引用第25楼血戮魔动冰于2009-02-27 13:30发表的  :
OD全名什么?我要下载~~
OllyDbg,要能使用,需要足够的IX86汇编知识。
回复

使用道具 举报

发表于 2009-2-27 13:54:03 | 显示全部楼层
Ollydbg.rar (4.76 MB, 下载次数: 15)
回复

使用道具 举报

发表于 2009-2-27 14:18:57 | 显示全部楼层
引用第24楼Soar于2009-02-27 13:26发表的  :


我认真用OD查看了1.22里StringCase(string, boolean)这个函数
首先是sub esp,404
然后处理[esp+408]处的字符串
.......

stdcall和cdecl的参数压入顺序都是一样的,区别是在返回时,stdcall在返回时会自己平衡栈,cdecl则是在返回后由调用它的函数来平衡
回复

使用道具 举报

 楼主| 发表于 2009-2-27 14:51:44 | 显示全部楼层
引用第28楼actboy168于2009-02-27 14:18发表的  :


stdcall和cdecl的参数压入顺序都是一样的,区别是在返回时,stdcall在返回时会自己平衡栈,cdecl则是在返回后由调用它的函数来平衡

查了文档,确实是我记错了,不好意思,而且认真查看了暴雪写的Native函数确实绝大多数都是__cdecl,但也有少量__stdcall
为了解除疑惑,我跟踪到了Jass处理代码的上一层,看到esp是被预先保存下来,运行完Jass的Native函数后再直接还原的,中间不管是调用__cdecl还是__stdcall都不会弄乱堆栈。
因此以前的不稳定问题,应该不是__cdecl和__stdcall之差引起的
回复

使用道具 举报

发表于 2009-2-27 15:20:05 | 显示全部楼层
出来支持下~~
回复

使用道具 举报

发表于 2009-3-2 13:03:02 | 显示全部楼层
再问:用什么工具使.cpp转换成.xjp文件?
回复

使用道具 举报

发表于 2009-3-2 18:52:35 | 显示全部楼层
编译成dll,然后改名
回复

使用道具 举报

发表于 2009-3-3 13:01:03 | 显示全部楼层
如果我用VC的话,怎么组建dll文件(我真的是个白痴)
回复

使用道具 举报

发表于 2009-3-3 13:13:06 | 显示全部楼层
你是用VC几?

这是vc2008的方法

新建一个项目,然后在项目属性页里把配置类型改成"动态库(.dll)",就可以了,release,debug两个方案都改一次。
dll.jpg

vc2005也一样,vc2003没用过
回复

使用道具 举报

发表于 2009-3-3 13:16:46 | 显示全部楼层
貌似VC6.0行不行~~
(Dev-C++也行)
回复

使用道具 举报

发表于 2009-3-3 13:54:24 | 显示全部楼层
vc6.0直接建个dll工程,看图

dll.jpg
回复

使用道具 举报

发表于 2009-3-3 16:09:11 | 显示全部楼层

然后如果想测试的话,先运行weloader,然后再新建图什么的就行了吗?

还有:
1.我用global function组建对魔兽的接口函数(前面加jNATIVE),能用不加jNATIVE的class方法吗?
2.VC中的int只要直接return,就可以在魔兽中得到它的值吗?
万望解答~~
回复

使用道具 举报

发表于 2009-3-3 16:16:51 | 显示全部楼层
http://www.islga.org/bbs/read.php?tid=1509

这里已经有写自定义函数的整个过程,请仔细阅读

1、不明白你说什么
2、对
回复

使用道具 举报

发表于 2009-3-3 16:35:03 | 显示全部楼层
还有,为什么我用Dev-C++和VC这行都报错呢?
[codes=C++]typedef void    (jAPI *jpAddNative)(void *routine, char *name, char *prototype);
typedef jString (jAPI **jpStrMap)    (char *str);
typedef char *    (jAPI **jpStrGet)    (jString strid);[/codes]
怎么改?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-18 10:04 , Processed in 0.239241 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表