·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 特殊汉化 >> 程序中如何简单获得API的调用地址及如何添加API函数    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

程序中如何简单获得API的调用地址及如何添加API函数

作者: 雅枫 来源:汉化新世纪论坛 时间:2003-11-14 点击:10874

雅枫

以前我写的那篇用GetStockObject()修改CreateFontIndirectA()字体的文章中提到,函数输入表中必须有GetStockObject()这个函数,其实这个可以很容易的用LordPE这个软件添加API函数的,同时我也找到了一个很容易的获取函数调用地址的方法.
先用OLLYDBG反汇编一个软件,如下


|. 68 20104000 PUSH SDPRO.00401020 ; |DlgProc = SDPRO.00401020
|. 6A 00 PUSH 0 ; |hOwner = NULL
|. 6A 65 PUSH 65 ; |pTemplate = 65
|. 50 PUSH EAX ; |hInst
|. FF15 94404000 CALL DWORD PTR DS:[404094]; \DialogBoxParamA
|. 33C0 XOR EAX,EAX
\. C2 1000 RETN 10
90 NOP



. 50 PUSH EAX ; /Result
. 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8>; |
. 50 PUSH EAX ; |hWnd
. FF15 98404000 CALL DWORD PTR DS:[404098] ; \EndDialog
> B8 01000000 MOV EAX,1 ; Case 110 of switch 00401024
. C2 1000 RETN 10

这是DialogBoxParamA与EndDialog这两个函数的的反汇编代码分别为:
CALL DWORD PTR DS:[404094] DialogBoxParamA
CALL DWORD PTR DS:[404098] EndDialog
用LORDPE察看其输入表如图:

我们可以看到,USER32.dll的FirstThunk是4094,而DialogBoxParamA的地址是404094多了个400000(基地址)而EndDialog的地址是404098,是前一个函数的地址+4,看来函数的入口地址是以FirstThunk为首地址连续存放的,分析别的dll也有这个结果,所以dll的第n个函数就是(“基地址”+FirstThunk+4(n-1)).这就是函数的入口地址了,不过调用时,应用FF15形式的CALL(即call dword ptr ********的形式)而不是E8形式的CALL(即call ********的形式)。
我用lordPE为软件加了两个函数如图:

是不是很有意思?第一个函数的ThunkRVA恰好等于dll的FirstThunk,而第二个的ThunkRVA居然是第一个加4后的结果,这就给了我们方便:直接“基地址”+ThunkRVA就是函数的入口地址了。如想call messageboxa就写成:call dword ptr [00407050](FF1550704000)就可以了
想想还不死心:难道不是自己加的函数就只能通过计算来获得入口地址么?其实LORDPE早给我们想到了这一点看下图:

这是选上了图示地方的结果,哈哈软件自动给我们算好了吧,你发现最简单的得到函数的入口地址的最简便方法了吧?就是勾上始终察看FirstThunk后的“基地址”+ThunkRVA了。
有人要问了:这些图是从哪儿截下来的?步骤如下:
打开lordpe然后选pe编辑器-〉打开文件-〉选择“目录”你会得到下图的界面

点击上边画出的地方就得到“导入表”对话框了,至于添加api函数,如下图操作就OK啦。

 

其实这个对改CREATEFONTINDIRECT字体最有用了,不用象野蛮改法那么麻烦了只要
6A11
CALL GetStockObject
就可以了
象下边的代码

|. 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14]
|. 50 PUSH EAX
|. FF15 A4114E00 CALL CreateFontIndirectA
|. 50 PUSH EAX

PUSH xAX 前边都会有一句
LEA xAX,DWORD PTR SS:[xxxxxxxx]
足够改成GetStockObject了

论坛原贴:http://bbs.hanzify.org/read.php?tid=15064


 

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): API 函数 调用 字体

·上一篇: 怎样用 Wise Installation System 制作汉化补丁? ·下一篇: 汉化教学基地开放公开投稿账号

· 版权申明: 本文引自《汉化新世纪论坛》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《汉化新世纪论坛》[ 作者: 雅枫],如需转载请直接联系原始作者,并请注明原始出处。

相关文章                                                                                发表评论 打印此文 关闭窗口

| 设为首页 | 加入收藏 | 联系我们 | 友情链接
Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎
本站内容,除转载或版权特别申明的内容外,皆遵守 创造共用协议中文版之“署名-非商业性使用-禁止演绎 2.5 中国大陆”条款
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.5 China License.
本网站内容源自汉化新世纪论坛的摘录和汉化新世纪成员的原创文章。
凡汉化新世纪论坛的文字皆默认为汉化新世纪与原作者共同拥有并授权发布。
如对本站发布文章有所异议请来信告知,我们将及时删除。
凡商业摘录本站文字请先与我们联系,本站将保留非授权商业发布的追究权利。
凡非商业摘录本站文字请明显注明出处和原作者,并不得改动,凡改动必先征求原作者同意。
苏ICP备05002283号