首页
社区
课程
招聘
浅谈API函数调用的方法
发表于: 2004-7-5 13:01 12858

浅谈API函数调用的方法

nbw 活跃值
24
2004-7-5 13:01
12858

浅谈API函数调用的方法

浅谈API函数调用的方法

By     :        nbw[NE365][FCG][BCG][DFCG]
Hp     :        www.vxer.com  
                     nboy.cnwlt.com

      API函数地址的查找在很多时候都需要,比如做DIY的时候难免需要调用API函数。关于API函数的调用有不少方法,今天我大体说一些,不是具体的步骤,只是一些原理。

1、  查看软件的引入表。如果被修改的软件中已经导入了你需要用到的API函数,这最好不过,可以用PE工具察看引入表,就可以得到该函数的RVA;

2、修改引入表。
    如果软件中没有该函数的信息,可以手工把该函数的信息导入到引入表中,手工导入需要理解PE导入表的相关格式,比较麻烦,但是占用资源少。
    一般来说,用PE工具也可以导入动态连接库的信息,但是前提是需要把动态连接库的信息重新导入,这有很大不便。具体来说:
    假如我们需要把Messageboxa函数导入到一个软件中。
    因为Messageboxa函数在User32.dll,则利用PE工具导入的时候存在2种状况:

     1、该软件中没有引入了User32.dll,那么可以利用Stu_pe等工具把User32.dll库的信息导入到软件中,顺便把Messageboxa函数信息导入到其中。具体方法请参考那些PE软件的说明;
     2、该软件中已经引入了User32.dll,那么无法利用PE工具(至少我见过的,例如PEdit,Stu_pe等)把Messageboxa函数的信息导入到软件中,如果强行按照上面的方法导入User32.dll和Messageboxa,那么新导入的信息可用,但是以前的User32.dll信息无法使用。就是说新添加的Messageboxa是可以用了,但是人家以前导入的Use32.dll中的函数都没办法使用了。导致软件运行不正常;

3、利用Loadlibrary函数和GetProcessAddress函数相结合,然后获取需要的函数的地址,这种方法看起来比较麻烦,事实上也比较麻烦:) ,但是我感觉比较安全,不会出什么乱子,我一般采用这种方法;

4、搜索软件的导入表。动态搜索软件的导入表,这种方法是动态修改软件的时候需要用到的,一般来说用于加壳软件或者病毒。具体方法我就不介绍了。有兴趣的可以去查查相关资料,我这也有一些。

5、直接利用Kernel32.dll中的函数,这种方法非常罕见。由于Kernel32.dll是系统核心,随时都在运行,可以利用他里面的函数地址。比如说需要用到Messageboxa函数,可以查出来Kernel32.dll中导出的Messageboxa的地址,然后call这个地址就可以了。但是这种方法存在明显缺陷:由于操作系统的不一样(比如XP中就不是Kernel32.dll库),会导致函数地址的不同。这一点需要注意。这种方法是我看Vbin写的病毒的时候发现的,感觉不错。不过我还没用过,要有不便我以后给大家再说。

    以上介绍了一些方法,具体的方法可以查相关资料,或者和我讨论(www.fcgchina.com)。这些方法各有好处,统统掌握也不是坏处,呵呵。

如果你还有什么方法,请一定告诉我。先谢过了!我发现这个格式编辑实在太麻烦了,半天也没处理好,大家将就着看吧。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 8
支持
分享
最新回复 (25)
雪    币: 250
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zdd
2
不错。
2004-7-5 17:29
0
雪    币: 3758
活跃值: (3337)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
3
最初由 nbw 发布

2、该软件中已经引入了User32.dll,那么无法利用PE工具(至少我见过的,例如PEdit,Stu_pe等)把Messageboxa函数的信息导入到软件中,如果强行按照上面的方法导入User32.dll和Messageboxa,那么新导入的信息可用,但是以前的User32.dll信息无法使用。就是说新添加的Messageboxa是可以用了,但是人家以前导入的Use32.dll中的函数都没办法使用了。导致软件运行不正常;


用LordPE可以.
其实我觉得完美的方法是在资源前面建一个段,将原有的导入表和IAT等都集中在这个段,修改的话先将导入表导出为IMPREC格式,加上需要项目,算好Thunk放置位置,再使用IMPREC重建到新建的段里面,比LordPE弄得好多了.
2004-7-5 18:11
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
kernel32导出messageboxa?楼主睡晕呼了吧:D
2004-7-5 20:01
0
雪    币: 446
活跃值: (758)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
是笔误吧~!
2004-7-6 02:17
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
6
最初由 forgot 发布
kernel32导出messageboxa?楼主睡晕呼了吧:D


不好意思,确实导不出来。因为Kernel32中没有这个函数。不过凡是Kernel32中有的函数,都可以这么使用。这种方法是正确的。尤其是有些软件只可以在一种OS下面运行,用这方法很简单,也很有创意。

曾半仙大哥说的事情我回去再看看。我好像以前用过。不可以。我再看看。
2004-7-6 08:24
0
雪    币: 244
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
支持!
2004-7-11 04:10
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
支持!!!
2004-11-13 19:43
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
最初由 nbw 发布

5、直接利用Kernel32.dll中的函数,这种方法非常罕见........


如何才叫直接利用,能否举例说明一下,thx
2004-11-13 20:57
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
10
最初由 阵雨 发布


如何才叫直接利用,能否举例说明一下,thx


依我的了解

比如说,你看见自己程序的 IAT 里 MessageBox 一项的位置是 00123456h ,这代表当你的程序经由 IAT 呼叫这个 MessageBox API 时,最后会来到 00123456h 。你和别人的程序,也是会来到这里。因为那个是系统 dll,投影在内存里的位置是一致的。

你知道 00123456h 这个位置后,你便可以在别的程序里呼叫 00123456h 来使用 MessageBox
2004-11-13 22:48
0
雪    币: 1593
活跃值: (811)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
11
最初由 nbw 发布
浅谈API函数调用的方法
5、直接利用Kernel32.dll中的函数,这种方法非常罕见。由于Kernel32.dll是系统核心,随时都在运行,可以利用他里面的函数地址。比如说需要用到Messageboxa函数,可以查出来Kernel32.dll中导出的Messageboxa的地址,然后call这个地址就可以了。但是这种方法存在明显缺陷:由于操作系统的不一样(比如XP中就不是Kernel32.dll库),会导致函数地址的不同。这一点需要注意。这种方法是我看Vbin写的病毒的时候发现的,感觉不错。不过我还没用过,要有不便我以后给大家再说。


这哪是什么非常罕见的方法啊?病毒中最基本的技术了,简单得不能再简单,而且一般来说病毒都不会用硬代码的,都是动态获得的。
2004-11-14 00:09
0
雪    币: 10627
活跃值: (2324)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
老罗  就是牛啊!一眼中的
2004-11-14 01:04
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
老罗哥,解答一下我的问题哈
谢啦
http://bbs.pediy.com/showthread.php?s=&threadid=6941
2004-11-14 01:35
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
14
最初由 luocong 发布


这哪是什么非常罕见的方法啊?病毒中最基本的技术了,简单得不能再简单,而且一般来说病毒都不会用硬代码的,都是动态获得的。


多谢罗大哥指点。

不过这个事情我晓得哇。我是看Vbin写的病毒里面才直到的哇。你想,Vbin写那个病毒的时候都至少一年多了阿。我当时写的时候随便写了写了这个,因为我没看到谁搞DIY的时候用过。
2004-11-14 02:11
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
都说这么隐讳,哎~~~~
给点代码说明一下好不好罗
直接利用Kernel32.dll中的函数,这种方法非常罕见
到底怎么个利用法啊?
难道是
MOV EAX MessageBox
CALL EAX   ??
2004-11-14 02:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
最初由 luocong 发布


这哪是什么非常罕见的方法啊?病毒中最基本的技术了,简单得不能再简单,而且一般来说病毒都不会用硬代码的,都是动态获得的。


罗大哥,这个也是一般只找到LoadLibrary跟GetProcAddress这两个吧,其他的就都用这两个函数动态获得了
2004-11-14 10:01
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
不错 。好贴!
2004-11-14 14:16
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
18
最初由 阵雨 发布
都说这么隐讳,哎~~~~
给点代码说明一下好不好罗
直接利用Kernel32.dll中的函数,这种方法非常罕见
到底怎么个利用法啊?
难道是
........


    Kernel32.dll里面没有MessageBox,现在假设里面存在这个函数,你搜索或者查找一下这个函数的地址,假设是: 412345 H,那么,这个地址是不会发生变化的,所以,如果是 call 412345H , 就相当于 call MessageBox 。
    但是,这种方法有2个大缺点,首先,受操作系统限制;其次,只能用Kernel32.dll里面的东西,因为这个函数是被操作系统加载的,其他库里面的函数就没这么“优厚待遇”的。
2004-11-14 17:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最初由 nbw 发布



Kernel32.dll里面没有MessageBox,现在假设里面存在这个函数,你搜索或者查找一下这个函数的地址,假设是: 412345 H,那么,这个地址是不会发生变化的,所以,如果是 call 412345H , 就相当于 call MessageBox 。
但是,这种方法有2个大缺点,首先,受操作系统限制;其次,只能用Kernel32.dll里面的东西,因为这个函数是被操作系统加载的,其他库里面的函数就没这么“优厚待遇”的。


这个一般是获得LoadLibrary跟GetProcAddress这两个函数,其他的函数通过这两个函数就可以获得了,其实理论上,只要是这个程序中已经加载的dll中的函数,都可以用搜索内存的方法得到,而不仅是kernel32.dll,还有,这种方法应该是没有操作系统限制的
2004-11-14 19:20
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
20
最初由 nbw 发布
曾半仙大哥说的事情我回去再看看。我好像以前用过。不可以。我再看看。
........

好久不见半仙的踪迹了,不知道又仙游何处去了。
2004-11-14 19:37
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
21
最初由 yafeng 发布


这个一般是获得LoadLibrary跟GetProcAddress这两个函数,其他的函数通过这两个函数就可以获得了,其实理论上,只要是这个程序中已经加载的dll中的函数,都可以用搜索内存的方法得到,而不仅是kernel32.dll,还有,这种方法应该是没有操作系统限制的


我头很大,请别在这个问题上争来争去了。大家觉得怎么好,就怎么用吧。
2004-11-14 19:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
最初由 monkeycz 发布

好久不见半仙的踪迹了,不知道又仙游何处去了。


半仙当然是在hanzify混,呵呵
2004-11-15 21:20
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
23
hanzify是不是商朝子那里?或者韩夫子?
2004-11-15 23:47
0
雪    币: 16
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
24
其实都是一个道理,取得实际代码的内存地址,然后jmp到那里执行~~~

不管什么搜索阿,call阿,~~~~嘿嘿
2004-11-16 00:20
0
雪    币: 16
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
25
还有,你上面说的那些调用办法,忽略了一种情况,就是API已经被hook了的情况下~
2004-11-16 00:21
0
游客
登录 | 注册 方可回帖
返回
//