Сейчас на форуме: Rio (+10 невидимых)

 eXeL@B —› Основной форум —› Help needed. Диаграмма функции.
Посл.ответ Сообщение

Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 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.030
Статус: Участник

Создано: 26 июня 2006 12:55
· Личное сообщение · #2

А как изменить надо?



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 26 июня 2006 13:07
· Личное сообщение · #3

ну если в двух словах, то нужно сначала выполнить то, что снизу, а потом то, что сверху. короче, там есть такая проверка CMP EDI, -1. если -1, то пытаемся еще по-другому... а мне нужно сделать, чтобы сначала по-другому, а потом уже как обычно.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 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.130
Статус: Участник

Создано: 27 июня 2006 00:42
· Личное сообщение · #5

уже разобрался... часа 4 в отладчике... и 300 нажатий Ctrl+F2 помогли...

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 27 июня 2006 09:20
· Личное сообщение · #6

Tim пишет:
уже разобрался

На будущее совет : если ты не смог разобраться в логике программы, никакие "длинные листинги" не помогут другим это понять Надо было просто отформатировать текст программы : внутренние части отделить впереди парой пробелов или табуляцией - часто это помогает. А IF - это от лукавого. Именно в тот момент, когда ты их правильно написал бы - ты и понял полностью алгоритм.



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 28 июня 2006 01:11
· Личное сообщение · #7

tundra37
ну, форматирование вообще-то есть... просто на форуме используют вместо тега PRE бессмысленный CODE.

-----
MicroSoft? Is it some kind of a toilet paper?




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 28 июня 2006 09:45
· Личное сообщение · #8

Tim пишет:
ну, форматирование вообще-то есть

Да я не про то. Тебе самому для разбора алгоритма нужно форматирование. Чужому человеку и с форматированием нелегко в"ехать Возможно, конечно, что в варианте с IF можно было разобраться.




Ранг: 71.8 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 28 июня 2006 12:48
· Личное сообщение · #9

Tim
/offtop
Какой декомпиль использовал для получения листинга?



Ранг: 172.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 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.150
Статус: Участник
retired

Создано: 29 июня 2006 00:45
· Личное сообщение · #11

Bat пишет:
Какой декомпиль использовал для получения листинга?

на REC похоже



Ранг: 253.9 (наставник)
Активность: 0.130
Статус: Участник

Создано: 29 июня 2006 00:45
· Личное сообщение · #12

Bat
REC

-----
MicroSoft? Is it some kind of a toilet paper?



 eXeL@B —› Основной форум —› Help needed. Диаграмма функции.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати