eXeL@B —› Вопросы новичков —› ASM-кодинг. Только для спецов! |
Посл.ответ | Сообщение |
|
Создано: 19 августа 2006 22:47 · Личное сообщение · #1 Здорово! Вопрос такой: Допустим, есть прога на масм32, например (ну, это тупо для экзампла): .386 .model flat,stdcall ; модель памяти - flat option casemap:none ; подключение необходимых библиотек: ;------------------------------------- include \masm32\include\windows.inc ; include \masm32\include\kernel32.inc ; includelib \masm32\lib\kernel32.lib ; include \masm32\include\user32.inc ; includelib \masm32\lib\user32.lib ; ;------------------------------------- ; секция данных .data alert_upper db "Simply program",0 alert_text db "Hello, World!",0 ; секция кода .code start: invoke MessageBox, NULL, addr alert_text, addr alert_upper, MB_OK invoke ExitProcess, NULL end start Допустим, я ее скомпилил и хочу впаять криптор. Передвигаю все инструкции на 2 байта, вставляю прыжок на конец основного кода, где и находится мой криптор-жучок: 00401028 B9 35000000 MOV ECX,24 0040102D 52 PUSH EDX 0040102E 8B91 00104000 MOV EDX,[ECX+00401000] 00401034 83F2 65 XOR EDX,65h 00401037 8991 00104000 MOV [ECX+00401000],EDX 0040103D ^E2 E9 LOOP 00401028 0040103F ^EB C1 JMP 00401002<< Прыжок на ориг. код, когда всё готово Потом при помощи WinHex -а я ксорю по (65h) весь мой ассемблированный двоичный код (кроме распаковки, естественно), начиная с [OEP+2] и кончая [00401028h]. Потом все сохраняю и запускаю под сайсом или олейДБГ. По идее, все должно работать, но на инструкции MOV [ECX+00401000],EDX все вываливается. Система ругается, что нельзя писать в память. В чем причина? ----- Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей. |
|
Создано: 19 августа 2006 22:50 · Личное сообщение · #2 |
|
Создано: 19 августа 2006 22:57 · Поправил: Asterix · Личное сообщение · #3 |
|
Создано: 20 августа 2006 00:28 · Личное сообщение · #4 |
|
Создано: 20 августа 2006 02:27 · Поправил: Rascal · Личное сообщение · #5 Нда. Название топика явно не соответсвует содержимому. И нафига ручками? Напиши криптор нормальный, всё ж удобнее, да и опыта поднаберёшь. А то "ASM-кодинг. Только для спецов!"... Смех А по теме вопроса - да, секция не поволяет писать. Поправь атрибуты или пиши через WritePtocessMemory ----- Недостаточно только получить знания:надо найти им приложение |
|
Создано: 20 августа 2006 09:20 · Личное сообщение · #6 |
|
Создано: 20 августа 2006 09:26 · Личное сообщение · #7 Ну, тогда и я поддержу идею и дакучи спрошу у великих умов мира. Существует функция invoke GetProp,hWindow,ADDR szSubClassPtr mov ebx,eax все мы знаем, что она возвращает! в IDA: .text:004029D8 mov eax,[ebx+100h]; где ebx == результату, который возвратила GetProp .text:004029DE mov edi,[ebx+104h] Вопрос: Как в IDA организовать структуру, которая смогла бы заменить +100h на +hWindow, +104h на +hOldProc и т. д..? P. S. Требуется полный ответ раз такая тема да еще с таким громким названием. ;) ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 20 августа 2006 17:07 · Личное сообщение · #8 Мда... Во - первых, я обнаружил у себя в проге баг.: 0040103D: E2 E9 LOOP 0040102D, а не "LOOP 00401028". Вот в том - то и дело, что задача заключается в том, чтобы писать свою функцию, неточная формулировка вопроса, это плохо ----- Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей. |
|
Создано: 20 августа 2006 17:35 · Личное сообщение · #9 |
|
Создано: 21 августа 2006 18:10 · Личное сообщение · #10 |
|
Создано: 21 августа 2006 18:39 · Личное сообщение · #11 Demon666 пишет: Как в IDA организовать структуру, которая смогла бы заменить +100h на +hWindow, +104h на +hOldProc и т. д..? Ого! Неужели никто не знает Господа реверсеры? Тогда дополню вопрос, чтобы понятнее было! Вот так это будет выглядеть на Masm32: Crawler пишет: например (ну, это тупо для экзампла): .data GetSubClassPtr PROTO :DWORD LOAD_IMAGE STRUCT hImageNormal dd 0 hImageHot dd 0 hImagePushed dd 0 rect RECT <> LOAD_IMAGE ENDS szSubClassPtr db 'SubClassPtr',0 .code ------------[Создание структуры]------------------ invoke GlobalAlloc,GMEM_ZEROINIT,SizeOf LOAD_IMAGE invoke SetProp,hWnd,ADDR szSubClassPtr,eax -----------[Заполнение структуры]----------------- invoke GetSubClassPtr,hWnd mov ebx,eax ... invoke LoadIcon,hInstance,1 mov (LOAD_IMAGE PTR [ebx]).hImageNormal,eax invoke LoadIcon,hInstance,2 mov (LOAD_IMAGE PTR [ebx]).hImageHot,eax invoke LoadIcon,hInstance,3 mov (LOAD_IMAGE PTR [ebx]).hImagePushed,eax invoke GetWindowRect,hWnd,ADDR (LOAD_IMAGE PTR [ebx]).rect ... --------------[Удаление структуры]------------------ invoke GetSubClassPtr,hWnd mov edi,eax ... mov eax,(LOAD_IMAGE PTR [edi]).rect.right invoke DeleteObject,(LOAD_IMAGE PTR [edi]).hImageNormal invoke DeleteObject,(LOAD_IMAGE PTR [edi]).hImageHot invoke DeleteObject,(LOAD_IMAGE PTR [edi]).hImagePushed invoke GlobalFree,edi ... -------------------[no comments ;)]------------------ GetSubClassPtr Proc hWindow:HWND invoke GetProp,hWindow,ADDR szSubClassPtr ret GetSubClassPtr EndP А вот так будет выглядеть в IDA: -----------[Заполнение структуры]----------------- ... .text:00401255 push 1 .text:00401257 push hInstance .text:0040125D call LoadIconA .text:00401262 mov [ebx],eax .text:00401264 push 2 .text:00401266 push hInstance .text:0040126C call LoadBitmapA .text:00401271 mov [ebx+4],eax .text:00401274 push 3 .text:00401276 push hInstance .text:0040127C call LoadBitmapA .text:00401281 mov [ebx+8],eax .text:00401284 lea eax,[ebx+0Ch] .text:00401287 push eax .text:00401288 push [ebp+hWnd] .text:0040128B call GetWindowRect ... --------------[Удаление структуры]------------------ ... .text:004012DA mov eax,[edi+14h] .text:004012DD push dword ptr [edi] .text:004012DF call DeleteObject .text:004012E4 push dword ptr [edi+4] .text:004012E7 call DeleteObject .text:004012EC push dword ptr [edi+8] .text:004012EF call DeleteObject .text:004012F4 push edi .text:004012F5 call GlobalFree ... Что нужно сделать, чтобы получилось в IDA вот так: (!?) -----------[Заполнение структуры]----------------- ... .text:00401255 push 1 .text:00401257 push hInstance .text:0040125D call LoadIconA .text:00401262 mov [ebx+hImageNormal],eax .text:00401264 push 2 .text:00401266 push hInstance .text:0040126C call LoadBitmapA .text:00401271 mov [ebx+hImageHot],eax .text:00401274 push 3 .text:00401276 push hInstance .text:0040127C call LoadBitmapA .text:00401281 mov [ebx+hImagePushed],eax .text:00401284 lea eax,[ebx+rect] .text:00401287 push eax .text:00401288 push [ebp+hWnd] .text:0040128B call GetWindowRect ... --------------[Удаление структуры]------------------ ... .text:004012DA mov eax,[edi+rect.right] .text:004012DD push dword ptr [edi+hImageNormal] .text:004012DF call DeleteObject .text:004012E4 push dword ptr [edi+hImageHot] .text:004012E7 call DeleteObject .text:004012EC push dword ptr [edi+hImagePushed] .text:004012EF call DeleteObject .text:004012F4 push edi .text:004012F5 call GlobalFree ... ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 22 августа 2006 20:50 · Личное сообщение · #12 |
|
Создано: 23 августа 2006 11:33 · Личное сообщение · #13 |
|
Создано: 23 августа 2006 12:56 · Поправил: Crawler · Личное сообщение · #14 |
|
Создано: 23 августа 2006 14:50 · Личное сообщение · #15 Crawler По-моему проще было прицепить экзешник, чем зря говорить... Crawler пишет: Во - первых, я обнаружил у себя в проге баг.: 1) loop 40102e 2) Я бы еще заменил EDX на DL, хотя и так работает. Crawler пишет: Кстати, вроде, под отладчиком атрибуты секции кода стоят RWE, сотней тулз все проверено, Если бы ты в loop два раза не ошибся - я бы поверил. А так - труп в студию ! Кстати, только что смотрел в олли - на всех секциях стоит Access - R, Initial - RWE. Ни то, ни другое неверно. Секции кода были нормальные, а Access я сам лично поменял в RWE, т.к. получил сначала Access Violation. |
|
Создано: 23 августа 2006 14:57 · Личное сообщение · #16 |
|
Создано: 23 августа 2006 16:06 · Личное сообщение · #17 |
|
Создано: 23 августа 2006 19:13 · Личное сообщение · #18 |
|
Создано: 23 августа 2006 23:19 · Личное сообщение · #19 tundra37 пишет: А так - труп в студию ! Согласен! Непонятно что дальше код будет творить после примера в первом посте? Crawler пишет: 0040103D: E2 E9 LOOP 0040102D, а не "LOOP 00401028". А вообще, зачем 0040102D 52 PUSH EDX записывать в стек столько раз, потом стек выравнивается? ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 24 августа 2006 11:08 · Личное сообщение · #20 |
|
Создано: 24 августа 2006 16:38 · Личное сообщение · #21 tundra37 пишет: Секции кода были нормальные, а Access я сам лично поменял в RWE, т.к. получил сначала Access Violation. Я же говорю , что /SECTION RWE, читать внимательно надо. Bitfry пишет: Инструкция для специалистов: открой файл в hiew'e, далее: F4,F4,F8,F6, на секции кода F3, на атрибутах F3, старший бит включить, F9,F9,F9,Esc,Esc. Не в этом проблема, комментарий тот же самый. Экзешник не могу прицепить, да и не в этом дело, ведь даже на такой симпли-проге что-то коматозит. Может с памятью что? Я уж задолбся. ----- Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей. |
|
Создано: 24 августа 2006 17:33 · Поправил: Bitfry · Личное сообщение · #22 Crawler пишет: на инструкции MOV [ECX+00401000],EDX все вываливается. Система ругается, что нельзя писать в память. Crawler пишет: сотней тулз все проверено,но все равно Access Violation! Если в ECX не больше VSize данной секции (выровненной до SAlignment) минус 1, то исключение Access Violation может возникнуть только по причине защиты от записи страниц данной секции. А защиту от записи на страницы устанавливает загрузчик по значению старшего бита атрибутов секции. Ведь потом не было никаких манипуляций типа Vprotect и т.п.? ----- Всем привет, я вернулся |
|
Создано: 24 августа 2006 18:13 · Поправил: Demon666 · Личное сообщение · #23 Crawler пишет: Может с памятью что? Я уж задолбся. Память на целостность можно проверить при загрузке компа и если что-то с памятью, то у тебя не только вылетала бы твоя прожка но и система тоже показывала бы синий экран! tundra37 пишет: Нет конечно. Надо loop 40102e поставить. "Акела промахнулся" и видимо не только здесь. Может у него после джампа идет ESP+24 и он из стека потом читает данные? Так для примера: invoke GetDC,hWindow push eax invoke SelectObject,[esp+4],hFont ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 01 сентября 2006 07:56 · Личное сообщение · #24 Demon666 пишет: Может у него после джампа идет ESP+24 Он вообще про эту тему забыл и теперь SniperZ обстреливает http://www.exelab.ru/f/action=vthread&forum=6&topic=6021 Он добавил еще push cx и перед командой loop добавил два pop-a Видимо справился с RWE и теперь ему стыдно |
|
Создано: 01 сентября 2006 09:19 · Личное сообщение · #25 tundra37 да я уже здесь делал пост (повторение ниже) пост исчез наверно из-за переезда сайта, но если кто-то удалил, то пусть обоснует, в чем я тут ниже неправ, а то недоразумение какое-то получается!? ------------------------ tundra37 я после Crawler пишет: Допустим, есть прога на масм32, например (ну, это тупо для экзампла): Даже не глянул, там можно для экспериментов тупо придумать что угодно, я имел в виду оригинал! Ну, если так разбираться с вот этим куском кода: Crawler пишет: 00401028 B9 35000000 MOV ECX,24 0040102D 52 PUSH EDX 0040102E 8B91 00104000 MOV EDX,[ECX+00401000] 00401034 83F2 65 XOR EDX,65h 00401037 8991 00104000 MOV [ECX+00401000],EDX 0040103D ^E2 E9 LOOP 00401028 0040103F ^EB C1 JMP 00401002<< Прыжок на ориг. код, когда всё готово То тогда можно сделать вывод: 1. естественно ошибка видна, ибо регистр ECX по основному коду имеет значение 24 (вечный цикл ) 2. в стек ложится значение регистра EDX, отгадай, что произойдет, когда регистр ESP дойдет до нуля (если только дойдет ) 3. Crawler утверждает, что все OK! И что секция с “правильными атрибутами” Короче дальше не хочу описывать все, какие я должен сделать выводы? Только одни, знания ассемблера Crawler на лицо! P. S. Поэтому тема и оказалась в Вопросы новичков! ---------------------------- tundra37 а разве 3- неравно 2+ ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 02 сентября 2006 05:02 · Личное сообщение · #26 |
|
Создано: 09 сентября 2006 17:40 · Личное сообщение · #27 Побудило сие написать одно сообщение в ЛС. Инструкция как добавить новую структуру в IDA без скриптов! 1. Качаем IDA 5, где найти думаю, проблем не будет =) 2. Устанавливаем! 3. Запихиваем в IDA жертву, ждемс пока IDA выполнит свою грязную работу. 4. Потом в меню-> Windows-> Structures (по умолчанию клавиши Alt+8) -> F1 отроется хелп посвященный этому сабжу, читаем внимательно! Там все подробно описывается, в том числе и команды скри… (Подробнее чем там информации во всем Интернете не найти!) 5. Что требуется, знание Английского! ;) 6. Все! ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 21 сентября 2006 12:23 · Личное сообщение · #28 |
eXeL@B —› Вопросы новичков —› ASM-кодинг. Только для спецов! |
Эта тема закрыта. Ответы больше не принимаются. |