通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
文章搜索:
热门搜索:红客 黑鹰 红客技术 安全动画 红客培训
首页 文章 软件 动画 资源 励志 论坛 邮箱 会员 军事 科技 博客 爱心红客 最近更新 800g资源
 业内新闻 漏洞公告 病毒公告 电脑知识 网络知识 菜鸟入门 攻防教程 黑客攻防 安全编程 工具使用 综合安全 个人安全 安全相关 Q Q安全 原创精华 红客人物 站内事件
您现在的位置: 爱国者安全网 >> 文章类 >> 红客教程 >> 网络攻防 >> 文章正文
通用且简单的扩充和改造PE中的call的功能的方法
责任编辑:酷酷の鱼   更新日期:2008-1-28
 

来源:安全中国

技术基础:会编写加壳程序、了解PE结构、X86指令系统。
开发工具:MASM、VC++

1、我们有时候在改造一个PE的时候,对其中的某些call要做大量的改动,这时
候,往往通过手动增加一个节,在这个节中完成这个call的改造,再返回原来的地方继续执行。此法虽然可行,但工作量实在太大,且调试十分不方便。

2、“通用简单的方法”之实现原理:
    使用jmp far address 和 call far address的机器码长度相同,且仅仅第一字节不同的原则,jmp第一字节是0xE9,而call第一字节是0xE8,后面4字节相同。
    这种方法就是:通过给PE加个小壳,同时在加壳的时候,将PE中要改造的call 修改成调用外壳中的call,在外壳中的call中调用原来PE中的call,而外壳中的call我们在编写的时候较容易实现功能扩充和改造。
    在外壳中的call中,我们有两种扩充功能的方式:
    (1)在调用原来PE中的call之前扩充功能;
    (2)在调用原来PE中的call之后扩充功能;
    扩充功能可以直接在外壳call中实现,但较难调试和复杂。
    简单通用的方法是这个外壳中的新call仅仅完成:
        1、加载一个外部补丁DLL;
        2、调用这个外部补丁DLL中的函数,完成原来PE中的call的功能扩充和改造。
        3、调用原来PE中的call的;
    是先调用原来PE中的call还是后调用,视具体需要决定。这样我们就可以很简单的写扩充的功能代码了,因为这个外部补丁DLL可以用高级语言来写,且调试十分简单。

3、外壳中函数的具体实现:
    (一) 首先,在外壳中设定几个变量:
    (1) 保存外部DLL的各个函数地址的变量(DWORD):
        pfnExtPatchFun_1--pfnExtPatchFun_n,n为多大具体看要改造PE中几个函数。
    (2) 保存原来PE中的call的“地址差”变量(DWORD):
        dwOrgCallDifference_1--dwOrgCallDifference_n,n为多大具体看要改造PE中几个函数。
        dwOrgCallDifference_x = 原来call的机器码的后4个字节(双字)。
    (3) 保存原来PE中的call的RVA地址的变量(DWORD):
        dwOrgCallRVA_1--dwOrgCallRVA_n,n为多大具体看要改造PE中几个函数。
    (4) 保存外部DLL的hModule的变量(DWORD):
        hExtPatchDll。
    ;-----------------------------------------------------------------
    举例说明:
      如:原来PE的ImageBase=0x00400000,且有下面代码(IDA显示):
          .
          .
          004010CB 50                push    eax
          004010CC 57                push    edi
          004010CD E8 CE 08 00 00    call    sub_4019A0 ;需要改造的call,注意机器码后4字节
          004010D2 85 C0             test    eax, eax
          .
          .
      则:dwOrgCallRVA_1 = 004010CD - 0x00400000 = 0x000010CD
          dwOrgCallDifference_1 = 0x000008CE
   ;------------------------------------------------------------------
   ;
   (二) 在外壳程序中编写这些call,需要改造几个函数,就有几个call,格式如下:
;*****************************************************************************
;---------------------------------------------------;
; 外壳中的call,用于替换原来PE中的call               ;
;---------------------------------------------------;
align 4
wjq_API_SMC_Label_1:
GeneralPEShellCall_1    proc
;{
    ;原PE中的call的入口参数,我们通过堆栈传递到Dll中的新call,此时需注意EBP在本call中不要改变。
    @nPara1 EQU [ebp+0ch] ;原来PE中的Call的参数,也可以通过esp取得
    @nPara2 EQU [ebp+8h]
    ;
    pusha
    call GetPatchDllFunctions ;获取外部DLL中的所有函数地址并保存
    call GetAddressDifference ;获取地址差
    .if [pfnExtPatchFun_1+eax] != 0  ;如果功能函数1实现了,就调用
       push  @nPara1 ;原来PE中的Call的参数
       push  @nPara2
       call  [pfnExtPatchFun_1+eax] ;调用外部DLL中的补丁call
    .endif
    ;------------调用原来的call-------------------------
    call GetAddressDifference ;获取地址差
    lea esi,[TempCall_1+eax]  ;现在call的VA
    sub esi,[Image_Base+eax]  ;转换成RVA
    sub esi,[dwOrgCallRVA_1+eax] ;减去原来PE中的call的RVA = 两个call的地址差
    ;
    mov ebx,[dwOrgCallDifference_1+eax]  ;原来call xxxxxxxx 指令的偏移差
    .if ebx < 0  ;负数,原来call向上调用
        add ebx,esi
    .else        ;正数,原来call向下调用
        sub ebx,esi
    .endif
    ;
    mov  [TempCallDifference_1+eax],ebx  ;修正后的差值
    popa
    ;

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章:
  • 最近更新
    固顶文章 迎新年,献爱心。
    普通文章 瑞星公司01月28日发布 每日计算机病毒及木马播报
    普通文章 加强数据中心虚拟化安全的10个步骤
    普通文章 杀毒防毒扫盲 白话4种后门技术
    推荐文章 推荐:握着你的“手”来清除DLL后门完全篇
    普通文章 虚拟机三种禁用FSO组件的方法
    普通文章 常见的木马所有隐藏启动方式
    普通文章 代码自我清除,自我加密,解密的实现
    普通文章 通用且简单的扩充和改造PE中的call的功能的方法
    普通文章 FreeBSD inet_network() 函数中的单字节溢出漏洞
    热门文章
    普通文章安全公司悬赏20000美元找Windows漏洞
    普通文章Excel旧版有漏洞 可控制计算机
    普通文章SANS:08年十大网络安全威胁
    普通文章TIBCO SmartSockets 指针偏移的远程代码执行漏洞
    普通文章2007年度中国互联网市场数据即将第二次发布
    普通文章Unix主机安全漏洞分析及漏洞扫描器的设计与实现
    普通文章查杀IMG病毒的常用方法及防范心得
    普通文章**CHM 3.50 注册流程及算法分析(续)
    普通文章IP-Tools中的密码学算法详细分析
    普通文章自己动手编写简单远程控制
    精彩专题