Advertisement
expired6978

DynamicCast

Nov 14th, 2016
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.35 KB | None | 0 0
  1. void *__fastcall _RTDynamicCast(void *inptr, int VfDelta, void *SrcType, void *TargetType, int isReference)
  2. {
  3.   TypeDescriptor *v5; // r15@1
  4.   TypeDescriptor *v6; // r12@1
  5.   __int64 v7; // r13@1
  6.   void *v8; // r14@1
  7.   void *v9; // rbx@1
  8.   void *v10; // rax@2
  9.   __int64 v11; // rsi@3
  10.   char *v12; // rdi@3
  11.   PVOID v13; // rcx@6
  12.   __int64 v14; // r14@8
  13.   int v15; // edx@8
  14.   _s_RTTIBaseClassDescriptor *v16; // rax@9
  15.   std::bad_cast result; // [sp+40h] [bp-48h]@18
  16.   PVOID BaseOfImage; // [sp+90h] [bp+8h]@6
  17.  
  18.   v5 = (TypeDescriptor *)TargetType;
  19.   v6 = (TypeDescriptor *)SrcType;
  20.   v7 = VfDelta;
  21.   v8 = inptr;
  22.   v9 = 0i64;
  23.   if ( inptr )
  24.   {
  25.     v11 = *(_QWORD *)(*(_QWORD *)inptr - 8i64);
  26.     v12 = (char *)inptr - *(_DWORD *)(v11 + 4);
  27.     if ( *(_DWORD *)(v11 + 8) )
  28.       v12 -= *(_DWORD *)((char *)inptr - *(_DWORD *)(v11 + 8));
  29.     if ( *(_DWORD *)v11 )
  30.     {
  31.       v13 = (PVOID)(v11 - *(_DWORD *)(v11 + 20));
  32.     }
  33.     else
  34.     {
  35.       v13 = RtlPcToFileHeader((PVOID)v11, &BaseOfImage);
  36.       BaseOfImage = v13;
  37.     }
  38.     v14 = (char *)v8 - v7 - v12;
  39.     v15 = *(_DWORD *)((char *)v13 + *(_DWORD *)(v11 + 16) + 4);
  40.     if ( v15 & 1 )
  41.     {
  42.       if ( v15 & 2 )
  43.         v16 = FindVITargetTypeInstance(v12, (_s_RTTICompleteObjectLocator *)v11, v6, v14, v5, (unsigned __int64)v13);
  44.       else
  45.         v16 = FindMITargetTypeInstance(v12, (_s_RTTICompleteObjectLocator *)v11, v6, v14, v5, (unsigned __int64)v13);
  46.     }
  47.     else
  48.     {
  49.       v16 = FindSITargetTypeInstance((_s_RTTICompleteObjectLocator *)v11, v6, v5, (unsigned __int64)v13);
  50.     }
  51.     if ( v16 )
  52.     {
  53.       if ( v16->where.pdisp >= 0 )
  54.         v9 = (void *)(*(_DWORD *)(*(_QWORD *)&v12[v16->where.pdisp] + v16->where.vdisp)
  55.                     + (signed __int64)v16->where.pdisp);
  56.       v9 = (char *)v9 + v16->where.mdisp + (_QWORD)v12;
  57.     }
  58.     else if ( isReference )
  59.     {
  60.       std::bad_cast::__construct_from_string_literal(&result, (const char *const )v16);
  61.       CxxThrowException(&result, &TI2_AVbad_cast_std__);
  62.     }
  63.     v10 = v9;
  64.   }
  65.   else
  66.   {
  67.     v10 = 0i64;
  68.   }
  69.   return v10;
  70. }
  71.  
  72.  
  73.  
  74.  
  75. unsigned __int64 __fastcall FindVITargetTypeInstance(void *pCompleteObject, _s_RTTICompleteObjectLocator *pCOLocator, TypeDescriptor *pSrcTypeID, __int64 SrcOffset, TypeDescriptor *pTargetTypeID, unsigned __int64 _ImageBase)
  76. {
  77.   unsigned __int64 v6; // rdi@1
  78.   signed __int64 v7; // r8@1
  79.   __int64 v8; // rax@1
  80.   signed int v9; // er12@1
  81.   unsigned __int64 v10; // rsi@1
  82.   unsigned __int64 v11; // r14@1
  83.   unsigned __int64 v12; // rbp@1
  84.   unsigned __int64 v13; // r11@1
  85.   unsigned int v14; // er13@1
  86.   char v15; // r9@1
  87.   unsigned __int64 v16; // r15@1
  88.   signed int v17; // ebx@1
  89.   unsigned __int64 v18; // rdx@2
  90.   TypeDescriptor *v19; // rax@3
  91.   signed __int64 v20; // rax@4
  92.   char *v21; // r10@4
  93.   int v22; // er8@5
  94.   int v23; // ecx@5
  95.   unsigned __int64 v24; // rax@8
  96.   TypeDescriptor *v25; // rax@11
  97.   signed __int64 v26; // rax@12
  98.   signed __int64 v27; // r10@12
  99.   int v28; // er8@13
  100.   int v29; // ecx@13
  101.   __int64 v30; // r8@19
  102.   char v31; // dl@25
  103.   __int64 v32; // rcx@26
  104.   bool v33; // zf@26
  105.   char v34; // cl@26
  106.   signed __int64 v35; // rdx@31
  107.   void *v37; // [sp+48h] [bp+8h]@1
  108.   signed __int64 v38; // [sp+50h] [bp+10h]@1
  109.   TypeDescriptor *v39; // [sp+58h] [bp+18h]@1
  110.   __int64 v40; // [sp+60h] [bp+20h]@1
  111.   unsigned int _ImageBasea; // [sp+70h] [bp+30h]@1
  112.  
  113.   v40 = SrcOffset;
  114.   v39 = pSrcTypeID;
  115.   v37 = pCompleteObject;
  116.   v6 = _ImageBase;
  117.   v7 = 0i64;
  118.   v8 = pCOLocator->pClassDescriptor;
  119.   v9 = -1;
  120.   v38 = -1i64;
  121.   v10 = 0i64;
  122.   v11 = 0i64;
  123.   v12 = 0i64;
  124.   v13 = 0i64;
  125.   v14 = 0;
  126.   v15 = 1;
  127.   v16 = _ImageBase + *(_DWORD *)(v8 + _ImageBase + 12);
  128.   _ImageBasea = *(_DWORD *)(v8 + _ImageBase + 8);
  129.   v17 = 0;
  130.   if ( !_ImageBasea )
  131.     return 0i64;
  132.   do
  133.   {
  134.     v18 = v6 + *(_DWORD *)v16;
  135.     if ( v17 - v9 > v14 )
  136.     {
  137.       v19 = (TypeDescriptor *)(v6 + *(_DWORD *)v18);
  138.       if ( v19 == pTargetTypeID )
  139.         goto LABEL_49;
  140.       v20 = (signed __int64)&v19[1];
  141.       v21 = (char *)&pTargetTypeID[1] - v20;
  142.       do
  143.       {
  144.         v22 = (unsigned __int8)v21[v20];
  145.         v23 = *(_BYTE *)v20 - v22;
  146.         if ( *(_BYTE *)v20 != v22 )
  147.           break;
  148.         ++v20;
  149.       }
  150.       while ( v22 );
  151.       v7 = 0i64;
  152.       if ( !v23 )
  153.       {
  154. LABEL_49:
  155.         v24 = v6 + *(_DWORD *)v16;
  156.         v14 = *(_DWORD *)(v18 + 4);
  157.         v13 = v6 + *(_DWORD *)v16;
  158.         if ( *(_BYTE *)(v18 + 20) & 3 )
  159.           v24 = v12;
  160.         v9 = v17;
  161.         v12 = v24;
  162.       }
  163.     }
  164.     v25 = (TypeDescriptor *)(v6 + *(_DWORD *)v18);
  165.     if ( v25 == v39 )
  166.       goto LABEL_50;
  167.     v26 = (signed __int64)&v25[1];
  168.     v27 = (signed __int64)((char *)&v39[1] - v26);
  169.     do
  170.     {
  171.       v28 = *(_BYTE *)(v26 + v27);
  172.       v29 = *(_BYTE *)v26 - v28;
  173.       if ( *(_BYTE *)v26 != v28 )
  174.         break;
  175.       ++v26;
  176.     }
  177.     while ( v28 );
  178.     v7 = 0i64;
  179.     if ( !v29 )
  180.     {
  181. LABEL_50:
  182.       if ( *(_DWORD *)(v18 + 12) >= 0 )
  183.         v7 = *(_DWORD *)(*(_QWORD *)((char *)v37 + *(_DWORD *)(v18 + 12)) + *(_DWORD *)(v18 + 16))
  184.            + (signed __int64)*(_DWORD *)(v18 + 12);
  185.       if ( v7 + *(_DWORD *)(v18 + 8) != v40 )
  186.         goto LABEL_38;
  187.       v30 = (unsigned int)(v17 - v9);
  188.       if ( (unsigned int)v30 > v14 )
  189.       {
  190.         if ( !(*(_BYTE *)(v18 + 20) & 5) )
  191.           v11 = v6 + *(_DWORD *)v16;
  192. LABEL_38:
  193.         v7 = 0i64;
  194.         goto LABEL_39;
  195.       }
  196.       if ( !v15 )
  197.         goto LABEL_38;
  198.       if ( *(_BYTE *)(v13 + 20) & 0x40 )
  199.       {
  200.         v32 = *(_DWORD *)(v6 + *(_DWORD *)(*(_DWORD *)(v13 + 24) + v6 + 12) + 4 * v30);
  201.         v7 = 0i64;
  202.         v31 = ~(unsigned __int8)(*(_DWORD *)(v32 + v6 + 20) >> 2) & 1;
  203.         v33 = (*(_BYTE *)(v32 + v6 + 20) & 1) == 0;
  204.         v34 = 0;
  205.         if ( v33 )
  206.           v34 = v15;
  207.         v15 = v34;
  208.       }
  209.       else
  210.       {
  211.         v7 = 0i64;
  212.         if ( !v9 && *(_BYTE *)(v18 + 20) & 1 )
  213.           v15 = 0;
  214.         v31 = 1;
  215.       }
  216.       if ( v15 && v31 )
  217.       {
  218.         v35 = 0i64;
  219.         if ( *(_DWORD *)(v13 + 12) >= 0 )
  220.           v35 = *(_DWORD *)(*(_QWORD *)((char *)v37 + *(_DWORD *)(v13 + 12)) + *(_DWORD *)(v13 + 16))
  221.               + (signed __int64)*(_DWORD *)(v13 + 12);
  222.         if ( v10 && v38 != v35 + *(_DWORD *)(v13 + 8) )
  223.           return 0i64;
  224.         v10 = v13;
  225.         v38 = v35 + *(_DWORD *)(v13 + 8);
  226.       }
  227.     }
  228. LABEL_39:
  229.     ++v17;
  230.     v16 += 4i64;
  231.   }
  232.   while ( v17 < _ImageBasea );
  233.   if ( v15 && v10 )
  234.     return v10;
  235.   if ( v11 && v12 )
  236.     return v12;
  237.   return 0i64;
  238. }
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245. unsigned __int64 __fastcall FindMITargetTypeInstance(void *pCompleteObject, _s_RTTICompleteObjectLocator *pCOLocator, TypeDescriptor *pSrcTypeID, __int64 SrcOffset, TypeDescriptor *pTargetTypeID, unsigned __int64 _ImageBase)
  246. {
  247.   __int64 v6; // rax@1
  248.   signed int v7; // edi@1
  249.   TypeDescriptor *v8; // r13@1
  250.   unsigned __int64 v9; // r10@1
  251.   unsigned __int64 v10; // rsi@1
  252.   unsigned int v11; // er14@1
  253.   signed int v12; // er8@1
  254.   unsigned int v13; // er12@1
  255.   unsigned __int64 v14; // rbp@1
  256.   unsigned __int64 v15; // rdx@2
  257.   TypeDescriptor *v16; // rax@3
  258.   signed __int64 v17; // rax@4
  259.   char *v18; // rbx@4
  260.   int v19; // er9@5
  261.   int v20; // ecx@5
  262.   unsigned __int64 v21; // rax@10
  263.   signed __int64 v22; // rax@11
  264.   signed __int64 v23; // rbx@11
  265.   int v24; // er9@12
  266.   int v25; // ecx@12
  267.   signed __int64 v26; // r9@15
  268.   __int64 v28; // r8@25
  269.   void *v29; // [sp+38h] [bp+8h]@1
  270.   __int64 v30; // [sp+50h] [bp+20h]@1
  271.  
  272.   v30 = SrcOffset;
  273.   v29 = pCompleteObject;
  274.   v6 = pCOLocator->pClassDescriptor;
  275.   v7 = -1;
  276.   v8 = pSrcTypeID;
  277.   v9 = 0i64;
  278.   v10 = 0i64;
  279.   v11 = 0;
  280.   v12 = 0;
  281.   v13 = *(_DWORD *)(v6 + _ImageBase + 8);
  282.   v14 = _ImageBase + *(_DWORD *)(v6 + _ImageBase + 12);
  283.   if ( !v13 )
  284.     return 0i64;
  285.   while ( 1 )
  286.   {
  287.     v15 = _ImageBase + *(_DWORD *)v14;
  288.     if ( v12 - v7 > v11 )
  289.     {
  290.       v16 = (TypeDescriptor *)(_ImageBase + *(_DWORD *)v15);
  291.       if ( v16 == pTargetTypeID )
  292.         goto LABEL_37;
  293.       v17 = (signed __int64)&v16[1];
  294.       v18 = (char *)&pTargetTypeID[1] - v17;
  295.       do
  296.       {
  297.         v19 = (unsigned __int8)v18[v17];
  298.         v20 = *(_BYTE *)v17 - v19;
  299.         if ( *(_BYTE *)v17 != v19 )
  300.           break;
  301.         ++v17;
  302.       }
  303.       while ( v19 );
  304.       if ( !v20 )
  305.       {
  306. LABEL_37:
  307.         if ( v10 )
  308.         {
  309.           if ( !(*(_BYTE *)(v15 + 20) & 3) && !(*(_BYTE *)(v10 + 20) & 1) )
  310.             return _ImageBase + *(_DWORD *)v14;
  311.           return 0i64;
  312.         }
  313.         v11 = *(_DWORD *)(v15 + 4);
  314.         v9 = _ImageBase + *(_DWORD *)v14;
  315.         v7 = v12;
  316.       }
  317.     }
  318.     v21 = _ImageBase + *(_DWORD *)v15;
  319.     if ( (TypeDescriptor *)v21 == v8 )
  320.       goto LABEL_38;
  321.     v22 = v21 + 16;
  322.     v23 = (signed __int64)((char *)&v8[1] - v22);
  323.     do
  324.     {
  325.       v24 = *(_BYTE *)(v22 + v23);
  326.       v25 = *(_BYTE *)v22 - v24;
  327.       if ( *(_BYTE *)v22 != v24 )
  328.         break;
  329.       ++v22;
  330.     }
  331.     while ( v24 );
  332.     if ( !v25 )
  333.     {
  334. LABEL_38:
  335.       v26 = 0i64;
  336.       if ( *(_DWORD *)(v15 + 12) >= 0 )
  337.         v26 = *(_DWORD *)(*(_QWORD *)((char *)v29 + *(_DWORD *)(v15 + 12)) + *(_DWORD *)(v15 + 16))
  338.             + (signed __int64)*(_DWORD *)(v15 + 12);
  339.       if ( v26 + *(_DWORD *)(v15 + 8) == v30 )
  340.         break;
  341.     }
  342. LABEL_20:
  343.     ++v12;
  344.     v14 += 4i64;
  345.     if ( v12 >= v13 )
  346.       return 0i64;
  347.   }
  348.   if ( !v9 )
  349.   {
  350.     v10 = _ImageBase + *(_DWORD *)v14;
  351.     goto LABEL_20;
  352.   }
  353.   v28 = (unsigned int)(v12 - v7);
  354.   if ( (unsigned int)v28 <= v11 )
  355.   {
  356.     if ( *(_BYTE *)(v9 + 20) & 0x40 )
  357.     {
  358.       if ( *(_BYTE *)(*(_DWORD *)(_ImageBase + *(_DWORD *)(*(_DWORD *)(v9 + 24) + _ImageBase + 12) + 4 * v28)
  359.                     + _ImageBase
  360.                     + 20) & 1 )
  361.         v9 = 0i64;
  362.     }
  363.     else if ( !v7 )
  364.     {
  365. LABEL_28:
  366.       if ( *(_BYTE *)(v15 + 20) & 1 )
  367.         return 0i64;
  368.     }
  369.     return v9;
  370.   }
  371.   if ( !(*(_BYTE *)(v9 + 20) & 3) )
  372.     goto LABEL_28;
  373.   return 0i64;
  374. }
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381. unsigned __int64 __fastcall FindSITargetTypeInstance(_s_RTTICompleteObjectLocator *pCOLocator, TypeDescriptor *pSrcTypeID, TypeDescriptor *pTargetTypeID, unsigned __int64 _ImageBase)
  382. {
  383.   __int64 v4; // rax@1
  384.   unsigned __int64 v5; // r11@1
  385.   unsigned int v6; // ecx@1
  386.   TypeDescriptor *v7; // rbp@1
  387.   TypeDescriptor *v8; // r14@1
  388.   unsigned int v9; // esi@1
  389.   unsigned __int64 v10; // r10@1
  390.   unsigned __int64 v11; // r8@2
  391.   unsigned __int64 v12; // rbx@3
  392.   TypeDescriptor *v13; // rax@3
  393.   signed __int64 v14; // rax@4
  394.   signed __int64 v15; // rdi@4
  395.   int v16; // er9@5
  396.   int v17; // edx@5
  397.   __int64 v19; // rcx@11
  398.   signed __int64 v20; // r8@12
  399.   __int64 v21; // rax@13
  400.   TypeDescriptor *v22; // rax@14
  401.   signed __int64 v23; // rax@15
  402.   signed __int64 v24; // r10@15
  403.   int v25; // er9@16
  404.   int v26; // edx@16
  405.  
  406.   v4 = pCOLocator->pClassDescriptor;
  407.   v5 = _ImageBase;
  408.   v6 = 0;
  409.   v7 = pTargetTypeID;
  410.   v8 = pSrcTypeID;
  411.   v9 = *(_DWORD *)(v4 + _ImageBase + 8);
  412.   v10 = _ImageBase + *(_DWORD *)(v4 + _ImageBase + 12);
  413.   if ( v9 )
  414.   {
  415.     v11 = _ImageBase + *(_DWORD *)(v4 + _ImageBase + 12);
  416.     while ( 1 )
  417.     {
  418.       v12 = v5 + *(_DWORD *)v11;
  419.       v13 = (TypeDescriptor *)(v5 + *(_DWORD *)v12);
  420.       if ( v13 == v7 )
  421.         break;
  422.       v14 = (signed __int64)&v13[1];
  423.       v15 = (signed __int64)((char *)&v7[1] - v14);
  424.       do
  425.       {
  426.         v16 = *(_BYTE *)(v14 + v15);
  427.         v17 = *(_BYTE *)v14 - v16;
  428.         if ( *(_BYTE *)v14 != v16 )
  429.           break;
  430.         ++v14;
  431.       }
  432.       while ( v16 );
  433.       if ( !v17 )
  434.         break;
  435.       ++v6;
  436.       v11 += 4i64;
  437.       if ( v6 >= v9 )
  438.         return 0i64;
  439.     }
  440.     v19 = v6 + 1;
  441.     if ( (unsigned int)v19 < v9 )
  442.     {
  443.       v20 = v10 + 4 * v19;
  444.       do
  445.       {
  446.         v21 = *(_DWORD *)v20;
  447.         if ( *(_BYTE *)(v21 + v5 + 20) & 4 )
  448.           break;
  449.         v22 = (TypeDescriptor *)(v5 + *(_DWORD *)(v21 + v5));
  450.         if ( v22 == v8 )
  451.           return v12;
  452.         v23 = (signed __int64)&v22[1];
  453.         v24 = (signed __int64)((char *)&v8[1] - v23);
  454.         do
  455.         {
  456.           v25 = *(_BYTE *)(v23 + v24);
  457.           v26 = *(_BYTE *)v23 - v25;
  458.           if ( *(_BYTE *)v23 != v25 )
  459.             break;
  460.           ++v23;
  461.         }
  462.         while ( v25 );
  463.         if ( !v26 )
  464.           return v12;
  465.         LODWORD(v19) = v19 + 1;
  466.         v20 += 4i64;
  467.       }
  468.       while ( (unsigned int)v19 < v9 );
  469.     }
  470.   }
  471.   return 0i64;
  472. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement