首页
社区
课程
招聘
[求助]如何修改函数导入表中函数?
发表于: 2006-2-9 09:55 6356

[求助]如何修改函数导入表中函数?

2006-2-9 09:55
6356
我碰到一个软件,安装时将一个近40M的dll文件装到SYSTEM32目录中(其实是一个数据文件),我想将这个文件移到软件自身目录中,移动文件后,运行软件弹出“错误安装”信息框。软件是DELPHI的,调试发现其过程是先调运GetSystmeDirectoryA,然后连接\123.dll(假设123是其数据文件),检查是否有这个文件,无则出错,强行改跳,如果SYSTEM32中真无这个文件则软件崩溃,所以我想修改一个这个API,改成GetCurrentDirectoryA就好了,可是导入表中没有这个函数,直接CALL API的话又显示出错,请高手指教,由于GetSystmeDirectoryA无其它用处,如何将其替换为GetCurrentDirectoryA,感谢万分。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
使用lordpe添加一个导入函数即可。
2006-2-9 09:59
0
雪    币: 50161
活跃值: (20665)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
如果你程序中输入表中LoadLibraryA,GetProcAddress存在,也可以用这2个API加载其他任何函数。
2006-2-9 10:11
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
我用PE工具导入一个函数,OD汇编也行了,可是一运行就出异常"0x77f5ad22" 指令引用的 "0x00000080" 内存。该内存不能为 "written"。
这是什么原因,我初刚开始涉及PE的东东,不明白啊。
2006-2-9 10:29
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
晕死,终于明白啊GetSystmeDirectoryA和GetCurrentDirectoryA的参数的前后次序不一样,仔细翻了MSDN才注意到,我本以后这两个这么象的函数应该参数一样的,初步看了MSDN也是样,两个参数一个LONG,一个字符串地址指针,没想到它们两个的压栈次序不一样,一前一后,一后一前,微软也太能搞人了吧。
2006-2-9 10:35
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
再次提问,现在我已经解决了原来问题,程序也修改成功。只是以前以为导入表里没有函数会没法调用,这次我在最原始的程序上修改的,确实没有GetCurrentDirectoryA函数,我在OD中直接写call kernel32.GetCurrentDirectoryA,运行成功,可以直接调运,这样的话还要导入表有什么用呢?我比较菜,问题可能较幼稚,还请各位高手不要嫌弃啊。
2006-2-9 10:45
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最初由 crack四K 发布
再次提问,现在我已经解决了原来问题,程序也修改成功。只是以前以为导入表里没有函数会没法调用,这次我在最原始的程序上修改的,确实没有GetCurrentDirectoryA函数,我在OD中直接写call kelnel32.GetCurrentDirectoryA,运行成功,可以直接调运,这样的话还要导入表有什么用呢?我比较菜,问题可能较幼稚,还请各位高手不要嫌弃啊。


这样改的程序不能跨平台。
参考 http://bbs.pediy.com/showthread.php?s=&threadid=17365&perpage=15&pagenumber=1 kanxue的言论。
2006-2-9 11:19
0
雪    币: 50161
活跃值: (20665)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
8
最初由 crack四K 发布
我在OD中直接写call kelnel32.GetCurrentDirectoryA,运行成功,可以直接调运,这样的话还要导入表有什么用呢?我比较菜,问题可能较幼稚,还请各位高手不要嫌弃啊。


呵~你在OD双击call kelnel32.GetCurrentDirectoryA,得到原始的汇编语句看看,是不是类拟call    7C8397A1语句?这是通过地址直接调用GetCurrentDirectoryA函数了。
如果你的程序换到其他系统,此时kelnel32.GetCurrentDirectoryA函数地址就不一定是7C8397A1,程序就会崩溃。
所以,你在输入表中加入这个函数,从IAT中调用,类似:call    [404044].
Windows加载器会将当前系统的函数地址填到404044里。
2006-2-9 11:30
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
明白了,马上去改,不过自己用的话应该没什么关系吧,呵呵。
2006-2-9 14:06
0
游客
登录 | 注册 方可回帖
返回
//