例说Exe程序作为DLL进行加载

本文探讨了如何将EXE程序当作DLL加载并调用其内部函数,以避免让EXE运行的缺点。文章详细介绍了三个关键问题:导入表修复和重定位数据。通过实例分析,展示了如何修复导入表、重定位代码段指针以及处理数据段数据。文章提供了一种不依赖于PE结构的实现方法,并分享了作者在实践中遇到的挑战和解决方案。
摘要由CSDN通过智能技术生成
 作 者: nbw
时 间: 2008-07-17,23:05
链 接: http://bbs.pediy.com/showthread.php?t=68730

例说Exe程序作为DLL进行加载




调用第三方exe程序里面的函数,一直是大家所向往并已经讨论过不少的问题,其方法大体有三类:

1、让第三方exe启动,然后自己程序注入进去调用之;

2、让第三方exe启动,然后远程读入其内容;

3、把第三方exe,当作DLL进行加载,并调用里面的函数。

前2个方法容易实现,但无法摆脱让exe运行的缺点,今天我们讨论第三条思路,把exe向dll一样加载,然后调用里面的函数。

就此,主要面临以下三个问题:

1、导入表修复;

2、重定位dll数据,也就是exe数据。

其实这2个问题归结起来都是重定位问题,这里就不再解释重定位原理和原因了。

有些人认为PE文件重定位,就要搞重定位表,exe要输出函数,就要搞导出表,这些其实是不必要的,只要理解了他们的原理,自己实现反而更方便。当然,另外一点原因是我现在基本忘却PE结构了。以下方法不涉及给exe增加导出表或者重定位表。

举例来说碰到的问题和解决思路,exe里面有如下代码:

        push    425570                           ; /kernel32.dll
        call    dword ptr [425280]               ; /GetModuleHandleA

这个很正常,也很简单, 0x425570 指向一个字符串, [425280] 里面是 GetModuleHandleA 函数指针,也就是导入表内容。但如果把这个exe作为DLL进行LoadLibrary,你会发现这2行代码仍然如此,一点也没变,但却无法执行了,因为这时候涉及到的这2个指针,指向的内容已经不是我们预想的了,需要把它们重定位,才能让他们指向预期目的地。重定位方法也很简单:


1、 0x425570 ,这个地址,用当前自身模块基地址加上 0x25570 ,就是新的地址;

2、 0x425280 ,这个地址,用当前自身模块基地址加上 0x25280 ,就是新的地址;

理解了这一点,就知道我们需要作什么了。

口说无凭,动手为真,下面我们举例来进行说明。就采用壳狼最近写的antidebugger测试程序吧,当然没经过他的同意 :)

目的:加载 AntiDebug.exe,调用它的第一个标签里面的 Find Debugger 功能,里面有20多个选项,我们争取把它调用完!

调用函数: 

简单跟踪以下,他这些反调试手段都在一个函数体内,调用方式如下:

00404FCC   .  50            push    eax
00404FCD   .  8BCB          mov     ecx, ebx        //这句无所谓,可以nop
00404FCF   .  E8 ECF1FFFF   call    004041C0

实现方式也很简单:

    hMod = LoadLibrary(ExePath);
    
    DWORD FindDebugerCall = (DWORD)hMod + 0x41C0;
    
    _asm{
        push 0xFFFFFFFF         //这里是调用标记,如果为这个参数,表示所有的反调试功能都选了
        mov  eax, FindDebugerCall
        call eax;
    }       


最终我们的目的就是要让上面这个函数正常运行。为此,我们要作以下大量工作。



一、修复输入表


    思路很简单,首先根据被加载dll的模块基地址,找到其导入表,然后根据其函数名,自己获取导入函数地址,重新
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值