正文

Dll Simulator(仿真动态连接库)2007-03-29 14:55:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sgpro/24387.html

分享到:

/*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

阅读(3324) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册