Сейчас на форуме: _MBK_, asfa (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Помогите восстановить код
Посл.ответ Сообщение

Ранг: 4.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 апреля 2009 01:19
· Личное сообщение · #1

Доброго времени суток.
Значит такая ситуация: я распаковал длл, вытянул из нее нужную мне функцию, частично восстановил ее с помощью HEX-Rays.
Но проблема в том, что я дальше не могу разобраться как эта функция работает (((
Предыдущую версию этой длл я нормально распаковал и восстановил, а эту не олучается ((
Помогите пожалуйста.

Вот код функции, который выдал HEX-Rays:
Code:
  1. int __stdcall sub_69841240(SOCKET a1, int a2, signed int a3, int a4)
  2. {
  3.   int v4; // ecx@1
  4.   int v5; // ebx@1
  5.   signed int v7; // edx@9
  6.   int v8; // ebx@12
  7.   signed int v9; // eax@16
  8.   char (*v10)[13]; // ebx@16
  9.   char v11; // al@17
  10.   signed int v12; // esi@17
  11.   char v13; // zf@18
  12.   char v14; // sf@18
  13.   unsigned __int8 v15; // of@18
  14.   signed int v16; // edx@18
  15.   int v17; // ecx@18
  16.   char v18; // zf@21
  17.   char v19; // sf@21
  18.   unsigned __int8 v20; // of@21
  19.   signed int v21; // eax@21
  20.   int v22; // ebx@21
  21.   char v23; // zf@24
  22.   char v24; // sf@24
  23.   unsigned __int8 v25; // of@24
  24.   signed int v26; // ecx@24
  25.   int v27; // eax@12
  26.   int v28; // ebx@17
  27.   unsigned int v29; // eax@31
  28.   signed int v30; // [sp+2Ch] [bp-1002Ch]@1
  29.   char v31; // [sp+30h] [bp-10028h]@1
  30.   char v32; // [sp+34h] [bp-10024h]@2
  31.   char v33; // [sp+35h] [bp-10023h]@4
  32.   char v34; // [sp+36h] [bp-10022h]@5
  33.   char v35; // [sp+37h] [bp-10021h]@6
  34.   signed int v36[16390]; // [sp+40h] [bp-10018h]@9
  35.   char v37; // [sp+45h] [bp-10013h]@9
  36.   signed __int64 v38; // [sp+18h] [bp-10040h]@12
  37.   int v39; // [sp+20h] [bp-10038h]@12
  38.   char (*v40)[13]; // [sp+28h] [bp-10030h]@17
  39.   int v41; // [sp+24h] [bp-10034h]@17
  40.   char v42; // [sp+44h] [bp-10014h]@18
  41.   v5 = a2;
  42.   v30 = 16;
  43.   if ( !getpeername(a1, (struct sockaddr *)&v31, &v30) && (v32 != -39 || v33 != 20 || v34 != -81 || v35 != 11) )
  44.     return off_6984301C(v4, a4, a1, v5, a3, a4);
  45.   if ( dword_69843014 + 1 > 200 )
  46.     dword_69843014 = 1;
  47.   else
  48.     ++dword_69843014;
  49.   v7 = 0;
  50.   v36[0] = a3;
  51.   v37 = dword_69843014;
  52.   while ( v7 < a3 )
  53.   {
  54.     *((_BYTE *)&v36[1] + v7 + 2) = *(_BYTE *)(v7 + v5);
  55.     ++v7;
  56.   }
  57.   v27 = rand();
  58.   v38 = 1717986919i64 * v27;
  59.   v8 = v27 % 5;
  60.   v39 = v27 % 5;
  61.   if ( v27 % 5 == 2 )
  62.   {
  63.     v10 = off_69843008;
  64.     v9 = strlen(off_69843008);
  65.     goto LABEL_17;
  66.   }
  67.   if ( v8 <= 2 )
  68.   {
  69.     if ( v8 == 1 )
  70.     {
  71.       v10 = off_6984300C;
  72.       v9 = strlen(off_6984300C);
  73.       goto LABEL_17;
  74.     }
  75.   }
  76.   else
  77.   {
  78.     if ( v39 == 3 )
  79.     {
  80.       v10 = off_69843004;
  81.       v9 = strlen(off_69843004);
  82.       goto LABEL_17;
  83.     }
  84.     if ( v39 == 4 )
  85.     {
  86.       v10 = off_69843000;
  87.       v9 = strlen(off_69843000);
  88.       goto LABEL_17;
  89.     }
  90.   }
  91.   v10 = off_69843010;
  92.   v9 = strlen(off_69843010);
  93. LABEL_17:
  94.   v40 = v10;
  95.   v12 = v9;
  96.   v28 = (*v40)[rand() % v9];
  97.   v11 = byte_69845020;
  98.   v41 = (v28 + 2) ^ 0x34;
  99.   if ( !byte_69845020 )
  100.   {
  101.     v29 = time(0);
  102.     srand(v29);
  103.     v11 = rand();
  104.     byte_69845020 = v11;
  105.   }
  106.   v42 = v11;
  107.   v16 = 5;
  108.   v17 = a3 + 5;
  109.   v15 = __SETO__(a3 + 5, 5);
  110.   v13 = a3 == 0;
  111.   v14 = a3 < 0;
  112.   while ( !((unsigned __int8)(v14 ^ v15) | v13) )
  113.   {
  114.     *((_BYTE *)&v36[0] + v16 + 1) ^= *((_BYTE *)&v36[0] + v16);
  115.     ++v16;
  116.     v15 = __SETO__(v17, v16);
  117.     v13 = v17 == v16;
  118.     v14 = v17 < v16;
  119.   }
  120.   v21 = 5;
  121.   LOBYTE(v36[0]) = (_BYTE)v41 ^ (_BYTE)v36;
  122.   v22 = a3 + 6;
  123.   v20 = __SETO__(a3 + 6, 5);
  124.   v18 = a3 == -1;
  125.   v19 = a3 + 1 < 0;
  126.   while ( !((unsigned __int8)(v19 ^ v20) | v18) )
  127.   {
  128.     *((_BYTE *)&v36[0] + v21++) ^= v41;
  129.     v20 = __SETO__(v22, v21);
  130.     v18 = v22 == v21;
  131.     v19 = v22 < v21;
  132.   }
  133.   v26 = 0;
  134.   BYTE2(v36[0]) = (_BYTE)v41 ^ 0x65;
  135.   v25 = 0;
  136.   v23 = v22 == 0;
  137.   v24 = v22 < 0;
  138.   while ( !((unsigned __int8)(v24 ^ v25) | v23) )
  139.   {
  140.     *((_BYTE *)&v36[0] + v26) ^= (*v40)[v26 % v12 + 1];
  141.     ++v26;
  142.     v25 = __SETO__(v22, v26);
  143.     v23 = v22 == v26;
  144.     v24 = v22 < v26;
  145.   }
  146.   BYTE3(v36[0]) = (_BYTE)v39 ^ (unsigned __int8)((unsigned __int8)((_BYTE)v36 + 1) ^ (unsigned __int8)(v37 + 52));
  147. }





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 11 апреля 2009 13:29
· Личное сообщение · #2

Хм, думаю, сюда и библиотеку следует приаттачить. А так какой толк постить код HEX-Rays, если он - заведомо неверен (восстановлен только частично) ?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 11 апреля 2009 14:01 · Поправил: HiEndsoft
· Личное сообщение · #3

HEX-Rays - листинг + асм. листинг нужен, потому что доверия HEX-Rays пока нет.
А так код функции похож на recv или send из ws2_32. С заполнением буфера ответом:

Code:
  1.   while ( v7 < a3 ) 
  2.   { 
  3.     *((_BYTE *)&v36[1] + v7 + 2) = *(_BYTE *)(v7 + v5);
  4.     ++v7;
  5.   }
  6. где v7 -счетчик
  7. v5=a2 (указатель на буфер с ответом recv)
  8. v36 -внутренний свой буфер, над которым производится потом арифметика
  9. a3 - длина пакета recv

Возможно твоя dll сплайсит send и/или recv для какой-то шифровки трафика при связи с определенной машиной в сети, а это обработчик. На это указывает код, где "видно" IP:
Code:
  1. if ( !getpeername(a1, (struct sockaddr *)&v31, &v30) && (v32 != -39 || v33 != 20 || v34 != -81 || v35 != 11) ) 
  2.     return off_6984301C(v4, a4, a1, v5, a3, a4);

(на recv или send указывает флаг a4, который нигде в этом коде не используется, а только куда-то возвращается).
Вообще в таких ситуациях нужно хорошо знать мат.часть и делать выводы на основе предположений и опыта.

-----
продавец резиновых утёнков




Ранг: 4.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 апреля 2009 20:27
· Личное сообщение · #4

Длл здесь: rapidshare.com/files/220510844/rcp.dll.html

Эта длл инжектит себя в процесс и перехватывает все сообщения, которые посылаются в send.



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 12 апреля 2009 20:35
· Личное сообщение · #5

значит я "угадал". а что самому дальше лень? это наверно в запросы на взлом.

-----
продавец резиновых утёнков




Ранг: 4.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 апреля 2009 21:19
· Личное сообщение · #6

Ладно, забейте.
Я так понял тут никто не хочет помогать начинающим...




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 апреля 2009 21:34
· Личное сообщение · #7

Спасение утопающих-дело рук самих утопающих, не вижу тут ничего сложного и какой-то проблемы глобальной. Учебник по асму в зубы да сиди ковыряй, с чего ты взял, что твою работу за тебя должны делать другие.
Как скажешь, забито.


 eXeL@B —› Вопросы новичков —› Помогите восстановить код
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати