/*File: dll.hVersion: 1.0Introduction: Dll DeclareCopyright (C) 2007-1 SGPRO*/ #ifndef _H_DLL#define _H_DLL #define DRV_LEN 1#define DIR_LEN 64#define FIL_LEN 8#define EXT_LEN 3#define DLLNAME_LEN (DRV_LEN + DIR_LEN + FIL_LEN + EXT_LEN)#define DLL_PARA_MAX 16#define FN_LEN 32#define FA_SIZE 16 #define DLLARG_DLLNAME 0#define DLLARG_VERIFY 1#define DLLARG_VMVNAME 2#define DLLARG_FUNCTIONNAME 3#define DLLARG_PARA 4 #define EXT_VM ".vm"#define DLL_LOG "loaddll.log" typedef enum{ DLLERR_NoErr, /*0 无错误*/ DLLERR_DllInfErr, /*1 DLL信息输出错误*/ DLLERR_VmCanNotWrite, /*2 虚拟内存无法写入*/ DLLERR_VmWriteErr, /*3 虚拟内存写入错误*/ DLLERR_VmCanNotRead, /*4 虚拟内存无法读取*/ DLLERR_VmReadErr, /*5 虚拟内存读取错误*/ DLLERR_FunctionNotFound,/*6 未找到DLL库内的指定函数*/ DLLERR_VerifyErr, /*7 DLL验证失败*/ DLLERR_NotEnoughMem, /*8 内存不足,无法加载DLL*/ DLLERR_DllNotExsist, /*9 DLL库不存在*/ DLLERR_NameTooLong, /*10 虚拟内存名太长*/ DLLERR_InitErr, /*11 初始化错误*/ DLLERR_FunctionArgErr, /*12 函数参数错误*/ DLLERR_ProcessLoadErr /*13 DLL进程加载错误*/}DLLERR; typedef enum{ DLLInfor_EchoOff, DLLInfor_Console, DLLInfor_File, DLLInfor_ConFile, DLLInfor_Func}DLLINFOR; typedef struct{ char *name; int byte; void *valptr; }VMVar; DLLERR DLLErr = DLLERR_NoErr;DLLINFOR DLLInfor = DLLInfor_EchoOff;int (*LogFunc)(char *); void DLLVerify(const char Standard[], char AppPara[]);void DLLShowInfor(char format[], ...);int DLLLog(char buffer[]);void DLLSaveErrCode();void DLLInit(char argDllName[], char argVMVname[], int (*argFunc)(char *), DLLINFOR argInfor);void DLLShowPara(int argc, char *argv[]);void DLLSaveReturn(VMVar vm); void GenVMFileName(char vmfname[], const char VMVName[]);void LoadDll(VMVar, int mode, char DLLName[], char FunctionName[], char Verify[], char *para[]); #endif /*File: dllbase.cVersion: 1.0Introduction: Dll ImplementCopyright (C) 2007-1 SGPRO*/ #include <errno.h>#include <stdio.h>#include "dll.h" char VMVName[FIL_LEN + EXT_LEN + 1]; int Saved = 0;int FCount = 0; typedef void (*Fptr)(int, char *[]);typedef struct{ void (*fptr)(int, char *[]); char fname[FN_LEN];}FRecord, *FArray; FArray FArr; void DLLVerify(const char Standard[], char AppPara[]){ DLLShowInfor("DLL para[%s] Verify...\n", AppPara); DLLErr = !strcmp(Standard, AppPara)?DLLERR_NoErr:DLLERR_VerifyErr; if (DLLErr != DLLERR_NoErr) { DLLShowInfor("[failure]\n"); } else { DLLShowInfor("[OK]\n"); }} void DLLShowInfor(char format[], ...){ char buffer[1024] = ""; va_list varptr; va_start(varptr,format); vsprintf(buffer,format,varptr); if (DLLInfor != DLLInfor_EchoOff) { LogFunc(buffer); }} int DLLLog(char buffer[]){ FILE *fp; switch (DLLInfor) { case DLLInfor_ConFile: fprintf(stdout, "%s", buffer); fp = fopen(DLL_LOG, "a"); if (!fp) { DLLErr = DLLERR_DllInfErr; return ; } fprintf(fp, "%s", buffer); fclose(fp); break; case DLLInfor_Console: fprintf(stdout, "%s", buffer); break; case DLLInfor_File: fp = fopen(DLL_LOG, "a"); if (!fp) { DLLErr = DLLERR_DllInfErr; return ; } fprintf(fp, "%s", buffer); fclose(fp); break; }}void DLLShowPara(int argc, char *argv[]){ int i = 0; DLLShowInfor("Para show:\n"); for ( i = 0; i < argc; i++) { DLLShowInfor("%d: %s ", i, argv[i]); } DLLShowInfor("\n[OK]\n");} void DLLInit(char argDllName[], char argVMVname[], int (*argFunc)(char *), DLLINFOR argInfor){ DLLInfor = argInfor; LogFunc = argFunc; DLLShowInfor("%s loading...\n", argDllName); Saved = 0; atexit(DLLSaveErrCode); strcpy(VMVName, argVMVname); FArr = (FArray)malloc(FA_SIZE * sizeof(FRecord)); if (!FArr) { DLLErr = DLLERR_InitErr; DLLShowInfor("[Failure]\n"); return; } DLLShowInfor("[OK]\n");} void DLLSaveErrCode(){ FILE *ferrcode; if (Saved) { return; } DLLShowInfor("Output error code %d to virtual memory...\n", DLLErr, VMVName); ferrcode = fopen(VMVName, "ab"); /*fprintf(ferrcode,"%d", DLLErr);*/ if (fwrite(&DLLErr, sizeof(DLLErr), 1, ferrcode) != 1) { DLLShowInfor("[Failure]\n"); } else { DLLShowInfor("[OK]\n"); } fclose(ferrcode); Saved = 1;} void DLLSaveReturn(VMVar vm){ FILE *fret; DLLSaveErrCode(); fret = fopen(VMVName, "ab"); DLLShowInfor("Output %d bytes to virtual memory %s...\n", vm.byte, VMVName); if (fwrite(vm.valptr, vm.byte, 1, fret) != 1) { DLLErr = DLLERR_VmWriteErr; } fclose(fret); DLLShowInfor("[OK]\n");} int DLLAddFunctionKey(void (*funcPtr)(int, char *[]), char funcName[]){ if (FCount > FA_SIZE) { FArr = (FArray)realloc(FCount * sizeof(FRecord)); if (!FArr) { DLLErr = DLLERR_NotEnoughMem; return; } } FArr[FCount].fptr = funcPtr; strcpy(FArr[FCount].fname ,funcName); FCount++;} void DLLDispatch(char funcName[], int argc, char *argv[]){ int cnt = 0; /*DLLShowInfor("Function %s loading...\n", funcName);*/ for (cnt = 0; cnt <= FCount; cnt++) { if (!strcmp(funcName, FArr[cnt].fname)) { /*DLLShowPara(argc, argv);*/ DLLShowInfor("Function %s loading...\n", funcName); DLLShowPara(argc, argv); FArr[cnt].fptr(argc, argv); if (!DLLErr) { DLLShowInfor("[OK]\n"); } else { DLLShowInfor("[Failure]\n"); } return; } } DLLErr = DLLERR_FunctionNotFound; DLLShowInfor("[Failure]\n");} /*File: loaddll.cVersion: 1.0Introduction: Dll Loading InterfaceCopyright (C) 2007-1 SGPRO*/ #include <errno.h>#include <stdio.h>#include "Dll.h" void GenVMFileName(char vmfname[], const char VMVName[]){ if (strlen(VMVName) > FIL_LEN + EXT_LEN + 1) { DLLErr = DLLERR_NameTooLong; } else { strcpy(vmfname,VMVName); strcat(vmfname, EXT_VM); }}/* 核心函数: 加载动态连接库 入口参数: result 虚拟内存变量: result.name 传入虚拟内存名, result.valptr 映射内存地址, result.byte 映射内存空间大小 mode 加载模式, 使用三种, 覆盖式0, 阻塞式1 DLLName 加载的动态连接库的库名 FunctionName 加载动态连接库内的函数名 Verify 加载的动态连接库需要的验证字符串 para 传入的参数 返回值: 无 功能: 加载动态连接库, 通过虚拟内存返回函数值, 通过result得到内存映射, 设置全局参数, 调用状态值DLLErr*/void LoadDll(VMVar result, int mode, char DLLName[], char FunctionName[], char Verify[], char *para[]){ char file[FIL_LEN + EXT_LEN + 2] = ""; int bnew = 0; FILE *fp; char errc; /*错误代号, 字符型读出, 转换成整数*/ GenVMFileName(file, result.name); /*产生虚拟内存变量名*/ if (DLLErr == DLLERR_NameTooLong) /*名称太长, 返回*/ { return; } if ( mode != 2 ) { if (access(file, 0) == -1) /*名字不存在, 需要新建文件*/ { bnew = 1; } fp = fopen(file, "w"); if (!fp) { DLLErr = DLLERR_VmCanNotWrite; return; } fclose(fp); if (bnew && errno == ENOENT) { errno = 0; /*新建文件产生的系统错误,忽略*/ } } if (spawnl(mode, /*调用模式*/ DLLName, /*DLL 名字*/ DLLName, /*参数类型, 字符串*/ Verify, /*DLL 验证字符串*/ file, /*虚拟内存文件名*/ FunctionName, /*调用的函数名称*/ para[0], para[1], para[2], para[3], para[4], para[5], /*参数, 取10个*/ para[6], para[7], para[8], para[9], NULL) == -1) { if (errno == 8) { DLLErr = DLLERR_NotEnoughMem; } else if (errno == 2) { DLLErr = DLLERR_DllNotExsist; /*DLL不存在*/ } else { DLLErr = DLLERR_ProcessLoadErr; } if ( mode != 2 ) { unlink(file); } return; } fp = fopen(file, "rb"); /*读虚拟内存, 由DLL注入的数据*/ if (!fp) { DLLErr = DLLERR_VmCanNotRead; /*无法读出, 返回错误*/ unlink(file); return; } if (fread(&DLLErr, sizeof(DLLErr), 1, fp) != 1) /*读出错误代号*/ { DLLErr = DLLERR_VmReadErr; /*无法读出, 返回错误*/ } if (DLLErr > DLLERR_DllInfErr) { unlink(file); return; /*发生比较严重的错误, 不读虚拟内存数据, 返回*/ } if(fread(result.valptr, result.byte, 1, fp) != 1) /*读出虚拟内存数据到内存映射*/ { DLLErr = DLLERR_VmReadErr; /*无法读出, 返回错误*/ } fclose(fp); /*关闭虚拟内存*/ unlink(file); /*删除虚拟内存文件*/} /*File: string.cVersion: 1.0Introduction: Dll Instance, string’s operationCopyright (C) 2007-1 SGPRO*/ #include "DllBase.c" /*#define DEBUG*/ #define VER 1.0 int print(char buff[]){ printf("%s", buff);} int_return(int iret){ VMVar vm; vm.valptr = &iret; vm.byte = sizeof(iret); DLLSaveReturn(vm); DLLShowInfor("DLL Output: %d\n", iret); } string_return(char * sret){ VMVar vm; vm.valptr = sret; vm.byte = strlen(sret) + 1; DLLSaveReturn(vm); DLLShowInfor("Dll output :%s\n", sret); } void ToLower(int argc, char *argv[]){ if (argc < 1) { DLLErr = DLLERR_FunctionArgErr; return; } strlwr(argv[argc-argc]); string_return(argv[argc-argc]);} void ToUpper(int argc, char *argv[]){ if (argc < 1) { DLLErr = DLLERR_FunctionArgErr; return; } strupr(argv[argc-argc]); string_return(argv[argc-argc]);} void Reverse(int argc, char *argv[]){ if (argc < 1) { DLLErr = DLLERR_FunctionArgErr; return; } strrev(argv[argc-argc]); string_return(argv[argc-argc]);} void Length(int argc, char *argv[]){ if (argc < 1) { DLLErr = DLLERR_FunctionArgErr; return; } int_return(strlen(argv[argc-argc]));} void Compare(int argc, char *argv[]){ if (argc < 2) { DLLErr = DLLERR_FunctionArgErr; return; } int_return(strcmp(argv[argc-argc], argv[argc-argc+1]));} void NCopy(int argc, char *argv[]){ char *str; int n; int i = 0; if (argc < 1) { DLLErr = DLLERR_FunctionArgErr; return; } str = (char *)malloc(strlen(argv[0])*sizeof(char)); memset(str, '\0', strlen(str)); n = atoi(argv[1]); for (i = 0; i <n && i < strlen(argv[0]); i++) { str[i] = argv[0][i]; } string_return(str);} int main(int argc, char *argv[]){ #ifdef DEBUG argc = 5; strcpy(argv[DLLARG_VMVNAME], "str.vm"); strcpy(argv[DLLARG_VERIFY], "DLLTEST10"); strcpy(argv[DLLARG_FUNCTIONNAME], "NCopy"); strcpy(argv[DLLARG_PARA], "China"); strcpy(argv[DLLARG_PARA+1], "3");#endif DLLInit(argv[DLLARG_DLLNAME], argv[DLLARG_VMVNAME], DLLLog, DLLInfor_ConFile); DLLShowPara(argc, argv); DLLVerify("DLLTEST10", argv[DLLARG_VERIFY]); if (DLLErr == DLLERR_VerifyErr) { return -1; } DLLAddFunctionKey(Reverse, "Reverse"); DLLAddFunctionKey(Length, "Length"); DLLAddFunctionKey(ToUpper, "ToUpper"); DLLAddFunctionKey(ToLower, "ToLower"); DLLAddFunctionKey(Compare, "Compare"); DLLAddFunctionKey(NCopy, "NCopy"); DLLDispatch(argv[DLLARG_FUNCTIONNAME], argc - DLLARG_PARA, argv + DLLARG_PARA); return argc-argc; } /*File: dllexam.cVersion: 1.0Introduction: Dll loading Instance, loading the string.dll libraryCopyright (C) 2007-1 SGPRO*/#include "dllbase.c"#include "loaddll.c" #define DLLNAME "string.dll"#define VERIFY "DLLTEST10"#define STRINGLEN 60 main(){ char *para[STRINGLEN] = {"China", "sgpro", 0}; char *para2[STRINGLEN] = {"ILoveBorland", "Microsoft"}; char *para3[STRINGLEN] = {"YanniRepresent."}; VMVar vm; char res[10]=""; int com=0; vm.valptr = res; vm.name = "str"; system("del LOADDLL.LOG"); vm.byte = strlen(para[0]); #undef printf LogFunc = DLLLog; DLLInfor = DLLInfor_ConFile; LoadDll(vm, 0, DLLNAME, "Reverse", VERIFY, para); DLLShowInfor("Load Dll status: %s\nValue Destination: %s\n", (DLLErr == DLLERR_NoErr)?"Normally":"Fail", res); LoadDll(vm, 0, DLLNAME, "ToUpper", VERIFY, para); DLLShowInfor("Load Dll status: %s\nValue Destination: %s\n", (DLLErr == DLLERR_NoErr)?"Normally":"Fail", res); LoadDll(vm, 0, DLLNAME, "ToLower", VERIFY, para); DLLShowInfor("Load Dll status: %s\nValue Destination: %s\n", (DLLErr == DLLERR_NoErr)?"Normally":"Fail", res); strcpy(para[1], "3"); vm.byte = 4; LoadDll(vm, 0, DLLNAME, "NCopy", VERIFY, para); DLLShowInfor("Load Dll status: %s\nValue Destination: %s\n", (DLLErr == DLLERR_NoErr)?"Normally":"Fail", res); vm.byte = sizeof(int); vm.valptr = &com; LoadDll(vm, 0, DLLNAME, "Compare", VERIFY, para2); DLLShowInfor("Load Dll status: %s\nValue Destination: %d\n", (DLLErr == DLLERR_NoErr)?"Normally":"Fail", com); LoadDll(vm, 0, DLLNAME, "Length", VERIFY, para3); DLLShowInfor("Load Dll status: %s\nValue Destination: %d\n", (DLLErr == DLLERR_NoErr)?"Normally":"Fail", com); if (DLLErr) { DLLShowInfor("Load Dll Error: %d\n", DLLErr); } perror("Program infor"); system("notepad loaddll.log");} LOADDLL LOGD:\MYRELE~1\DLL_SMLT\STRING.DLL loading...[OK]Para show:0: D:\MYRELE~1\DLL_SMLT\STRING.DLL 1: DLLTEST10 2: str.vm 3: Reverse 4: China 5: sgpro [OK]DLL para[DLLTEST10] Verify...[OK]Function Reverse loading...Para show:0: China 1: sgpro [OK]Save error code: 0...[OK]Save return 6 bytes ...[OK]Dll output :anihC[OK]Load Dll status: NormallyValue Destination: anihCD:\MYRELE~1\DLL_SMLT\STRING.DLL loading...[OK]Para show:0: D:\MYRELE~1\DLL_SMLT\STRING.DLL 1: DLLTEST10 2: str.vm 3: ToUpper 4: China 5: sgpro [OK]DLL para[DLLTEST10] Verify...[OK]Function ToUpper loading...Para show:0: China 1: sgpro [OK]Save error code: 0...[OK]Save return 6 bytes ...[OK]Dll output :CHINA[OK]Load Dll status: NormallyValue Destination: CHINAD:\MYRELE~1\DLL_SMLT\STRING.DLL loading...[OK]Para show:0: D:\MYRELE~1\DLL_SMLT\STRING.DLL 1: DLLTEST10 2: str.vm 3: ToLower 4: China 5: sgpro [OK]DLL para[DLLTEST10] Verify...[OK]Function ToLower loading...Para show:0: China 1: sgpro [OK]Save error code: 0...[OK]Save return 6 bytes ...[OK]Dll output :china[OK]Load Dll status: NormallyValue Destination: chinaD:\MYRELE~1\DLL_SMLT\STRING.DLL loading...[OK]Para show:0: D:\MYRELE~1\DLL_SMLT\STRING.DLL 1: DLLTEST10 2: str.vm 3: NCopy 4: China 5: 3 [OK]DLL para[DLLTEST10] Verify...[OK]Function NCopy loading...Para show:0: China 1: 3 [OK]Save error code: 0...[OK]Save return 4 bytes ...[OK]Dll output :Chi[OK]Load Dll status: NormallyValue Destination: ChiD:\MYRELE~1\DLL_SMLT\STRING.DLL loading...[OK]Para show:0: D:\MYRELE~1\DLL_SMLT\STRING.DLL 1: DLLTEST10 2: str.vm 3: Compare 4: ILoveBorland 5: Microsoft [OK]DLL para[DLLTEST10] Verify...[OK]Function Compare loading...Para show:0: ILoveBorland 1: Microsoft [OK]Save error code: 0...[OK]Save return 2 bytes ...[OK]DLL Output: -4[OK]Load Dll status: NormallyValue Destination: -4D:\MYRELE~1\DLL_SMLT\STRING.DLL loading...[OK]Para show:0: D:\MYRELE~1\DLL_SMLT\STRING.DLL 1: DLLTEST10 2: str.vm 3: Length 4: YanniRepresent. [OK]DLL para[DLLTEST10] Verify...[OK]Function Length loading...Para show:0: YanniRepresent. [OK]Save error code: 0...[OK]Save return 2 bytes ...[OK]DLL Output: 15[OK]Load Dll status: NormallyValue Destination: 15

评论