改造PE中的函数为导出函数

news/2024/10/6 9:15:12

改造PE中的函数为导出函数




1、前言:为什么要这么做
  很多时候,我们发现一个PE(EXE或DLL)中非常有用且功能独立的函数(call xxxxxxxx),并且已经知道了这个函数的各个入口参数的类型和具体含义,我们想在其他的软件中使用这个函数。于是,我想到了将这个PE中的函数改成一个导出函数,这样,我们就可以在任何软件中通过“LoadLibrary("ThisPE.EXE")”等API来使用这个函数了。

2、技术基础:已经了解PE结构

3、分类:
  (1)有导出表的DLL和EXE文件--非常简单
  对于这类PE文件,要简单的多,因为只要修改一下PE中的Export,增加上一个导出函数,并把这个导出函数的入口指向我们要导出的call的调用地址(RVA格式)就可以了。甚至可以更简单的处理:找个不用的导出函数,改一下入口就可以了。
  (2)没有导出表的EXE文件--稍微复杂
  因为大部分EXE文件没有导出表,所以我们必须要给它增加一个导出表。其实也很简单,给EXE增加一个节,并在这个节中按照导出表的格式构造一个导出函数,并将这个函数入口指向我们要导出的call的调用地址的RVA,并在PE头中指出其位置和大小。

4、举例说明:
  test.exe:ImageBase=0x00400000
  发现test.exe 的 0x00408050 处为call 0x0040A012 的 0x0040A012是我们要导出的函数,我们将它导出为MyFunction函数。

  (1)给test.exe增加一个节:RVA=0x28000,size=0x1000
  (2)构造导出表:
My_Export_Table dd 0 ;Characteristics
My_TimeDateStamp dd 0   ;TimeDateStamp
          dw 0   ;MajorVersion
          dw 0 ;MinorVersion
My_nName       dd My_DLL_nName-ImageBase ;nName
          dd 1 ;nBase
          dd 1 ;NumberOfFunctions
          dd 1   ;NumberOfNames
My_AddressOfFunctions     dd 0x0040A012-ImageBase ;AddressOfFunctions
My_AddressOfNames       dd My_Fun_Name-ImageBase ;AddressOfNames
My_AddressOfNameOrdinals   dd 0 ;AddressOfNameOrdinals
---------------------------------------------------------------------
My_Fun_Name           db 'MyFunction',0
My_DLL_nName           db 'test.exe',0

  (3)LoadPe修改PE头,将导出表地址填入0x28000,大小填入0x1000,保存。

                        Spirng.W/2005.3.14



PS:

    没有导出表的EXE文件 情况下,没必要添加新节,可以找一块剩余空间代替。


    如果单独使用其中的某个call,有时候加载需要第3方DLL才可以加载。举个例子,人家写了一个程序A.exe,附加有个B.dll,我仅仅想用到A.exe里面的一个函数,不想把B.dll牵扯进来,但是如果没有B.dll,加载A.exe的时候无法加载,可能会提示缺少B.dll,这时候可以把A.exe的import表信息请除掉。就是不引入B.dll信息。如果A.exe也是一个DLL,那么有时候还需要把A.exe(这时候是A.dll)的入口处直接ret,防止入口处执行B.dll里面的函数

作者: dwing

给出个另类方法:
mod=LoadLibrary("xxx.dll"); //载入文件
func=(char*)mod+offset;   //找到函数入口地址
__asm push param2       //参数2
__asm push param1       //参数1
__asm call func;         //直接硬调用
__asm mov ret,eax       //保存返回值

 


http://www.niftyadmin.cn/n/2559815.html

相关文章

如何控制控件的可见性

在xml布局文件中 android:visibility"visible" android:visibility"invisible" android:visibility"gone" 在代码中 view.setVisibility(View.VISIBLE); view.setVisibility(View.INVISIBLE);//view不可见,占用空间 view.setVisib…

Linux下根目录

在linux下我们一直使用很多命令,比如ls,cd,mkdir等等,那这些命令是在哪个目录里呢?我们可以先看看根目录,所有目录都挂在根目录下,有且只有一个根目录,所有东西都从根目录开始,如果在终端输入/home,其实是…

斐波那契数列与IE9

百度什么都知道&#xff1a;当然也包括斐波那契(Fibonacci)数列 在一般算法教材中&#xff0c;把Fib数列都是当做递归的经典示例来讲解的&#xff1a; javascript的写法如下&#xff1a; //递归法(计算到fib(40)时浏览器就挂掉了) function fib(n){ if (n<2){return 1;} re…

替换GINA.DLL实现自己的登陆界面

发表日期&#xff1a;2004年12月9日 出处&#xff1a;www.xiaozhou.net&#xff08;本站原创&#xff09; 作者&#xff1a;酷狗 【编辑录入&#xff1a;webmaster】 想不想拥有自己个性化的WIN2000登陆界面呢&#xff1f;本文就教你如何实现。 登陆界面示例&#xf…

文件描述符fd和重定向(dpu、dpu2)

一&#xff1a;文件描述符 文件描述符是什么&#xff1f; 文件描述符实际是一个数字&#xff0c;进程如何通过一个数组来操作文件&#xff1f; Linux进程默认情况下会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c;标准输出1&#xff0c;错误标准输出2&am…

Handler的应用场景

如果在一个activity里面有多个线程去更新UI&#xff0c;并且都没有加锁机制&#xff0c;那就会造成更新UI错乱&#xff1b;而如果对更新UI的操作都进行加锁处理&#xff0c;就会造成性能下降。使用消息机制&#xff0c;就不必担心多线程的问题&#xff0c;因为更新UI 的操作&am…

库函数IO和系统调用

C文件I/O相关操作&#xff1a; fopen: FILE *fopen(const char *path, const char *mode); 1 #include<stdio.h>2 #include<errno.h>3 #include<string.h>45 int main()6 {7 FILE *fp;8 fpfopen("./tmp.txt","r"); //…

信号的产生

进程信号&#xff1a; 信号生命周期&#xff1a;信号的产生—>信号的注册—>信号的阻塞&#xff08;屏蔽&#xff09;—>信号的注销—>信号的处理 信号列表&#xff1a;知道有哪些信号&#xff0c;并且对应了哪些操作 kill &#xff1a;可以杀死一个进程&#xff0…