欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

同一函数,我用在VB_Shell里面的。

<span class="pediy"><span class="pediy"> 同一函数,我用在VB_Shell里面的。

同一函数,我用在VB_Shell里面的。
Function GetProcAddressDirectly(ByVal lpImageDosHeader As IMAGE_DOS_HEADER Ptr, FuncName As Asciiz) As Dword
    Dim lpImageNtHeaders          As Local IMAGE_NT_HEADERS Ptr
    Dim lpImageExportDirectory    As Local IMAGE_EXPORT_DIRECTORY Ptr
    Dim lpNameOrdinals            As Local Word Ptr
    Dim lpFunctions               As Local Dword Ptr
    Dim lpName                    As Local Dword Ptr
    Dim lpExpFuncName             As Local Asciiz Ptr
    Dim i                         As Local Dword
    Dim j                         As Local Dword
    Dim lpFuncName                As Asciiz Ptr

    If @lpImageDosHeader.e_magic <> %IMAGE_DOS_SIGNATURE Then ' invalid DOS signature
        Function = 1
        MsgBox "Invalid DOS signature",%MB_ICONWARNING,"Error in GetProcAddressDirectly()"
        Exit Function
    End If
    lpImageNtHeaders = lpImageDosHeader + @lpImageDosHeader.e_lfanew
   '================================
    If @lpImageNtHeaders.Signature <> %IMAGE_NT_SIGNATURE Then ' Invalid NT signature
        Function = 1
        MsgBox "Invalid NT signature",%MB_ICONWARNING,"Error in GetProcAddressDirectly()"
        Exit Function
    End If
   '================================
    If @lpImageNtHeaders.FileHeader.SizeOfOptionalHeader <> SizeOf(@lpImageNtHeaders.OptionalHeader) Or _
        @lpImageNtHeaders.OptionalHeader.Magic <> %IMAGE_NT_OPTIONAL_HDR32_MAGIC Then
        Function = 0
        MsgBox "SizeOfOptionalHeader or OptionalHeader.Magic",%MB_ICONWARNING,"Error in GetProcAddressDirectly()"
        Exit Function
    End If
    lpImageExportDirectory = @lpImageNtHeaders.OptionalHeader.DataDirectory(%IMAGE_DIRECTORY_ENTRY_EXPORT).VirtualAddress
   '================================
    If lpImageExportDirectory = 0 Then
        Function = 0
        MsgBox "lpImageExportDirectory",%MB_ICONWARNING,"Error in GetProcAddressDirectly()"
        Exit Function
    End If
    lpImageExportDirectory = lpImageExportDirectory + lpImageDosHeader
   '================================
    lpNameOrdinals = @lpImageExportDirectory.AddressOfNameOrdinals + lpImageDosHeader
    lpName         = @lpImageExportDirectory.AddressOfNames        + lpImageDosHeader
    lpFunctions    = @lpImageExportDirectory.AddressOfFunctions    + lpImageDosHeader
   '================================
    lpFuncName = VarPtr(FuncName)
   '================================
    If HiWrd(lpFuncName) Then ' Name
       For i = 0 To @lpImageExportDirectory.NumberOfFunctions - 1
          If @lpFunctions[i] Then
             For j = 0 To @lpImageExportDirectory.NumberOfNames - 1
                If @lpNameOrdinals[j] = i Then
                   lpExpFuncName = @lpName[j] + lpImageDosHeader
                   If @lpExpFuncName = FuncName Then Function = @lpFunctions[i] + lpImageDosHeader : Exit Function
                End If
             Next
          End If
       Next
    Else
       For i = 0 To @lpImageExportDirectory.NumberOfFunctions - 1
          If lpFuncName = @lpImageExportDirectory.nBase + i Then
             If  @lpFunctions[i] Then Function = @lpFunctions[i] + lpImageDosHeader
             Exit Function
          End If
       Next
    End If
   '================================
End Function
VC:
DWORD GetProcAddressDirectly(PIMAGE_DOS_HEADER lpImageDosHeader, char * FuncName)
{
    PIMAGE_NT_HEADERS lpImageNtHeaders;
    PIMAGE_EXPORT_DIRECTORY pExportDir;
    PWORD lpNameOrdinals;
    unsigned char * lpFunctions;
    DWORD * lpName;
    char * lpExpFuncName;
    DWORD i;
    DWORD j;
    char * lpFuncName;
    if(lpImageDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
  {
        MessageBox(NULL,"Invalid DOS signature",0,0);
        return 1;
  }
    
    lpImageNtHeaders = (PIMAGE_NT_HEADERS)(lpImageDosHeader + lpImageDosHeader->e_lfanew);
  
    if (lpImageNtHeaders->Signature != IMAGE_NT_SIGNATURE)
  {
    MessageBox(NULL,"Invalid NT signature",0,0);
        return 1;
    }
  
    if ((lpImageNtHeaders->FileHeader.SizeOfOptionalHeader != sizeof(lpImageNtHeaders->OptionalHeader)) ||
        (lpImageNtHeaders->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC))
  {
    MessageBox(NULL,"SizeOfOptionalHeader or OptionalHeader->Magic",0,0);
        return 0;
    }
  DWORD exportsStartRVA, exportsEndRVA;
    PIMAGE_NT_HEADERS pNTHeader;
  //PIMAGE_NT_HEADERS64 pNTHeader64;
    PBYTE pImageBase = (PBYTE)lpImageDosHeader;
    
  // Make pointers to 32 and 64 bit versions of the header.
    pNTHeader = MakePtr( PIMAGE_NT_HEADERS, lpImageDosHeader,
                                lpImageDosHeader->e_lfanew );

    exportsStartRVA = GetImgDirEntryRVA(pNTHeader,IMAGE_DIRECTORY_ENTRY_EXPORT);
    exportsEndRVA = exportsStartRVA +
             GetImgDirEntrySize(pNTHeader, IMAGE_DIRECTORY_ENTRY_EXPORT);
    // Get the IMAGE_SECTION_HEADER that contains the exports.  This is
    // usually the .edata section, but doesn't have to be.
  PIMAGE_SECTION_HEADER header;
    header = GetEnclosingSectionHeader( exportsStartRVA, pNTHeader );
    if ( !header ) return 0;
  INT delta;
    delta = (INT)(header->VirtualAddress - header->PointerToRawData);
    pExportDir = (PIMAGE_EXPORT_DIRECTORY)GetPtrFromRVA(exportsStartRVA, pNTHeader, pImageBase);
  
    pExportDir =(PIMAGE_EXPORT_DIRECTORY) (lpImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
  
    if (pExportDir == 0)
  {
    MessageBox(NULL,"Error in GetProcAddressDirectly()",0,0);
        return 0;
    }
  
    pExportDir =(PIMAGE_EXPORT_DIRECTORY) (DWORD)pExportDir + (DWORD)lpImageDosHeader;
  
    lpNameOrdinals =(unsigned short *)(pExportDir->AddressOfNameOrdinals + lpImageDosHeader);
    //lpNameOrdinals =  (PWORD)  GetPtrFromRVA( pExportDir->AddressOfNameOrdinals, pNTHeader, pImageBase );
    lpName         =(DWORD *) (pExportDir->AddressOfNames        + lpImageDosHeader);
    lpFunctions    =(unsigned char *) (pExportDir->AddressOfFunctions    + lpImageDosHeader);
  //PDWORD pdwFunctions;
    lpFuncName = FuncName;
  
    if(HIWORD(lpFuncName)!=0 )
  {
    for( i = 0;i<=pExportDir->NumberOfFunctions - 1;i++)
    {
      DWORD entryPointRVA = *lpFunctions;
      
      if ( entryPointRVA == 0 ) continue;  // Skip over gaps in exported function
                                         // ordinals (the entrypoint is 0 for
      
      for( j = 0;j<=pExportDir->NumberOfNames - 1;j++)
      {
        if( lpNameOrdinals[j] == i)
        {
          lpExpFuncName = (char *) (lpName[j] + lpImageDosHeader);
          if(lpExpFuncName = FuncName)  return (unsigned long) (lpFunctions[i] + lpImageDosHeader);
        }
      }
    }
  }
    else
  {
    for (i = 0 ;i<=pExportDir->NumberOfFunctions - 1;i++)
    {
      if (lpFuncName == (char *)(pExportDir->Base + i))
      {
        if (lpFunctions[i]) return (unsigned long) (lpFunctions[i] + lpImageDosHeader);
      }
    }
    }
  return 0;
}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功