|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 10, 2004 10:19:01 · Поправил: Black_mirror S_T_A_S_ Да ... меньше наверно не сделать ... Тогда наверно стоит усложнить задачу: процедура может использовать только eax,ecx и edx 8) хотя проще сохранить esi в стеке ... |
|
|
Дата: Авг 10, 2004 10:53:33 · Поправил: bogrus А так ? 00401000 58 POP EAX 00401001 48 DEC EAX 00401002 66:31C0 XOR AX,AX 00401005 66:8138 4D5A CMP WORD PTR DS:[EAX],5A4D 0040100A 75 F5 JNZ SHORT ret.00401001 |
|
|
Дата: Авг 10, 2004 11:07:29 bogrus Ну у тебя предпологается, что адрес на стеке лежит, а вдруг его там нет? Black_mirror > процедура может использовать только eax,ecx и edx Тогда ещё +2 байта (24). Используется только eax: 00401A00 33C0 xor eax, eax 00401A02 64:8B00 mov eax, [dword fs:eax] 00401A05 8338 FF cmp [dword ds:eax], -1 00401A08 8B40 04 mov eax, [dword ds:eax+4] 00401A0B ^ 75 F8 jnz short 00401A05 00401A0D 48 dec eax 00401A0E 66:33C0 xor ax, ax 00401A11 66:8138 4D5A cmp [word ds:eax], 5A4D 00401A16 ^ 75 F5 jnz short 00401A0DЗЫ Если я нигде не ошибся %) |
|
|
Дата: Авг 10, 2004 11:14:20 · Поправил: Flasher А как Вам вот такой:
mov eax,[esp]
and eax,0FFFF1000h
_k:mov edx,[eax+3Ch-1000h]
sub eax,1000h
cmp edx,800h
jae _k
cmp eax,[eax+edx+34h]
jnz _k
p.s. Ещё-бы Вы так аптимизированно GetProcAddress нашли :) |
|
|
Дата: Авг 10, 2004 11:33:57 EDX экономит ещё байт 00401A00 33C0 xor eax, eax 00401A02 64:8B00 mov eax, [dword fs:eax] 00401A05 94 xchg eax, esp 00401A06 5A pop edx 00401A07 42 inc edx 00401A08 ^ 75 FC jnz short 00401A06 00401A0A 5C pop esp 00401A0B 94 xchg eax, esp 00401A0C 48 dec eax 00401A0D 66:33C0 xor ax, ax 00401A10 66:8138 4D5A cmp [word ds:eax], 5A4D 00401A15 ^ 75 F5 jnz short 00401A0C |
|
|
Дата: Авг 10, 2004 11:38:54 · Поправил: S_T_A_S_ Flasher Где SEH? Вариант bogrus явно короче.. |
|
|
Дата: Авг 10, 2004 11:56:10 Опять 22 байта. Надеюсь, это окончательный вариант. 00401A00 94 xchg eax, esp 00401A01 99 cdq 00401A02 64:8B22 mov esp, [dword fs:edx] 00401A05 5A pop edx 00401A06 42 inc edx 00401A07 ^ 75 FC jnz short 00401A05 00401A09 5C pop esp 00401A0A 94 xchg eax, esp 00401A0B 48 dec eax 00401A0C 66:33C0 xor ax, ax 00401A0F 66:8138 4D5A cmp [word ds:eax], 5A4D 00401A14 ^ 75 F5 jnz short 00401A0B |
|
|
Дата: Авг 10, 2004 12:04:07 Ну у тебя предпологается, что адрес на стеке лежит, а вдруг его там нет? На Module.Entrypoint он там есть . Вот примерно как получает управление наш код : 793A87F2 FF55 08 CALL DWORD PTR SS:[EBP+8] 793A87F5 50 PUSH EAX 793A87F6 E8 40D7FFFF CALL kernel32.ExitThread Т.е. после старта в стеке лежит выход по ExitThread , на тот случай если нам захочеться выйти по ret . Я смотрел и на w95,NT4.0,w2k . |
|
|
Дата: Авг 10, 2004 13:01:22 S_T_A_S_ Зло!!! |
|
|
Дата: Авг 10, 2004 15:22:54 bogrus > На Module.Entrypoint он там есть Ну, если этот код расчитан на "нормальный запуск", тогда конечно. Хотя imho в таком случае лучше импортировать GetProcAddress, и считать адрес kernel от него. Это несколько больше на первый взгляд, но в этом случае не нужно будет искать сам GetProcAddress, что займёт не пару байт. Всёравно w2k не запускает EXE без импорта. Судя по названию раздела здесь нужен код для другого случая, т.е. нет гарантии, что на стеке есть что-то правильное. Поэтому приходится искать через FS:0 |
|
|
Дата: Авг 10, 2004 17:13:06 Dr. Golova на реверсинге говорил давно, что FS:0 не всегда может указывать в kernel32. в случае dll он вроде указывает в ntdll. кто нить проверял эту информацию? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066 |