| Посл.ответ | 
Сообщение | 
 Ранг: 253.9 (наставник) Активность: 0.13↘0 Статус: Участник 
 
 | 
Создано: 26 июня 2006 10:18   · Личное сообщение ·  #1 
Превед, кросафчеги!   
Такая штука. Есть ассемблерный листинг процедуры. Мне нужно ее перелопатить, короче сделать другую логику работы. Для этого нужно понять, как выглядел исходный код. Проще говоря, структура IF'ов, и CALL'ов. Декомпили справляются с этой задачей плохо. А мне не нужен исходник... мне бы только понять, как там было сделано.
 Привожу листинг процедуры.
 10002870 >/$  51                    PUSH ECX
 10002871  |.  53                    PUSH EBX
 10002872  |.  8B5C24 10             MOV EBX, DWORD PTR SS:[ESP+10]
 10002876  |.  55                    PUSH EBP
 10002877  |.  56                    PUSH ESI
 10002878  |.  8BF3                  MOV ESI, EBX
 1000287A  |.  57                    PUSH EDI
 1000287B  |.  F7D6                  NOT ESI
 1000287D  |.  33ED                  XOR EBP, EBP
 1000287F  |.  53                    PUSH EBX
 10002880  |.  C1EE 0A               SHR ESI, 0A
 10002883  |.  892D 58670210         MOV DWORD PTR DS:[10026758], EBP
 10002889  |.  83E6 01               AND ESI, 1
 1000288C  |.  E8 0FFEFFFF           CALL rts.100026A0
 10002891  |.  83C4 04               ADD ESP, 4
 10002894  |.  8BF8                  MOV EDI, EAX
 10002896  |.  897C24 10             MOV DWORD PTR SS:[ESP+10], EDI
 1000289A  |.  55                    PUSH EBP
 1000289B  |.  68 00000010           PUSH rts.10000000
 100028A0  |.  53                    PUSH EBX
 100028A1  |.  E8 CA000000           CALL rts.10002970
 100028A6  |.  83C4 04               ADD ESP, 4
 100028A9  |.  50                    PUSH EAX
 100028AA  |.  8B4424 24             MOV EAX, DWORD PTR SS:[ESP+24]
 100028AE  |.  55                    PUSH EBP
 100028AF  |.  56                    PUSH ESI
 100028B0  |.  57                    PUSH EDI
 100028B1  |.  50                    PUSH EAX
 100028B2  |.  E8 A9230000           CALL rts.10004C60
 100028B7  |.  8BF8                  MOV EDI, EAX
 100028B9  |.  83C4 1C               ADD ESP, 1C
 100028BC  |.  83FF FF               CMP EDI, -1
 100028BF  |.  75 5A                 JNZ SHORT rts.1000291B
 100028C1  |.  896C24 1C             MOV DWORD PTR SS:[ESP+1C], EBP
 100028C5  |>  8B4C24 18             /MOV ECX, DWORD PTR SS:[ESP+18]
 100028C9  |.  8B5424 1C             |MOV EDX, DWORD PTR SS:[ESP+1C]
 100028CD  |.  51                    |PUSH ECX
 100028CE  |.  52                    |PUSH EDX
 100028CF  |.  E8 DCFBFFFF           |CALL rts.100024B0
 100028D4  |.  8BE8                  |MOV EBP, EAX
 100028D6  |.  83C4 08               |ADD ESP, 8
 100028D9  |.  85ED                  |TEST EBP, EBP
 100028DB  |.  74 3C                 |JE SHORT rts.10002919
 100028DD  |.  6A 00                 |PUSH 0
 100028DF  |.  68 00000010           |PUSH rts.10000000
 100028E4  |.  53                    |PUSH EBX
 100028E5  |.  E8 86000000           |CALL rts.10002970
 100028EA  |.  83C4 04               |ADD ESP, 4
 100028ED  |.  50                    |PUSH EAX
 100028EE  |.  8B4424 1C             |MOV EAX, DWORD PTR SS:[ESP+1C]
 100028F2  |.  6A 00                 |PUSH 0
 100028F4  |.  56                    |PUSH ESI
 100028F5  |.  50                    |PUSH EAX
 100028F6  |.  55                    |PUSH EBP
 100028F7  |.  E8 64230000           |CALL rts.10004C60
 100028FC  |.  8BF8                  |MOV EDI, EAX
 100028FE  |.  83C4 1C               |ADD ESP, 1C
 10002901  |.  83FF FF               |CMP EDI, -1
 10002904  |.  75 13                 |JNZ SHORT rts.10002919
 10002906  |.  E8 C5FAFFFF           |CALL rts.100023D0
 1000290B  |.  8B4424 1C             |MOV EAX, DWORD PTR SS:[ESP+1C]
 1000290F  |.  40                    |INC EAX
 10002910  |.  83F8 20               |CMP EAX, 20
 10002913  |.  894424 1C             |MOV DWORD PTR SS:[ESP+1C], EAX
 10002917  |.^ 7C AC                 \JL SHORT rts.100028C5
 10002919  |>  33ED                  XOR EBP, EBP
 1000291B  |>  392D 086A0110         CMP DWORD PTR DS:[10016A08], EBP
 10002921  |.  75 0A                 JNZ SHORT rts.1000292D
 10002923  |.  C705 58670210 0200000>MOV DWORD PTR DS:[10026758], 2
 1000292D  |>  83FF FF               CMP EDI, -1
 10002930  |.  74 24                 JE SHORT rts.10002956
 10002932  |.  F6C3 08               TEST BL, 8
 10002935  |.  74 15                 JE SHORT rts.1000294C
 10002937  |.  8D4C24 18             LEA ECX, DWORD PTR SS:[ESP+18]
 1000293B  |.  6A 02                 PUSH 2
 1000293D  |.  51                    PUSH ECX
 1000293E  |.  55                    PUSH EBP
 1000293F  |.  57                    PUSH EDI
 10002940  |.  896C24 28             MOV DWORD PTR SS:[ESP+28], EBP
 10002944  |.  E8 97310000           CALL rts.10005AE0
 10002949  |.  83C4 10               ADD ESP, 10
 1000294C  |>  8BC7                  MOV EAX, EDI
 1000294E  |.  5F                    POP EDI
 1000294F  |.  5E                    POP ESI
 10002950  |.  5D                    POP EBP
 10002951  |.  5B                    POP EBX
 10002952  |.  59                    POP ECX
 10002953  |.  C2 0800               RETN 8
 10002956  |>  5F                    POP EDI
 10002957  |.  5E                    POP ESI
 10002958  |.  5D                    POP EBP
 10002959  |.  83C8 FF               OR EAX, FFFFFFFF
 1000295C  |.  5B                    POP EBX
 1000295D  |.  59                    POP ECX
 1000295E  \.  C2 0800               RETN 8
----- MicroSoft? Is it some kind of a toilet paper?  | Сообщение посчитали полезным:  | 
 | 
 Ранг: 34.9 (посетитель) Активность: 0.03↘0 Статус: Участник 
 
 | 
Создано: 26 июня 2006 12:55   · Личное сообщение ·  #2 
А как изменить надо?
   | Сообщение посчитали полезным:  | 
 Ранг: 253.9 (наставник) Активность: 0.13↘0 Статус: Участник 
 
 | 
Создано: 26 июня 2006 13:07   · Личное сообщение ·  #3 
ну если в двух словах, то нужно сначала выполнить то, что снизу, а потом то, что сверху. короче, там есть такая проверка CMP EDI, -1. если -1, то пытаемся еще по-другому... а мне нужно сделать, чтобы сначала по-другому, а потом уже как обычно.
 ----- MicroSoft? Is it some kind of a toilet paper?  | Сообщение посчитали полезным:  | 
 Ранг: 253.9 (наставник) Активность: 0.13↘0 Статус: Участник 
 
 | 
Создано: 26 июня 2006 14:14   · Личное сообщение ·  #4 
А вот как это переварил декомпиль:
     ebx = A10;
     (save)ebp;
     (save)esi;
     (save)edi;
     esi = !ebx;
     ebp = 0;
     M10026758 = 0;
     esi = esi >> 0xa & 1;
     edi = L100026A0(ebx);
     V4 = edi;
     eax = L10004C60(Ac, V4, esi, ebp, L10002970(ebx), 268435456, ebp);
     edi = eax;
     if(edi == -1) {
         A10 = ebp;
         do {
             eax = L100024B0(A10, Ac);
             ebp = eax;
             if(ebp == 0) {
                 break;
             }
             eax = L10004C60(ebp, V4, esi, 0, L10002970(ebx), 268435456, 0);
             edi = eax;
             if(edi != -1) {
                 break;
             }
             L100023D0();
             eax = A10 + 1;
             A10 = eax;
         } while(eax < 0x20);
         ebp = 0;
     }
     if(M10016a08 == ebp) {
         M10026758 = 2;
     }
     if(edi != -1) {
         if(!(bl & 8)) {
             Ac = ebp;
             L10005AE0(edi, ebp, & Ac, 2);
         }
         eax = edi;
         (restore)edi;
         (restore)esi;
         (restore)ebp;
         return;
     }
     (restore)edi;
     (restore)esi;
     (restore)ebp;
     return eax | -1;
----- MicroSoft? Is it some kind of a toilet paper?  | Сообщение посчитали полезным:  | 
 Ранг: 253.9 (наставник) Активность: 0.13↘0 Статус: Участник 
 
 | 
Создано: 27 июня 2006 00:42   · Личное сообщение ·  #5 
уже разобрался... часа 4 в отладчике... и 300 нажатий Ctrl+F2 помогли...   
----- MicroSoft? Is it some kind of a toilet paper?  | Сообщение посчитали полезным:  | 
 Ранг: 310.8 (мудрец), 29thx Активность: 0.43↘0 Статус: Участник 
 
 | 
Создано: 27 июня 2006 09:20   · Личное сообщение ·  #6 
Tim пишет:
 уже разобрался 
 На будущее совет : если ты не смог разобраться в логике программы, никакие "длинные листинги" не помогут другим это понять      Надо было просто отформатировать текст программы : внутренние части отделить впереди парой пробелов или табуляцией - часто это помогает. А IF - это от лукавого. Именно в тот момент, когда ты их правильно написал бы - ты и понял полностью алгоритм.
   | Сообщение посчитали полезным:   | 
 Ранг: 253.9 (наставник) Активность: 0.13↘0 Статус: Участник 
 
 | 
Создано: 28 июня 2006 01:11   · Личное сообщение ·  #7 
tundra37
ну, форматирование вообще-то есть... просто на форуме используют вместо тега PRE бессмысленный CODE.
 ----- MicroSoft? Is it some kind of a toilet paper?  | Сообщение посчитали полезным:   | 
 Ранг: 310.8 (мудрец), 29thx Активность: 0.43↘0 Статус: Участник 
 
 | 
Создано: 28 июня 2006 09:45   · Личное сообщение ·  #8 
Tim пишет:
 ну, форматирование вообще-то есть 
 Да я не про то. Тебе самому для разбора алгоритма нужно форматирование. Чужому человеку и с форматированием нелегко в"ехать    Возможно, конечно, что в варианте с IF можно было разобраться.
   | Сообщение посчитали полезным:   | 
  Ранг: 71.8 (постоянный) Активность: 0.03↘0 Статус: Участник 
 
 | 
Создано: 28 июня 2006 12:48   · Личное сообщение ·  #9 
Tim
/offtop
 Какой декомпиль использовал для получения листинга?
   | Сообщение посчитали полезным:   | 
 Ранг: 172.2 (ветеран) Активность: 0.07↘0 Статус: Участник
  
 
 | 
Создано: 29 июня 2006 00:33   · Личное сообщение ·  #10 
а 4ем ида с функЦиями "Display flow chart of the current fucntion, Display graph of the fucntion calls" не угодила?
 ----- HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE  | Сообщение посчитали полезным:  | 
 Ранг: 352.4 (мудрец), 4thx Активность: 0.15↘0 Статус: Участник retired 
 
 | 
Создано: 29 июня 2006 00:45   · Личное сообщение ·  #11 
Bat пишет:
 Какой декомпиль использовал для получения листинга? 
на REC похоже
   | Сообщение посчитали полезным:   | 
 Ранг: 253.9 (наставник) Активность: 0.13↘0 Статус: Участник 
 
 | 
Создано: 29 июня 2006 00:45   · Личное сообщение ·  #12 
Bat
REC
 ----- MicroSoft? Is it some kind of a toilet paper?  | Сообщение посчитали полезным:   |