Помогите разобраться с кодом

Тема в разделе "WASM.ASSEMBLER", создана пользователем garfik, 23 июл 2009.

  1. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    Суть примерно в следующем.. есть некая программа, которая отправляет данные на сервер.

    Раньше я хукал send и делал простенький шифр с помощью XOR, подгружая свою DLL, но ввиду некоторых ньюансов этого теперь делать нельзя.

    итак, есть функция вытащенная из ИДА

    Код (Text):
    1. char __fastcall sub_ОТПРАВКА(int a1)
    2. {
    3.   int v1; // edi@1
    4.   int v2; // eax@3
    5.   signed int v3; // eax@5
    6.   int v4; // eax@7
    7.   SOCKET v6; // eax@3
    8.   struct timeval timeout; // [sp+110h] [bp-8h]@3
    9.   fd_set writefds; // [sp+Ch] [bp-10Ch]@3
    10.  
    11.   v1 = a1;
    12.   if ( *(_DWORD *)(a1 + 28) < timeGetTime() )
    13.   {
    14.     while ( sub_422DA0(v1 + 32) )
    15.     {
    16.       v6 = *(_DWORD *)(v1 + 4);
    17.       timeout.tv_sec = 0;
    18.       timeout.tv_usec = 0;
    19.       writefds.fd_array[0] = v6;
    20.       writefds.fd_count = 1;
    21.       v2 = select(0, 0, &writefds, 0, &timeout);
    22.       if ( v2 != -1 )
    23.       {
    24.         if ( v2 <= 0 )
    25.           return 1;
    26.  
    27.  
    28.         v3 = dword_73C63C(
    29.                *(_DWORD *)(v1 + 4),
    30.                *(_DWORD *)(v1 + 32) + *(_DWORD *)(v1 + 36),
    31.                *(_DWORD *)(v1 + 40) - *(_DWORD *)(v1 + 36),
    32.                0);
    33.  
    34.  
    35.         if ( v3 == -1 )
    36.         {
    37. //ошибка -> выходим
    38.         }
    39.         else
    40.         {
    41. //все ок
    42.         }
    43.       }
    44.     }
    45.   }
    46.   return 1;
    47. }
    интересует правильно ли я все понял

    v3 = dword_73C63C( - dword_73C63C указатель на функцию send от WinSock.. это 100% :)
    *(_DWORD *)(v1 + 4), - сокет. тоже 100%
    *(_DWORD *)(v1 + 32) + *(_DWORD *)(v1 + 36), - указатель на массив данных?
    *(_DWORD *)(v1 + 40) - *(_DWORD *)(v1 + 36), - длина этих данных? или указатель на длину этих данных?
    0);

    И вторая проблема... Мне необходимо написать некий АСМ код, который можно было бы выполнить перед вызовом dword_73C63C.

    На си этот код выглядит примерно так:

    Код (Text):
    1. for(int i=0;i<{Длина массива данных};i++)
    2. {
    3.     {массив данных}[i] ^= 5;
    4.     {массив данных}[i] += 2;
    5. }
    в ИДА, функция которую мне надо изменить выглядит так:

    Код (Text):
    1. .text:00418C30 ROSEND          proc near               ; CODE XREF: sub_418910+45p
    2. .text:00418C30                                         ; sub_418970+42p ...
    3. .text:00418C30
    4. .text:00418C30 writefds        = fd_set ptr -10Ch
    5. .text:00418C30 timeout         = timeval ptr -8
    6. .text:00418C30
    7. .text:00418C30                 push    ebp
    8. .text:00418C31                 mov     ebp, esp
    9. .text:00418C33                 sub     esp, 10Ch
    10. .text:00418C39                 push    ebx
    11. .text:00418C3A                 push    esi
    12. .text:00418C3B                 push    edi
    13. .text:00418C3C                 mov     edi, ecx
    14. .text:00418C3E                 call    ds:timeGetTime
    15. .text:00418C44                 cmp     [edi+1Ch], eax
    16. .text:00418C47                 jnb     loc_418CE2
    17. .text:00418C4D                 lea     esi, [edi+20h]
    18. .text:00418C50                 xor     ebx, ebx
    19. .text:00418C52
    20. .text:00418C52 loc_418C52:                             ; CODE XREF: ROSEND+ACj
    21. .text:00418C52                 mov     ecx, esi
    22. .text:00418C54                 call    sub_422DA0
    23. .text:00418C59                 test    eax, eax
    24. .text:00418C5B                 jz      loc_418CE2
    25. .text:00418C61                 mov     eax, [edi+4]
    26. .text:00418C64                 lea     ecx, [ebp+timeout]
    27. .text:00418C67                 push    ecx             ; timeout
    28. .text:00418C68                 lea     edx, [ebp+writefds]
    29. .text:00418C6E                 push    ebx             ; exceptfds
    30. .text:00418C6F                 push    edx             ; writefds
    31. .text:00418C70                 push    ebx             ; readfds
    32. .text:00418C71                 push    ebx             ; nfds
    33. .text:00418C72                 mov     [ebp+timeout.tv_sec], ebx
    34. .text:00418C75                 mov     [ebp+timeout.tv_usec], ebx
    35. .text:00418C78                 mov     [ebp+writefds.fd_array], eax
    36. .text:00418C7E                 mov     [ebp+writefds.fd_count], 1
    37. .text:00418C88                 call    select
    38. .text:00418C8D                 cmp     eax, 0FFFFFFFFh
    39. .text:00418C90                 jz      short loc_418CD3
    40. .text:00418C92                 cmp     eax, ebx
    41. .text:00418C94                 jle     short loc_418CE2
    42. .text:00418C96                 mov     eax, [esi+8]
    43. .text:00418C99                 mov     edx, [esi+4]
    44. .text:00418C9C                 sub     eax, edx
    45. .text:00418C9E                 push    ebx             ; _DWORD
    46. .text:00418C9F                 push    eax             ; _DWORD
    47. .text:00418CA0                 mov     eax, [esi]
    48. .text:00418CA2                 mov     ecx, edx
    49. .text:00418CA4                 mov     edx, [edi+4]
    50. .text:00418CA7                 add     ecx, eax
    51.  
    52. вот тут я планирую вставить АСМ код...
    53.  
    54. .text:00418CA9                 push    ecx             ; _DWORD
    55. .text:00418CAA                 push    edx             ; _DWORD
    56. .text:00418CAB                 call    dword_73C63C
    57.  
    58. .text:00418CB1                 cmp     eax, 0FFFFFFFFh
    59. .text:00418CB4                 jz      short loc_418CC0
    60. .text:00418CB6                 push    eax
    61. .text:00418CB7                 mov     ecx, esi
    62. .text:00418CB9                 call    sub_422FF0
    63. .text:00418CBE                 jmp     short loc_418CD3
    64. .text:00418CC0 ; ---------------------------------------------------------------------------
    65. .text:00418CC0
    66. .text:00418CC0 loc_418CC0:                             ; CODE XREF: ROSEND+84j
    67. .text:00418CC0                 call    WSAGetLastError
    68. .text:00418CC5                 cmp     eax, 2733h
    69. .text:00418CCA                 jz      short loc_418CD3
    70. .text:00418CCC                 cmp     eax, 2749h
    71. .text:00418CD1                 jnz     short loc_418CEB
    72. .text:00418CD3
    73. .text:00418CD3 loc_418CD3:                             ; CODE XREF: ROSEND+60j
    74. .text:00418CD3                                         ; ROSEND+8Ej ...
    75. .text:00418CD3                 call    ds:timeGetTime
    76. .text:00418CD9                 cmp     [edi+1Ch], eax
    77. .text:00418CDC                 jb      loc_418C52
    78. .text:00418CE2
    79. .text:00418CE2 loc_418CE2:                             ; CODE XREF: ROSEND+17j
    80. .text:00418CE2                                         ; ROSEND+2Bj ...
    81. .text:00418CE2                 pop     edi
    82. .text:00418CE3                 pop     esi
    83. .text:00418CE4                 mov     al, 1
    84. .text:00418CE6                 pop     ebx
    85. .text:00418CE7                 mov     esp, ebp
    86. .text:00418CE9                 pop     ebp
    87. .text:00418CEA                 retn
    88. .text:00418CEB ; ---------------------------------------------------------------------------
    89. .text:00418CEB
    90. .text:00418CEB loc_418CEB:                             ; CODE XREF: ROSEND+A1j
    91. .text:00418CEB                 mov     eax, [edi+4]
    92. .text:00418CEE                 cmp     eax, 0FFFFFFFFh
    93. .text:00418CF1                 jz      short loc_418D19
    94. .text:00418CF3                 push    eax             ; s
    95. .text:00418CF4                 call    closesocket
    96. .text:00418CF9                 push    0A000h
    97. .text:00418CFE                 mov     ecx, esi
    98. .text:00418D00                 mov     dword ptr [edi+4], 0FFFFFFFFh
    99. .text:00418D07                 call    sub_422DB0
    100. .text:00418D0C                 push    0A000h
    101. .text:00418D11                 lea     ecx, [edi+58h]
    102. .text:00418D14                 call    sub_422DB0
    103. .text:00418D19
    104. .text:00418D19 loc_418D19:                             ; CODE XREF: ROSEND+C1j
    105. .text:00418D19                 pop     edi
    106. .text:00418D1A                 pop     esi
    107. .text:00418D1B                 xor     al, al
    108. .text:00418D1D                 pop     ebx
    109. .text:00418D1E                 mov     esp, ebp
    110. .text:00418D20                 pop     ebp
    111. .text:00418D21                 retn
    112. .text:00418D21 ROSEND          endp
    Может ли кто помочь с этими двумя проблемками?

    АСМ увы не знаю... Заранее спасибо за помощь)
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    в коммерц
     
  3. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    в комерц из-за написания цикла на асме и некотором разъяснении моментов?) О_ооо... что-то новое)
     
  4. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    да, так как по сути ты тупо просишь написать за тебя код
     
  5. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    тогда можно составить Вашу "горячую" подборку ответов на все вопросы.
    И на самом деле, более чем тупо прошу транслировать те 5 строчек на асм. И точно так же тупо прошу объяснить почему именно так, а не иначе... ибо где-то в гугле вычитал, что счетчик в цикле только до 255 идет..

    и для написания чего-то больше мне надо узнать как это делается :)


    p.s. не знаете\не умеете\не хотите(а как замечаю, такое говорят те, кто именно не знает :) ), то отписываться здесь - вовсе не обязательно :)
    p.p.s. И сколько стоит переделка тех 5 строчек с СИ на АСМ?)
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Многие Си компиляторы умеют генерить асм-листинг.
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Код (Text):
    1. mov edi,pointer_to_data
    2. mov ecx,number_of_dwords
    3. @@:
    4. xor dword ptr [edi],crypt_key
    5. scasd
    6. loop @B
    Если ксорить будешь двордами. Если байтами или вордами, то код надо малость подправить.
     
  8. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    спасибо MSoft, натолкнул на мыслю))

    Сделал прыжок куда подальше, там попытался заксорить.. однако для наглядности решил просто добавить 1 к байту.

    Вот тут возникли проблемы...
    в ecx хранится указатель на дату
    в eax в идеале - кол-во байт на отправку.. ну то есть размер этих данных.

    попробовал сделать что-то такое:
    XOR EBX,EBX
    006585CF: ADD DWORD PTR DS:[ECX+EBX],1010101
    ADD EBX,4
    CMP EBX,0C - первые 12 байт
    JL SHORT 006585CF

    ну и тд

    чувствую я, что это не правильный подход.. плюс ко всему, не знаю как изменить строчку cmp ebx,0c ... а точнее как её правильно привести к виду cmp ebx, значение из EAX(оно ровно 55 в десятеричной си).

    Не подскажите как?

    Могли бы кинуть еще примерчик работы с байтами?

    я пытался сделать так

    xor cl,cl
    006585CF: mov dl, byte ptr ds:[ecx+cl] <-- вот чую я что нельзя делать ecx+cl...
    add dl,1
    mov byte ptr ds:[ecx+cl],dl
    add cl,1
    cmp cl,5
    jl 006585CF

    ноо.. не заработало.. либо подвисает намертво... либо ошибка в программе, либо данные в разнобой :)
     
  9. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    правильно чуешь - будешь через байт и притом криво перепрыгивать. Ты уж сразу тогда сам ECX увеличивай и не прибавляй к нему никакие другие регистры

    например? я могу хоть алгоритм base64 тебе запостить :)

    ааще не понял, че ты хочешь :)
     
  10. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    нужен пример того, как по байтово пробежаться по некоему массиву(byte ptr ds:[ecx]) и вовремя остановится :) Вовремя это тогда, когда мы получаем значение из EAX.. я так понимаю оно вида DWORD.

    воть.. :)

    а как мне его вернуть на место потом?
    регистров как-то маловато :dntknw:((
    можно ли сделать sub ecx, dword ptr ds:[eax] ? типа вычесть длину.
     
  11. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    возьми компилятор и проверь =) под отладчиком погоняй, понаблюдай
     
  12. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    приходится под олей ковыряться.. а бряк не поставить.. точнее ставишь, но тогда моментальный вылет.. понятия не имею почему :dntknw:(

    попробовал сделать с dword

    CMP EBX,DWORD PTR DS:[EAX] тут я подразумеваю, что сравниваем EBX (допустим он 56) и значение в DWORD PTR DS:[EAX] оно по идее должно быть равно 55... но программа вылетает, ибо ebx становится >>> чем 55.

    запутался окончательно :)))
     
  13. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    блин...как же все просто оказывается было :)))

    вроде даже заработало... на удивление быстро и круто... но это только на вскидку.. утречком надо допроверить все :)
     
  14. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Чтобы восстановить обратно регистр, используй push/pop. И вообще, имхо, это дурацкий тон использовать регистры не по назначению. edi/esi - указатели, ecx - счетчик, остальное - для данных. Когда привыкнешь к такому, имхо потом будет проще писать программы.
     
  15. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    вот честно, я как задал вопрос... знал про асм только про команду mov.. что такое регистр, про величину и прочее - узнал в процессе решения поставленной задачи :)

    Задача была написать небольшую функцию(которая уже расширилась ууух) ну и все... после этого я забуду это как страшный сон :))) К тому же очень трудно использовать учебники... в учебниках написано используйте loop, а в Оле как-то не используется.. приходится самому через cmp и jl. Ну для новичка трудновато скажем так :)

    насчет того, что ecx - это счетчик.. это не я делал.. все регистры уже заняты были... они хранят в себе данные для функции. Я же не с нуля программу пишу, а видоизменяю уже откомпилированную


    Но во всяком случае спасибо :)) Натолкнул на мысль))
     
  16. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    тебе в любом случае я рекомендую писать так:
    Код (Text):
    1. pushad
    2. твой_мега_секретный_кодес
    3. popad
    И в своем коде меняй регистры как только хочешь - никто тебе даже слова не скажет :)
     
  17. garfik

    garfik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2009
    Сообщения:
    11
    хм... не знал :))

    Спасибо :)