首页
社区
课程
招聘
Defines the entry point.
2005-5-21 16:39 2155

Defines the entry point.

2005-5-21 16:39
2155
// ArmReb.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

typedef struct IatPtr {
        DWORD AsciiPtr;
} IatPtr, *PIatPtr;

typedef struct ImpAsciiHdr {
        WORD AsciiLen;
        unsigned char Ascii;
} ImpAsciiHdr, *PImpAsciiHdr;

typedef struct ImpHdr {
        DWORD ApiRVA;
        DWORD ApiCnt;
} ImpHdr, *PImpHdr;

typedef struct RETBUFFER {
        BYTE * FileOffset;
        DWORD FileSize;
        DWORD ErrCode;
        DWORD Bread;
} RETBUFFER, *PRETBUFFER;

// ************************************************************************
//        RVA2RAW (DWORD RVA) finds & translates
//
//  Return Codes:  != 0 -> RAW POSITION
//                                  
//                                   0 failed to find
//
// ************************************************************************
DWORD RVA2RAW (DWORD offset,BYTE * base)
{
                PIMAGE_DOS_HEADER doshdr = (PIMAGE_DOS_HEADER) (BYTE *)base;
                PIMAGE_NT_HEADERS nthdr = (PIMAGE_NT_HEADERS) (BYTE *)(base+doshdr->e_lfanew);
                PIMAGE_SECTION_HEADER temp_section_header = (PIMAGE_SECTION_HEADER)(BYTE *)(base+doshdr->e_lfanew+sizeof (IMAGE_NT_HEADERS));
               
                for (int seccounter=0;seccounter < nthdr->FileHeader.NumberOfSections;seccounter++)
                {
                        if ((offset >= temp_section_header->VirtualAddress) && (offset <= (temp_section_header->VirtualAddress+temp_section_header->Misc.VirtualSize))) return ((offset-temp_section_header->VirtualAddress)+temp_section_header->PointerToRawData);
                        temp_section_header++;
                }
                return 0;
}

DWORD ReadFileMem (char * FileName,RETBUFFER * tescht)
{
        PRETBUFFER StrPtr = (PRETBUFFER) (tescht);
        HANDLE File;
        File = CreateFile (FileName,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
        if (File == INVALID_HANDLE_VALUE) return -1;
        StrPtr->FileSize = GetFileSize (File,0);
        if (StrPtr->FileSize == 0) return -1;
        StrPtr->FileOffset = (unsigned char *)GlobalAlloc (GMEM_ZEROINIT,StrPtr->FileSize);       
        if (StrPtr->FileOffset == 0) return -1;
        if (ReadFile (File,StrPtr->FileOffset,StrPtr->FileSize,&StrPtr->Bread,0) == 0) return -1;
        StrPtr->ErrCode = 1;
        CloseHandle (File);
        return 0;
}

DWORD WriteFileMem (char * FileName,RETBUFFER * tescht)
{
        PRETBUFFER StrPtr = (PRETBUFFER) (tescht);
        HANDLE File;
        File = CreateFile (FileName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
        if (File == INVALID_HANDLE_VALUE) return -1;
        if (StrPtr->FileSize == 0) return -1;
        if (StrPtr->FileOffset == 0) return -1;
        if (WriteFile (File,StrPtr->FileOffset,StrPtr->FileSize,&StrPtr->Bread,0) == 0) return -1;
        StrPtr->ErrCode = 1;
        CloseHandle (File);
        return 0;
}

int main(int argc, char* argv[])
{
        printf ("ArmRebuild v0.1 * for private -internal- use only * ^DAEMON^ 2oo5\n\n");
        if (argc == 3)
        {
                RETBUFFER ImportsInfo;
                RETBUFFER DumpFileInfo;
                memset (&ImportsInfo,0,sizeof(RETBUFFER));
                memset (&DumpFileInfo,0,sizeof(RETBUFFER));
               
                // LOAD DATA INTO MEMORY
                if (ReadFileMem (argv[1],&ImportsInfo) != 0)
                {
                        printf ("[x] Failed to Load '%s'\n",argv[1]);
                        return 0;               
                }
                printf ("[i] Loaded '%s' Size: %d\n",argv[1],ImportsInfo.FileSize);
                if (ReadFileMem (argv[2],&DumpFileInfo) != 0)
                {
                        printf ("[x] Failed to Load '%s'\n",argv[2]);
                        return 0;               
                }
                printf ("[i] Loaded '%s' Size: %d\n",argv[2],DumpFileInfo.FileSize);

                do
                {
                        // DUMP IMPORT INFORMATION ON SCREEN
                        printf ("[i] DLL ASCII: '%s'\n",ImportsInfo.FileOffset);
                        PImpHdr ImpHdrPtr = (PImpHdr) (ImportsInfo.FileOffset+strlen ((const char *)ImportsInfo.FileOffset)+1);
                        printf ("[i] API's to fix: %d DestOfs: %8.8X\n",ImpHdrPtr->ApiCnt,ImpHdrPtr->ApiRVA);

                        // TRANSLATE RVA TO RAW
                        PIatPtr RawOfs = (PIatPtr) (RVA2RAW (ImpHdrPtr->ApiRVA,DumpFileInfo.FileOffset)+DumpFileInfo.FileOffset);

                        // DUMP APIS TO SCREEN
                        BYTE * TmpApiPtr = (ImportsInfo.FileOffset+strlen ((const char *)ImportsInfo.FileOffset)+9);
                        for (unsigned int i=1;i<=ImpHdrPtr->ApiCnt;i++)
                        {
                                PImpAsciiHdr TmpAscii = (PImpAsciiHdr) TmpApiPtr;
                                if (TmpAscii->Ascii == 0xFF)
                                {
                                        // NO NEED TO FIX ORDINALS, DIDN'T GET MESSED!
                                        //printf ("[i] Api[%d] IT Entry: %8.8X Ordinal: %8.8X\n",i,RawOfs->AsciiPtr,*(DWORD*)(&TmpAscii->Ascii+1));
                                }
                                else
                                {
                                        //printf ("[i] Api[%d] IT Entry: %8.8X Ascii: '%s'\n",i,RawOfs->AsciiPtr,&TmpAscii->Ascii);
                                        // FIX IT
                                        memcpy (2+RVA2RAW(RawOfs->AsciiPtr,DumpFileInfo.FileOffset)+DumpFileInfo.FileOffset,&TmpAscii->Ascii,strlen ((const char *)(&TmpAscii->Ascii)));
                                }
                                TmpApiPtr += sizeof (TmpAscii->AsciiLen)+TmpAscii->AsciiLen;
                                RawOfs++;
                        }
                        ImportsInfo.FileOffset = TmpApiPtr+2;
                } while (strlen ((const char *)ImportsInfo.FileOffset) != 0);
                // DUMP BUFFER TO DISK
                unsigned char OutFn[256];
                strcpy ((char *)OutFn,argv[2]);
                strcat ((char *)OutFn,".fix");
                if (WriteFileMem ((char *)OutFn,&DumpFileInfo) != 0)
                {
                        printf ("[x] Failed to Write '%s'\n",OutFn);
                        return 0;               
                }
                printf ("[i] Written Mem to '%s'\n",OutFn);
                return 1;
        }
        printf ("Syntax: ArmRebuild.exe [imports.ext] [dumptofix.ext]\n");
        return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回