⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dllx.c

📁 CC386 is a general-purpose 32-bit C compiler. It is not an optimizing compiler but given that the co
💻 C
字号:
/* 
Copyright 2002-2003 Free Software Foundation, Inc.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  

You may contact the author at:

mailto::camille@bluegrass.net

or by snail mail at:

David Lindauer
850 Washburn Ave Apt 99
Louisville, KY 40222
 */
#include <stdio.h>
#include <string.h>
#include "cmdline.h"
#include "umem.h"
#include "module.h"
#include "lib.h"
#include "libm.h"
#include "errors.h"
#include "dict.h"
#include "pefile.h"

extern MODULE *modules,  *curmod;
extern long modnumber;

extern FILE *curfile;
extern HASHREC **publichash;

void parseExports(FILE *f, char *name, int phys, int rva)
{
    char *xx = strrchr(name, '\\');
    int i;
    struct export_header_struct head;
    if (!xx)
        xx = name;
    fseek(f, phys, SEEK_SET);
    fread(&head, sizeof(head), 1, f);
    for (i = 0; i < head.n_name_ptrs; i++)
    {
        int nameptr;
        short ord;
        char buf[256];
        fseek(f, head.name_rva - rva + phys + i * 4, SEEK_SET);
        fread(&nameptr, 4, 1, f);
        fseek(f, head.ordinal_rva - rva + phys + i * 2, SEEK_SET);
        fread(&ord, 2, 1, f);
        if (nameptr)
            fseek(f, nameptr - rva + phys, SEEK_SET);
        else
            buf[0] = 0;
        fread(buf, 256, 1, f);
        InsertExportRec(name, buf, ord);
    } 
}

//-------------------------------------------------------------------------

void doExports(FILE *infile, char *name, int phys, int rva)
{
    MODULE *mod,  **m = &modules;
    curfile = infile;
    mod = AllocateMemory(sizeof(MODULE));
    mod->link = 0;
    mod->name = AllocateMemory(strlen(name) + 1);
    strcpy(mod->name, name);
    mod->data = AllocateMemory(1);
    mod->len = 0;
    mod->offset = 0;
    mod->modname = AllocateMemory(strlen(name) + 1);
    strcpy(mod->modname, name);
    curmod = mod;
    modstart(name);
    parseExports(infile, name, phys, rva);
    modend();
    modnumber++;
    while (*m)
        m =  *m;
    *m = mod;
}

//-------------------------------------------------------------------------

void LoadDLL(char *f, char *name)
{
    char buf[9];
    struct pe_header_struct pe;
    struct pe_object_struct obj;
    int i;
    fseek(f, 0, SEEK_SET);
    fread(buf, 2, 1, f);
    if (buf[0] != 'M' || buf[1] != 'Z')
        fatal("Invalid DLL fe");
    fseek(f, 0x3c, SEEK_SET);
    fread(buf, 4, 1, f);
    i = *(int*)(buf);
    fseek(f, i, SEEK_SET);
    fread(&pe, sizeof(struct pe_header_struct), 1, f);
    for (i = 0; i < pe.num_objects; i++)
    {
        fread(&obj, sizeof(struct pe_object_struct), 1, f);
        if (!memcmp(obj.name, ".edata", 6))
        {
            doExports(f, name, obj.raw_ptr, obj.virtual_addr);
            break;
        } 
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -