Сейчас на форуме: ut2004, vsv1 (+8 невидимых)

 eXeL@B —› Вопросы новичков —› ASM-кодинг. Только для спецов!
Посл.ответ Сообщение


Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 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 все вываливается. Система ругается, что нельзя писать в память. В чем причина?

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 160.9 (ветеран), 1thx
Активность: 0.050
Статус: Участник

Создано: 19 августа 2006 22:50
· Личное сообщение · #2

Ну как вариант атрибуты секции надо дать на запись



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 19 августа 2006 22:57 · Поправил: Asterix
· Личное сообщение · #3

секция кода по умолчанию не имеет атрибута writeable

опередили %)



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 20 августа 2006 00:28
· Личное сообщение · #4

Crawler
Думал сверх сложный вопрос, зашел уму разуму поучиться, а оказалось-то... Обидно!

-----
My love is very cool girl.





Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 20 августа 2006 02:27 · Поправил: Rascal
· Личное сообщение · #5

Нда. Название топика явно не соответсвует содержимому. И нафига ручками? Напиши криптор нормальный, всё ж удобнее, да и опыта поднаберёшь. А то "ASM-кодинг. Только для спецов!"... Смех
А по теме вопроса - да, секция не поволяет писать. Поправь атрибуты или пиши через WritePtocessMemory

-----
Недостаточно только получить знания:надо найти им приложение




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

Создано: 20 августа 2006 09:20
· Личное сообщение · #6

Crawler
Лучше сюда загляни.
http://www.exelab.ru/f/action=vthread&forum=6&topic=6021&p age=-1



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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





Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 20 августа 2006 17:07
· Личное сообщение · #8

Мда... Во - первых, я обнаружил у себя в проге баг.:
0040103D: E2 E9 LOOP 0040102D, а не "LOOP 00401028".
Вот в том - то и дело, что задача заключается в том, чтобы писать свою функцию, неточная формулировка вопроса, это плохо

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 20 августа 2006 17:35
· Личное сообщение · #9

Crawler пишет:
Во - первых, я обнаружил у себя в проге баг

А ты хотел сдвинуть код вот так вот в наглую и не подавиться?
Почитай учебники или хотя бы Дневники чайника, а уже потом с вопросами к "спецам" обращайся.

-----
Всем привет, я вернулся





Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 21 августа 2006 18:10
· Личное сообщение · #10

Слушай, Bitfry, я ОБЪЯСНЯЮ ПОДРОБНО: таблицу импорта я сдвинул, ПЕРЕХОДЫ ПОПРАВИЛ, И, ЧТО САМОЕ ГЛАВНОЕ, компилировал с ключом "/SECTION:.text, RWE". А вы тут обзываетесь ламером. Обидно.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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





Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 22 августа 2006 20:50
· Личное сообщение · #12

Спасибо, Demon666. Такое я никогда не забуду. Респект

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 23 августа 2006 11:33
· Личное сообщение · #13

Crawler а адреса констант, указатели, фиксапы, FirstThunk,Name, ....?

-----
Yann Tiersen best and do not fuck





Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 23 августа 2006 12:56 · Поправил: Crawler
· Личное сообщение · #14

Все, все сделано! Я вообще ничего не понимаю!
Кстати, вроде, под отладчиком атрибуты секции кода стоят RWE, сотней тулз все проверено,но все равно Access Violation!

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




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

Создано: 23 августа 2006 14:50
· Личное сообщение · #15

Crawler
По-моему проще было прицепить экзешник, чем зря говорить...
Crawler пишет:
Во - первых, я обнаружил у себя в проге баг.:

1) loop 40102e
2) Я бы еще заменил EDX на DL, хотя и так работает.


Crawler пишет:
Кстати, вроде, под отладчиком атрибуты секции кода стоят RWE, сотней тулз все проверено,

Если бы ты в loop два раза не ошибся - я бы поверил. А так - труп в студию !
Кстати, только что смотрел в олли - на всех секциях стоит Access - R, Initial - RWE.
Ни то, ни другое неверно. Секции кода были нормальные, а Access я сам лично поменял в RWE, т.к.
получил сначала Access Violation.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 23 августа 2006 14:57
· Личное сообщение · #16

Crawler пишет:
Кстати, вроде, под отладчиком атрибуты секции кода стоят RWE


Инструкция для специалистов:
открой файл в hiew'e, далее: F4,F4,F8,F6, на секции кода F3, на атрибутах F3, старший бит включить, F9,F9,F9,Esc,Esc.

-----
Всем привет, я вернулся




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

Создано: 23 августа 2006 16:06
· Личное сообщение · #17

Bitfry пишет:
далее: F4,F4,F8,F6

Блин! Скоко там оказывается еще команд есть ?! Никогда бы не подумал.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 23 августа 2006 19:13
· Личное сообщение · #18

tundra37 и не говори

-----
Всем привет, я вернулся




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 23 августа 2006 23:19
· Личное сообщение · #19

tundra37 пишет:
А так - труп в студию !

Согласен! Непонятно что дальше код будет творить после примера в первом посте?
Crawler пишет:
0040103D: E2 E9 LOOP 0040102D, а не "LOOP 00401028".

А вообще, зачем 0040102D 52 PUSH EDX записывать в стек столько раз, потом стек выравнивается?

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com




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

Создано: 24 августа 2006 11:08
· Личное сообщение · #20

Demon666 пишет:
потом стек выравнивается?

Нет конечно. Надо loop 40102e поставить. "Акела промахнулся" и видимо не только здесь.




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 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.

Не в этом проблема, комментарий тот же самый.
Экзешник не могу прицепить, да и не в этом дело, ведь даже на такой симпли-проге что-то коматозит. Может с памятью что? Я уж задолбся.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 24 августа 2006 17:33 · Поправил: Bitfry
· Личное сообщение · #22

Crawler пишет:
на инструкции MOV [ECX+00401000],EDX все вываливается. Система ругается, что нельзя писать в память.

Crawler пишет:
сотней тулз все проверено,но все равно Access Violation!


Если в ECX не больше VSize данной секции (выровненной до SAlignment) минус 1, то исключение Access Violation может возникнуть только по причине защиты от записи страниц данной секции.
А защиту от записи на страницы устанавливает загрузчик по значению старшего бита атрибутов секции.
Ведь потом не было никаких манипуляций типа Vprotect и т.п.?

-----
Всем привет, я вернулся




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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




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

Создано: 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 и теперь ему стыдно



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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




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

Создано: 02 сентября 2006 05:02
· Личное сообщение · #26

Demon666
С этим переездом автор забыл все Ошибки-то он уже исправил. А 3- ( даже двумя) просто по доброте.
А ошибку LOOP 00401028 он исправил 21 августа, см. внимательней. Мне интересно, что же с RWE было ?!



Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 09 сентября 2006 17:40
· Личное сообщение · #27

Побудило сие написать одно сообщение в ЛС.
Инструкция как добавить новую структуру в IDA без скриптов!
1. Качаем IDA 5, где найти думаю, проблем не будет =)
2. Устанавливаем!
3. Запихиваем в IDA жертву, ждемс пока IDA выполнит свою грязную работу.
4. Потом в меню-> Windows-> Structures (по умолчанию клавиши Alt+8) -> F1 отроется хелп посвященный этому сабжу, читаем внимательно! Там все подробно описывается, в том числе и команды скри… (Подробнее чем там информации во всем Интернете не найти!)
5. Что требуется, знание Английского! ;)
6. Все!

-----
ЗЫ: истЕна где-то рядом, Welcome@Google.com





Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 21 сентября 2006 12:23
· Личное сообщение · #28

Тундра зач0т. Это был аццкий отжег, и если модеры хотят, они могут сделать мне -1000 рангу.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.



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