Soar 发表于 2009-2-26 13:20:40

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

其实就是加了对1.22的支持,并且大多数的地址不采用搜索而用硬编码(1.22改变代码结构,搜索代码已经不通用)
另外1.20e只支持破解版,需要CD的版本因为是在启动后才自解密部分代码的,所以无法正常支持。
很早就做完了这个,最近看到jAPI的研究文章出了续集,所以干脆就把源代码也发出来给大家分享吧,提供更多可研究的内容,全局变量的访存个人觉得没有必要做,因为可以作为参数传入,所以就没有放进来。

新的jAPI加载方式:
把要加载的模块列表在japi.lst文件里,这样引导游戏和地图编辑器时就会加载所有写在里面的模块,模块名前加分号可以注释掉该行。

关于远程注入:
1. 仍然是CreateRemoteThread,只是为了防止杀毒软件报毒,使用LoadLibrary来获取地址使用。
2. 注入方法为改动LoadLibraryA("Game.dll")这里两条指令7个字节,跳转向注入dll的函数,在函数里先LoadLibraryA("Game.dll"); 然后对Game.dll的data段进行patch,保证在Game.dll的任何代码被执行前完成patch,但这个方法对付1.20e的非破解版就无法使用了,所以只支持1.20e破解版。

额外patch:
注意看spatch1, spatch2, spatch3三个地址,这个是patch联机地图4M大小限制的。

全部exe和dll都是用gcc编译,除了fileio.xjp(那个是以前写的fileio插件,用bcc编译的),这个文件是用来测试新旧japi之间的兼容性的。注意gcc链接时要链接psapi和shlwapi

血戮魔动冰 发表于 2009-2-26 13:28:30

哎~~虽然有心学jAPI,可是无奈GA的两篇jAPI文章都讲的特别晦涩~~基本什么名词都不懂~~
不知道LZ能不能把自己的Japi的文章发上?
要不然把自己学习的Japi文章转载上来?
我会万分感谢的~~

Soar 发表于 2009-2-26 13:32:10

楼上可以看fileio.cpp的源代码,如果还有问题的话,就直接跟帖提问吧

血戮魔动冰 发表于 2009-2-26 15:36:55

能不能先给我你的邮箱地址?
我的Email:[email protected]

血戮魔动冰 发表于 2009-2-26 16:17:17

恩~~~虽然学C++,但是还是不懂很多~~
(下定决心回家把研发人员书库看一下~~)
如果想在你的japi里添加自己的japi函数(如FileReadBool和FileWriteBool)。就直接这样声明?
(在fileio.cpp里)
首先:typedef long jBool;
函数:

jBool jNATIVE FileReadBool(jInt hfile)
{
    HANDLE hFile = (HANDLE)hfile;
    DWORD dwRead;
    jBool res;
    if(ReadFile(hFile, &res, 4, &dwRead, NULL) < 0 || dwRead != 4)
      return 0;
    else
      return res;
}

jBool jNATIVE FileWriteBool(jInt hfile, jBool v)
{
    HANDLE hFile = (HANDLE)hfile;
    DWORD dwRead;
    if(WriteFile(hFile, &v, 4, &dwRead, NULL) < 0 || dwRead != 4)
      return 0;
    else
      return 1;
}
最后在DllMain中添加:

      jAddNative(FileReadBool,"FileReadBool","(I)B");
      jAddNative(FileWriteBool,"FileWriteBool","(IB)I");

fileio.j:

native FileReadBool takes integer fileid returns boolean
native FileWriteBool takes integer fileid, boolean value returns integer

是不是这样就成功了?
急~~~求LZ火速解答~~

sowhat 发表于 2009-2-26 16:29:27

LS乱的一滩糊涂

这个东西会和bnloader冲突吗?

血戮魔动冰 发表于 2009-2-26 16:32:50

bnloader?又是个不懂的名词…………
求LS告诉我这是个什么东西……
还有【这个东西会和bnloader冲突】的冲突是什么意思…………

sowhat 发表于 2009-2-26 16:33:39

引用第6楼血戮魔动冰于2009-02-26 16:32发表的:
bnloader?又是个不懂的名词…………
求LS告诉我这是个什么东西……
还有【这个东西会和bnloader冲突】的冲突是什么意思…………
拿来连学校战网的东东

sowhat 发表于 2009-2-26 16:34:54

引用第6楼血戮魔动冰于2009-02-26 16:32发表的:
还有【这个东西会和bnloader冲突】的冲突是什么意思…………
冲突就是有你没我有我没你

血戮魔动冰 发表于 2009-2-26 16:57:11

………………
啊啊~~被吓到~~~~(>_<)~~~~
我是个白痴~~LS你真的不要欺负我~~

还有:神奇的LZ出现吧……我快等疯了~~

actboy168 发表于 2009-2-26 17:23:52

LS可以看这个http://www.islga.org/bbs/read.php?tid=1509

是不是,可不可以这种问题自己试下就可以了吧

sowhat 发表于 2009-2-26 17:36:11

引用第10楼actboy168于2009-02-26 17:23发表的:
LS可以看这个http://www.islga.org/bbs/read.php?tid=1509

是不是,可不可以这种问题自己试下就可以了吧
水平太次,看不懂呀,再说那个又不是LZ写的,也许不一样呢

actboy168 发表于 2009-2-26 17:40:41

那个...native函数的调用方式应该是cdecl

Soar 发表于 2009-2-26 18:37:13

回楼上,我没有认真看堆栈的压入顺序,但老版本的jAPI的jNative的定义确实是__stdcall
我去看了sourceforge的w3grimoire仓库看了源代码,现在仍然是定义为__stdcall

emanon 发表于 2009-2-26 20:23:44

出來支持一下

&lt;font c 发表于 2009-2-26 22:26:18

哦~
ca召唤出了艾玛侬

Soar 发表于 2009-2-27 00:12:44

引用第5楼sowhat于2009-02-26 16:29发表的:
LS乱的一滩糊涂

这个东西会和bnloader冲突吗?

修改japi.dll,寻找Game.dll字符串,改成w3lh.dll
或者直接改japi.dll的源代码里LoadLibraryA("Game.dll")为LoadLibraryA("w3lh.dll")后编译
这样用war3loader.exe启动的效果就等同于用w3l.exe引导,可以上私服了。

sowhat 发表于 2009-2-27 09:48:49

引用第16楼Soar于2009-02-27 00:12发表的:


修改japi.dll,寻找Game.dll字符串,改成w3lh.dll
或者直接改japi.dll的源代码里LoadLibraryA("Game.dll")为LoadLibraryA("w3lh.dll")后编译
这样用war3loader.exe启动的效果就等同于用w3l.exe引导,可以上私服了。
好东西

thewisp1 发表于 2009-2-27 11:00:00

来参观一下。

是lz做的吗?

血戮魔动冰 发表于 2009-2-27 12:49:27

我真的是白痴……japi.dll用什么工具才可以查看?
还有怎样看魔兽的内存/堆栈?
页: [1] 2 3
查看完整版本: 自制新版jAPI,兼容1.20e/1.21b/1.22(附带源代码)