VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 3415|回复: 3

msvbvm60里dllfunctioncall部分反编译

[复制链接]
发表于 2015-6-28 02:43:03 | 显示全部楼层 |阅读模式
两个结构体名称都是微软官方的叫法(pdb里的),里面的名字是我起的(其实也参考了iceboy的叫法)当初iceboyhttp://www.vbgood.com/thread-112926-1-1.html没确定的两个项现在也有了名字
hresult的值我都没翻译。。。查起来太麻烦,如果有谁知道怎么查的话告诉我一下
  1. #include <Windows.h>

  2. typedef struct
  3. {
  4.         ULONG ErrCode;//不太确定,基本没有访问这个域的,只有一个地方写了个错误代码
  5.         HMODULE hModule;
  6.         FARPROC pFunction;
  7. }epiDllTemplateInfo, *PepiDllTemplateInfo;

  8. typedef struct
  9. {
  10.         LPCSTR ModuleName;//dll名
  11.         LPCSTR FunctionName;//函数名
  12.         union
  13.         {
  14.                 UINT Ordinal;//导入序数
  15.                 BYTE Flag;
  16.                 BYTE padding;//没有用到,估计是4字节对齐
  17.         };
  18.         epiDllTemplateInfo* DllTemplateInfo;
  19. }serDllTemplate, *PserDllTemplate;

  20. UINT __cdecl HresultOfLoadLibraryErr()
  21. {
  22.         DWORD LastErr = GetLastError();
  23.         if (LastErr)
  24.         {
  25.                 if (LastErr == 2)
  26.                         return -2147287038;
  27.                 if (LastErr == 3)
  28.                         return -2147287037;
  29.                 if (LastErr != 8)
  30.                 {
  31.                         if (LastErr <= 125 || LastErr > 127)
  32.                                 return -2147312566;
  33.                         return -2147287038;
  34.                 }
  35.         }
  36.         return -2147024882;
  37. }

  38. BOOL __stdcall ReleaseLibrary(HMODULE hLibModule)//在其他地方也有调用,这个判断不知道有什么用
  39. {
  40.         BOOL result; // eax@2

  41.         if ((UINT)hLibModule >= 0x20)
  42.                 result = FreeLibrary(hLibModule);
  43.         return result;
  44. }

  45. FARPROC __stdcall DllFunctionCall(PserDllTemplate DllTemplate)
  46. {
  47.         HRESULT result; // eax@1
  48.         int Eberr; // edi@7
  49.         FARPROC pFunc; // [sp+Ch] [bp-8h]@1
  50.         BSTR ErrString; // [sp+10h] [bp-4h]@1

  51.         ErrString = 0;
  52.         result = GetPvDllFunction(DllTemplate, 0, &pFunc, &ErrString, &v9);
  53.         if (result < 0)
  54.         {
  55.                 if (!ErrString)
  56.                 {
  57.                         EbRaiseExceptionCode(result);
  58.                 }
  59.                 if (sub_EberrOfHresult(result))
  60.                 {
  61.                         Eberr = sub_EberrOfHresult(result) | 0x800A0000;
  62.                 }
  63.                 else
  64.                 {
  65.                         Eberr = 0;
  66.                 }
  67.                 LPVOID Tls; // eax@8
  68.                 Tls = TlsGetValue(dword_dwTlsIndex);
  69.                 ExcepinfoOfScode((void *)Eberr, (int)((char *)Tls + 120));
  70.                 *((LPBSTR)Tls + 32) = ErrString;//貌似是err对象的老巢?
  71.                 EbRaiseException((char *)Tls + 120);
  72.         }
  73.         if (IsEventMonitoring)
  74.         {
  75.                 VBAEventDllFunctionCall(DllTemplate, pFunc);
  76.         }
  77.         return pFunc;
  78. }

  79. HRESULT __stdcall GetPvDllFunction(PserDllTemplate DllTemplate, PepiDllTemplateInfo DllTemplateInfo, FARPROC* ppFunc, LPBSTR ErrString, PUINT ErrCode)
  80. {
  81.         HMODULE hModule; // eax@4
  82.         FARPROC pFunc; // eax@10
  83.         UINT ErrMode; // [sp+24h] [bp+Ch]@3

  84.         if (DllTemplateInfo == NULL)
  85.         {
  86.                 DllTemplateInfo = DllTemplate->DllTemplateInfo;
  87.         }
  88.         ErrMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
  89.         if ((UINT)DllTemplateInfo->hModule < 0x20u && (hModule = LoadLibraryA(DllTemplate->ModuleName), DllTemplateInfo->hModule = hModule, (UINT)hModule < 0x20u))
  90.         {
  91.                 HRESULT LoadLibraryErr = HresultOfLoadLibraryErr(); // edi@9
  92.                 SetErrorMode(ErrMode);
  93.                 *ErrCode = 40243;
  94.                 InitExcepInfoWithSubstMsg(40243, DllTemplate->ModuleName, NULL, ErrString);
  95.                 return LoadLibraryErr;
  96.         }
  97.         else
  98.         {
  99.                 HRESULT result; // ebx@11
  100.                 LPCSTR FunctionName;
  101.                 CHAR MultiByteStr[10]; // [sp+Ch] [bp-Ch]@11//这个长度10是我随便写的
  102.                 SetErrorMode(ErrMode);
  103.                 if (DllTemplate->Flag & 2)
  104.                 {
  105.                         pFunc = GetProcAddress(DllTemplateInfo->hModule, (LPCSTR)DllTemplate->Ordinal);
  106.                         *ppFunc = pFunc;
  107.                         if (pFunc)
  108.                                 DllTemplateInfo->pFunction = pFunc;
  109.                         return 0;
  110.                         _itoa(DllTemplate->Ordinal, MultiByteStr, 10);
  111.                         result = -2146827836;
  112.                         DllTemplateInfo->ErrCode = 59201;
  113.                         FunctionName = MultiByteStr;
  114.                 }
  115.                 else
  116.                 {
  117.                         pFunc = GetProcAddress(DllTemplateInfo->hModule, DllTemplate->FunctionName);
  118.                         *ppFunc = pFunc;
  119.                         if (pFunc)
  120.                         {
  121.                                 DllTemplateInfo->pFunction = pFunc;
  122.                                 return 0;
  123.                         }
  124.                         result = -2147319761;
  125.                         DllTemplateInfo->ErrCode = 59201;
  126.                         FunctionName = DllTemplate->FunctionName;
  127.                 }
  128.                 InitExcepInfoWithSubstMsg(59201, FunctionName, DllTemplate->ModuleName, ErrString);
  129.                 ReleaseLibrary(DllTemplateInfo->hModule);
  130.                 DllTemplateInfo->hModule = 0;
  131.                 return result;
  132.         }
  133. }
复制代码

本帖被以下淘专辑推荐:

发表于 2015-6-28 11:59:52 | 显示全部楼层
不错,收藏了,以后用的到时再看看~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-28 21:49:23 | 显示全部楼层
晕倒,错了,那个结构体应该改成
  1. typedef struct
  2. {
  3.         LPCSTR ModuleName;
  4.         LPCSTR FunctionName;
  5.         USHORT Ordinal;
  6.         BYTE Flag;
  7.         BYTE padding;
  8.         epiDllTemplateInfo* DllTemplateInfo;
  9. }serDllTemplate, *PserDllTemplate;
复制代码
今天替换了一下msvbvm60才发现不对
回复 支持 反对

使用道具 举报

发表于 2015-6-29 21:01:12 | 显示全部楼层
你快把VB6逆个底朝天了

点评

早着呢,ida逆出来的代码有8.43MB,我只能弄一部分,目前目标是能执行无窗口不用com的程序  发表于 2015-6-30 00:47
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-1 22:39

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表