Суть примерно в следующем.. есть некая программа, которая отправляет данные на сервер. Раньше я хукал send и делал простенький шифр с помощью XOR, подгружая свою DLL, но ввиду некоторых ньюансов этого теперь делать нельзя. итак, есть функция вытащенная из ИДА Код (Text): char __fastcall sub_ОТПРАВКА(int a1) { int v1; // edi@1 int v2; // eax@3 signed int v3; // eax@5 int v4; // eax@7 SOCKET v6; // eax@3 struct timeval timeout; // [sp+110h] [bp-8h]@3 fd_set writefds; // [sp+Ch] [bp-10Ch]@3 v1 = a1; if ( *(_DWORD *)(a1 + 28) < timeGetTime() ) { while ( sub_422DA0(v1 + 32) ) { v6 = *(_DWORD *)(v1 + 4); timeout.tv_sec = 0; timeout.tv_usec = 0; writefds.fd_array[0] = v6; writefds.fd_count = 1; v2 = select(0, 0, &writefds, 0, &timeout); if ( v2 != -1 ) { if ( v2 <= 0 ) return 1; v3 = dword_73C63C( *(_DWORD *)(v1 + 4), *(_DWORD *)(v1 + 32) + *(_DWORD *)(v1 + 36), *(_DWORD *)(v1 + 40) - *(_DWORD *)(v1 + 36), 0); if ( v3 == -1 ) { //ошибка -> выходим } else { //все ок } } } } return 1; } интересует правильно ли я все понял 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): for(int i=0;i<{Длина массива данных};i++) { {массив данных}[i] ^= 5; {массив данных}[i] += 2; } в ИДА, функция которую мне надо изменить выглядит так: Код (Text): .text:00418C30 ROSEND proc near ; CODE XREF: sub_418910+45p .text:00418C30 ; sub_418970+42p ... .text:00418C30 .text:00418C30 writefds = fd_set ptr -10Ch .text:00418C30 timeout = timeval ptr -8 .text:00418C30 .text:00418C30 push ebp .text:00418C31 mov ebp, esp .text:00418C33 sub esp, 10Ch .text:00418C39 push ebx .text:00418C3A push esi .text:00418C3B push edi .text:00418C3C mov edi, ecx .text:00418C3E call ds:timeGetTime .text:00418C44 cmp [edi+1Ch], eax .text:00418C47 jnb loc_418CE2 .text:00418C4D lea esi, [edi+20h] .text:00418C50 xor ebx, ebx .text:00418C52 .text:00418C52 loc_418C52: ; CODE XREF: ROSEND+ACj .text:00418C52 mov ecx, esi .text:00418C54 call sub_422DA0 .text:00418C59 test eax, eax .text:00418C5B jz loc_418CE2 .text:00418C61 mov eax, [edi+4] .text:00418C64 lea ecx, [ebp+timeout] .text:00418C67 push ecx ; timeout .text:00418C68 lea edx, [ebp+writefds] .text:00418C6E push ebx ; exceptfds .text:00418C6F push edx ; writefds .text:00418C70 push ebx ; readfds .text:00418C71 push ebx ; nfds .text:00418C72 mov [ebp+timeout.tv_sec], ebx .text:00418C75 mov [ebp+timeout.tv_usec], ebx .text:00418C78 mov [ebp+writefds.fd_array], eax .text:00418C7E mov [ebp+writefds.fd_count], 1 .text:00418C88 call select .text:00418C8D cmp eax, 0FFFFFFFFh .text:00418C90 jz short loc_418CD3 .text:00418C92 cmp eax, ebx .text:00418C94 jle short loc_418CE2 .text:00418C96 mov eax, [esi+8] .text:00418C99 mov edx, [esi+4] .text:00418C9C sub eax, edx .text:00418C9E push ebx ; _DWORD .text:00418C9F push eax ; _DWORD .text:00418CA0 mov eax, [esi] .text:00418CA2 mov ecx, edx .text:00418CA4 mov edx, [edi+4] .text:00418CA7 add ecx, eax вот тут я планирую вставить АСМ код... .text:00418CA9 push ecx ; _DWORD .text:00418CAA push edx ; _DWORD .text:00418CAB call dword_73C63C .text:00418CB1 cmp eax, 0FFFFFFFFh .text:00418CB4 jz short loc_418CC0 .text:00418CB6 push eax .text:00418CB7 mov ecx, esi .text:00418CB9 call sub_422FF0 .text:00418CBE jmp short loc_418CD3 .text:00418CC0 ; --------------------------------------------------------------------------- .text:00418CC0 .text:00418CC0 loc_418CC0: ; CODE XREF: ROSEND+84j .text:00418CC0 call WSAGetLastError .text:00418CC5 cmp eax, 2733h .text:00418CCA jz short loc_418CD3 .text:00418CCC cmp eax, 2749h .text:00418CD1 jnz short loc_418CEB .text:00418CD3 .text:00418CD3 loc_418CD3: ; CODE XREF: ROSEND+60j .text:00418CD3 ; ROSEND+8Ej ... .text:00418CD3 call ds:timeGetTime .text:00418CD9 cmp [edi+1Ch], eax .text:00418CDC jb loc_418C52 .text:00418CE2 .text:00418CE2 loc_418CE2: ; CODE XREF: ROSEND+17j .text:00418CE2 ; ROSEND+2Bj ... .text:00418CE2 pop edi .text:00418CE3 pop esi .text:00418CE4 mov al, 1 .text:00418CE6 pop ebx .text:00418CE7 mov esp, ebp .text:00418CE9 pop ebp .text:00418CEA retn .text:00418CEB ; --------------------------------------------------------------------------- .text:00418CEB .text:00418CEB loc_418CEB: ; CODE XREF: ROSEND+A1j .text:00418CEB mov eax, [edi+4] .text:00418CEE cmp eax, 0FFFFFFFFh .text:00418CF1 jz short loc_418D19 .text:00418CF3 push eax ; s .text:00418CF4 call closesocket .text:00418CF9 push 0A000h .text:00418CFE mov ecx, esi .text:00418D00 mov dword ptr [edi+4], 0FFFFFFFFh .text:00418D07 call sub_422DB0 .text:00418D0C push 0A000h .text:00418D11 lea ecx, [edi+58h] .text:00418D14 call sub_422DB0 .text:00418D19 .text:00418D19 loc_418D19: ; CODE XREF: ROSEND+C1j .text:00418D19 pop edi .text:00418D1A pop esi .text:00418D1B xor al, al .text:00418D1D pop ebx .text:00418D1E mov esp, ebp .text:00418D20 pop ebp .text:00418D21 retn .text:00418D21 ROSEND endp Может ли кто помочь с этими двумя проблемками? АСМ увы не знаю... Заранее спасибо за помощь)
тогда можно составить Вашу "горячую" подборку ответов на все вопросы. И на самом деле, более чем тупо прошу транслировать те 5 строчек на асм. И точно так же тупо прошу объяснить почему именно так, а не иначе... ибо где-то в гугле вычитал, что счетчик в цикле только до 255 идет.. и для написания чего-то больше мне надо узнать как это делается p.s. не знаете\не умеете\не хотите(а как замечаю, такое говорят те, кто именно не знает ), то отписываться здесь - вовсе не обязательно p.p.s. И сколько стоит переделка тех 5 строчек с СИ на АСМ?)
Код (Text): mov edi,pointer_to_data mov ecx,number_of_dwords @@: xor dword ptr [edi],crypt_key scasd loop @B Если ксорить будешь двордами. Если байтами или вордами, то код надо малость подправить.
спасибо 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 ноо.. не заработало.. либо подвисает намертво... либо ошибка в программе, либо данные в разнобой
правильно чуешь - будешь через байт и притом криво перепрыгивать. Ты уж сразу тогда сам ECX увеличивай и не прибавляй к нему никакие другие регистры например? я могу хоть алгоритм base64 тебе запостить ааще не понял, че ты хочешь
нужен пример того, как по байтово пробежаться по некоему массиву(byte ptr ds:[ecx]) и вовремя остановится Вовремя это тогда, когда мы получаем значение из EAX.. я так понимаю оно вида DWORD. воть.. а как мне его вернуть на место потом? регистров как-то маловато (( можно ли сделать sub ecx, dword ptr ds:[eax] ? типа вычесть длину.
приходится под олей ковыряться.. а бряк не поставить.. точнее ставишь, но тогда моментальный вылет.. понятия не имею почему ( попробовал сделать с dword CMP EBX,DWORD PTR DS:[EAX] тут я подразумеваю, что сравниваем EBX (допустим он 56) и значение в DWORD PTR DS:[EAX] оно по идее должно быть равно 55... но программа вылетает, ибо ebx становится >>> чем 55. запутался окончательно ))
блин...как же все просто оказывается было )) вроде даже заработало... на удивление быстро и круто... но это только на вскидку.. утречком надо допроверить все
Чтобы восстановить обратно регистр, используй push/pop. И вообще, имхо, это дурацкий тон использовать регистры не по назначению. edi/esi - указатели, ecx - счетчик, остальное - для данных. Когда привыкнешь к такому, имхо потом будет проще писать программы.
вот честно, я как задал вопрос... знал про асм только про команду mov.. что такое регистр, про величину и прочее - узнал в процессе решения поставленной задачи Задача была написать небольшую функцию(которая уже расширилась ууух) ну и все... после этого я забуду это как страшный сон )) К тому же очень трудно использовать учебники... в учебниках написано используйте loop, а в Оле как-то не используется.. приходится самому через cmp и jl. Ну для новичка трудновато скажем так насчет того, что ecx - это счетчик.. это не я делал.. все регистры уже заняты были... они хранят в себе данные для функции. Я же не с нуля программу пишу, а видоизменяю уже откомпилированную Но во всяком случае спасибо ) Натолкнул на мысль))
тебе в любом случае я рекомендую писать так: Код (Text): pushad твой_мега_секретный_кодес popad И в своем коде меняй регистры как только хочешь - никто тебе даже слова не скажет