T-D-K

Untitled

Mar 20th, 2018
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Дамп TestClass:
  2. MT          Field   Offset  Type VT                 Attr    Value       Name
  3. 02ed4e40    4000003 4       ...cation77.MyStruct    1       instance    <MyStruct>k__BackingField
  4. Видно, что бэкинфилд для MyStruct MyStruct {get; set;} живёт по смещению 4 от начала класса TestClass
  5.  
  6. Дамп MyStruct:
  7.  
  8. MT          Field   Offset  Type VT         Attr    Value       Name
  9. 72111a90    4000001 4       System.Int32    1       instance    <Value>k__BackingField
  10. 72111a90    4000002 8       System.Int32    1       instance    <OtherValue>k__BackingField
  11. Тут два филда по 4 и 8 смещённые от начала структуры
  12.  
  13.  
  14. ConsoleApplication77.TestClass.DoThings()
  15. public void TestClass.DoThings() {
  16. 03130548 55              push    ebp
  17. 03130549 8bec            mov     ebp,esp
  18. 0313054b 57              push    edi
  19. 0313054c 56              push    esi
  20. 0313054d 83ec34          sub     esp,34h
  21. 03130550 33c0            xor     eax,eax
  22. 03130552 8945f0          mov     dword ptr [ebp-10h],eax
  23. 03130555 8945f4          mov     dword ptr [ebp-0Ch],eax
  24. 03130558 8945dc          mov     dword ptr [ebp-24h],eax
  25. 0313055b 8945c8          mov     dword ptr [ebp-38h],eax
  26. 0313055e 894dc4          mov     dword ptr [ebp-3Ch],ecx
  27. 03130561 833dc042ed0200  cmp     dword ptr ds:[2ED42C0h],0
  28. 03130568 7405            je      0313056f
  29. 0313056a e861316970      call    clr!JIT_DbgIsJustMyCode (737c36d0)
  30. 0313056f 90              nop
  31.  
  32. MyStruct = new MyStruct(0xBEEF);
  33. 03130570 8d7de8          lea     edi,[ebp-18h]
  34. 03130573 0f57c0          xorps   xmm0,xmm0
  35. 03130576 660fd607        movq    mmword ptr [edi],xmm0
  36. 0313057a 8d4de8          lea     ecx,[ebp-18h]
  37. 0313057d baefbe0000      mov     edx,0BEEFh
  38. 03130582 ff153c4eed02    call    dword ptr ds:[2ED4E3Ch] (ConsoleApplication77.MyStruct..ctor(Int32), mdToken: 06000006)
  39. 03130588 8d45e8          lea     eax,[ebp-18h]
  40. 0313058b 83ec08          sub     esp,8
  41. 0313058e f30f7e00        movq    xmm0,mmword ptr [eax]
  42. 03130592 660fd60424      movq    mmword ptr [esp],xmm0
  43. 03130597 8b4dc4          mov     ecx,dword ptr [ebp-3Ch]
  44. 0313059a ff15b84ded02    call    dword ptr ds:[2ED4DB8h] (ConsoleApplication77.TestClass.set_MyStruct(ConsoleApplication77.MyStruct), mdToken: 0600000a)
  45. 031305a0 90              nop
  46.  
  47. Console.WriteLine(MyStruct.Value);
  48. 031305a1 8d55e0          lea     edx,[ebp-20h]
  49. 031305a4 8b4dc4          mov     ecx,dword ptr [ebp-3Ch]
  50. 031305a7 ff15ac4ded02    call    dword ptr ds:[2ED4DACh] (ConsoleApplication77.TestClass.get_MyStruct(), mdToken: 06000009)
  51. 031305ad 8d7df0          lea     edi,[ebp-10h]
  52. 031305b0 8d75e0          lea     esi,[ebp-20h]
  53. 031305b3 f30f7e06        movq    xmm0,mmword ptr [esi]
  54. 031305b7 660fd607        movq    mmword ptr [edi],xmm0
  55. 031305bb 8d4df0          lea     ecx,[ebp-10h]
  56. 031305be ff15004eed02    call    dword ptr ds:[2ED4E00h] (ConsoleApplication77.MyStruct.get_Value(), mdToken: 06000001)
  57. 031305c4 8945dc          mov     dword ptr [ebp-24h],eax
  58. 031305c7 8b4ddc          mov     ecx,dword ptr [ebp-24h]
  59. 031305ca e85de2606f      call    mscorlib_ni+0xb4e82c (7273e82c) (System.Console.WriteLine(Int32), mdToken: 06000b5e)
  60. 031305cf 90              nop
  61.  
  62. MyStruct.SetValue(0xDEAD);
  63. 031305d0 8d55d4          lea     edx,[ebp-2Ch] //кладём в edx указатель на место в стэке куда хотим получить ответ
  64. 031305d3 8b4dc4          mov     ecx,dword ptr [ebp-3Ch] //кладём this в ecx
  65. 031305d6 ff15ac4ded02    call    dword ptr ds:[2ED4DACh] (ConsoleApplication77.TestClass.get_MyStruct(), mdToken: 06000009)
  66. //к этому моменту мы уже потеряли инфу о том, откуда взяли значения для MyStruct. Дальше мы работаем только с локальным стэком
  67. 031305dc 8d7df0          lea     edi,[ebp-10h] //сохраняем в edi указатель на место в стэке куда скопируем значение MyStruct
  68. 031305df 8d75d4          lea     esi,[ebp-2Ch]  //теперь в esi указатель на ответ в текущем стэкфрейме
  69. 031305e2 f30f7e06        movq    xmm0,mmword ptr [esi]  //копируем всю MyStruct в xmm0
  70. 031305e6 660fd607        movq    mmword ptr [edi],xmm0  //копируем всю MyStruct туда, куда указывает edi
  71. 031305ea 8d4df0          lea     ecx,[ebp-10h]          //Записываем в ecx ссылку в текущем стэкфрейме на MyStruct. Это будет this для MyStruct.SetValue.
  72. 031305ed baadde0000      mov     edx,0DEADh //записыва в edx на что хотим изменить
  73. 031305f2 ff15304eed02    call    dword ptr ds:[2ED4E30h] (ConsoleApplication77.MyStruct.SetValue(Int32), mdToken: 06000005)
  74. 031305f8 90              nop
  75.  
  76. Console.WriteLine(MyStruct.Value);
  77. 031305f9 8d55cc          lea     edx,[ebp-34h]
  78. 031305fc 8b4dc4          mov     ecx,dword ptr [ebp-3Ch]
  79. 031305ff ff15ac4ded02    call    dword ptr ds:[2ED4DACh] (ConsoleApplication77.TestClass.get_MyStruct(), mdToken: 06000009)
  80. 03130605 8d7df0          lea     edi,[ebp-10h]
  81. 03130608 8d75cc          lea     esi,[ebp-34h]         
  82. 0313060b f30f7e06        movq    xmm0,mmword ptr [esi]
  83. 0313060f 660fd607        movq    mmword ptr [edi],xmm0
  84. 03130613 8d4df0          lea     ecx,[ebp-10h]
  85. 03130616 ff15004eed02    call    dword ptr ds:[2ED4E00h] (ConsoleApplication77.MyStruct.get_Value(), mdToken: 06000001)
  86. 0313061c 8945c8          mov     dword ptr [ebp-38h],eax
  87. 0313061f 8b4dc8          mov     ecx,dword ptr [ebp-38h]
  88. 03130622 e805e2606f      call    mscorlib_ni+0xb4e82c (7273e82c) (System.Console.WriteLine(Int32), mdToken: 06000b5e)
  89. 03130627 90              nop
  90.  
  91. }
  92. 03130628 90              nop
  93. 03130629 8d65f8          lea     esp,[ebp-8]
  94. 0313062c 5e              pop     esi
  95. 0313062d 5f              pop     edi
  96. 0313062e 5d              pop     ebp
  97. 0313062f c3              ret
  98.  
  99.  
  100. ConsoleApplication77.TestClass.get_MyStruct()
  101. 03130740 55              push    ebp
  102. 03130741 8bec            mov     ebp,esp
  103. 03130743 57              push    edi
  104. 03130744 56              push    esi
  105. 03130745 83ec08          sub     esp,8
  106. 03130748 894df4          mov     dword ptr [ebp-0Ch],ecx    //кладём this в "локальную переменную" ebp-0C
  107. 0313074b 8955f0          mov     dword ptr [ebp-10h],edx    //кладём указатель куда вернуть ответ в "локальную переменную" ebp-10
  108. 0313074e 833dc042ed0200  cmp     dword ptr ds:[2ED42C0h],0  //какие-то .net проверки
  109. 03130755 7405            je      0313075c
  110. 03130757 e8742f6970      call    clr!JIT_DbgIsJustMyCode (737c36d0)
  111. 0313075c 8b7df0          mov     edi,dword ptr [ebp-10h]    //теперь в edi указатель на ответ
  112. 0313075f 8b75f4          mov     esi,dword ptr [ebp-0Ch]    //в esi указатель на this
  113. 03130762 83c604          add     esi,4                      //увеличиваем указатель на this на 4, чтобы получить указатель на бэкинфилд MyStruсt (смотри дамп классов выше)
  114. 03130765 f30f7e06        movq    xmm0,mmword ptr [esi]      //копируем сразу 64 бита из того на что указывает esi. Т.е. сразу копируем два инта - как раз всю структуру MyStruct. Не ссылку на неё копируем, а всю её копируем.
  115. 03130769 660fd607        movq    mmword ptr [edi],xmm0      //кладём это в ответ
  116. 0313076d 8d65f8          lea     esp,[ebp-8]
  117. 03130770 5e              pop     esi
  118. 03130771 5f              pop     edi
  119. 03130772 5d              pop     ebp
  120. 03130773 c3              ret
  121.  
  122.  
  123. ConsoleApplication77.MyStruct.SetValue(Int32)
  124. Begin 031307b8, size 2c
  125.  
  126. public void MyStruct.SetValue(int newValue) {
  127. 031307b8 55              push    ebp
  128. 031307b9 8bec            mov     ebp,esp
  129. 031307bb 83ec08          sub     esp,8
  130. 031307be 894df8          mov     dword ptr [ebp-8],ecx //this
  131. 031307c1 8955fc          mov     dword ptr [ebp-4],edx //newValue
  132. 031307c4 833dc042ed0200  cmp     dword ptr ds:[2ED42C0h],0
  133. 031307cb 7405            je      031307d2
  134. 031307cd e8fe2e6970      call    clr!JIT_DbgIsJustMyCode (737c36d0)
  135. 031307d2 90              nop
  136.  
  137. Value = newValue;
  138. 031307d3 8b4df8          mov     ecx,dword ptr [ebp-8] //this
  139. 031307d6 8b55fc          mov     edx,dword ptr [ebp-4] //newValue
  140. 031307d9 e8b2feffff      call    03130690 (ConsoleApplication77.MyStruct.set_Value(Int32), mdToken: 06000002)
  141. 031307de 90              nop
  142.  
  143. }
  144. 031307df 90              nop
  145. 031307e0 8be5            mov     esp,ebp
  146. 031307e2 5d              pop     ebp
  147. 031307e3 c3              ret
  148.  
  149. ConsoleApplication77.MyStruct.set_Value(Int32)
  150. 03130690 55              push    ebp
  151. 03130691 8bec            mov     ebp,esp
  152. 03130693 83ec08          sub     esp,8
  153. 03130696 894df8          mov     dword ptr [ebp-8],ecx //this
  154. 03130699 8955fc          mov     dword ptr [ebp-4],edx //value
  155. 0313069c 833dc042ed0200  cmp     dword ptr ds:[2ED42C0h],0
  156. 031306a3 7405            je      031306aa
  157. 031306a5 e826306970      call    clr!JIT_DbgIsJustMyCode (737c36d0)
  158. 031306aa 8b45f8          mov     eax,dword ptr [ebp-8] //this
  159. 031306ad 8b55fc          mov     edx,dword ptr [ebp-4] //value
  160. 031306b0 8910            mov     dword ptr [eax],edx //this.value = value
  161. 031306b2 90              nop
  162. 031306b3 8be5            mov     esp,ebp
  163. 031306b5 5d              pop     ebp
  164. 031306b6 c3              ret
  165.  
  166. Для сравнения:
  167. ConsoleApplication77.MyStruct.set_OtherValue(Int32)
  168. 031306c8 55              push    ebp
  169. 031306c9 8bec            mov     ebp,esp
  170. 031306cb 83ec08          sub     esp,8
  171. 031306ce 894df8          mov     dword ptr [ebp-8],ecx //this
  172. 031306d1 8955fc          mov     dword ptr [ebp-4],edx  //value
  173. 031306d4 833dc042ed0200  cmp     dword ptr ds:[2ED42C0h],0
  174. 031306db 7405            je      031306e2
  175. 031306dd e8ee2f6970      call    clr!JIT_DbgIsJustMyCode (737c36d0)
  176. 031306e2 8b45f8          mov     eax,dword ptr [ebp-8] //this
  177. 031306e5 8b55fc          mov     edx,dword ptr [ebp-4] //value
  178. 031306e8 895004          mov     dword ptr [eax+4],edx //this.otherValue = value
  179. 031306eb 90              nop
  180. 031306ec 8be5            mov     esp,ebp
  181. 031306ee 5d              pop     ebp
  182. 031306ef c3              ret
Add Comment
Please, Sign In to add comment