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

 eXeL@B —› Основной форум —› Нахождение кода обработки событий!
<< . 1 . 2 .
Посл.ответ Сообщение


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 01 февраля 2008 15:52 · Поправил: Isaev
· Личное сообщение · #1

Интересует обобщённый принцып нахождения в отладчике участка кода, отвечающего за обработку того или иного события определённого компонента (как это делает DeDe например), в частности для VC, т.к. для него декомпилеров не обнаружил (да и смысл пользоваться декомпилятором, который может пол часа анализировать код, когда нужно обычно узнать лишь адрес процедуры обработки onClick) Поэтому интересует ручной метод!!!

Судя по расспросам каждый извращается как может, но не нормальным методом, который наверняка существует...
Поэтому думаю тема будет интересна многим...

Делимся опытом!

ЗЫ: Просьба высказываться только по теме

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




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

Создано: 27 августа 2008 11:23
· Личное сообщение · #2

sss пишет:
Кто нибудь открывал DeDe в DeDe

а смысл? исходники-же в сети есть...



Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 27 августа 2008 11:27
· Личное сообщение · #3

Ну не знал. Тогда зачем вопрос - искать как DeDe, когда ответ - посмотри в исходниках



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 27 августа 2008 11:55 · Поправил: Hexxx
· Личное сообщение · #4

Isaev пишет:
Интересует обобщённый принцып нахождения в отладчике участка кода, отвечающего за обработку того или иного события определённого компонента

Он разный в зависимости от языка программирования и gui framework'a. Для MFC - один, для WxWidgets - другой, для Qt - третий и т.д.
Каждый gui framework наворачивает уровни абстракции над виндовым апи. Если ты собрался понять где конкретно обрабатывается событие - тебе придется понять принципы работы всего фреймворка. Может даже оказаться что события "OnClick" там просто нет. Т.е. "клика" как понятия нет, в фреймворке оперируют другими событиями и твои попытки понять это все думая, что "тут как в делфи" - бесполезны.

Например в Java приложениях вообще одно окно накотором все остальные элементы рисуются, т.е. там нет отдельных окон для кнопок, для edit'ов. Все рисованное, как будто набор прямоугольников. И бестолку пытаться искать там классы окон так, как это делается в MFC или VCL.

Isaev пишет:
в частности для VC, т.к. для него декомпилеров не обнаружил

Ты пробовал писать MFC приложения в VC?

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 27 августа 2008 12:04
· Личное сообщение · #5

ARCHANGEL пишет:
в VC этого нет, поэтому и аналогий быть не может

Аналогий быть не может. Но инфа там есть.

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

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

PE_Kill пишет:
Посмотрел бы хоть сорсы его чтобы так говорить.
Скинь, я посмотрю! А про брутфорс поинеров в BSS и содержимое баз VMT для каждой версии, так что ж этот брутфорс нихрена не даёт при упаковке ехе файлов UPXом, а потом при ручной распаковке? Был бы брутфорс, не обсирасля б т.к. указатели то никуда не делись

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 27 августа 2008 20:56
· Личное сообщение · #7

Hexxx пишет:
Аналогий быть не может. Но инфа там есть.
MFC не приплетать!

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 августа 2008 21:51
· Личное сообщение · #8

Посты не плодите, правка ведь есть.



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

Создано: 27 августа 2008 22:18
· Личное сообщение · #9

ARCHANGEL пишет:
Скинь, я посмотрю


DeDe.3.50.04.1635 + исходные кода к 3.10b by DaFixer
wasm.ru/baixado.php?mode=tool&id=55




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 28 августа 2008 00:04 · Поправил: Isaev
· Личное сообщение · #10

Ну ребята, кончай флудить не по делу... Только отвлекёшься - сразу бардак!
На дату смотрим, я свою тему старую поднял, на старые вопросы ответы уже нашлись
Сейчас разговор конкретно о Delphi-прогах и всё! Никаких gui framework, WxWidgets, Qt и VC пока тоже в сторону!
Hexxx пишет:
Где ты собрался его программно получать?

Нужно 2 варианта:
1 - Из плагина для Olly
2 - В не запущеном бинарнике (просто из своей проги)
Получить указатель на структуру RTTI класса.
Пример:
Code:
  1. 004579C0 > $  55            PUSH EBP
  2. 004579C1   .  8BEC          MOV EBP,ESP
  3. 004579C3   .  83C4 F0       ADD ESP,-10
  4. 004579C6   .  B8 E0774500   MOV EAX,TestProj.004577E0
  5. 004579CB   .  E8 90E2FAFF   CALL TestProj.00405C60
  6. 004579D0   .  A1 88904500   MOV EAX,DWORD PTR DS:[459088]
  7. 004579D5   .  8B00          MOV EAX,DWORD PTR DS:[EAX]
  8. 004579D7   .  E8 04E2FFFF   CALL TestProj.00455BE0
  9. 004579DC   .  8B0D C88E4500 MOV ECX,DWORD PTR DS:[458EC8] ; TestProj.0045AC04
  10. 004579E2   .  A1 88904500   MOV EAX,DWORD PTR DS:[459088]
  11. 004579E7   .  8B00          MOV EAX,DWORD PTR DS:[EAX]
  12.               ; вот то, что тут в EAX кладётся надо получить...
  13.               ; В данном случае там будет (009516D4).
  14.               ; Как это найти???
  15. 004579E9   .  8B15 80714500 MOV EDX,DWORD PTR DS:[457180] ; TestProj.004571CC
  16. 004579EF   .  E8 04E2FFFF   CALL TestProj.00455BF8


-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 28 августа 2008 13:59 · Поправил: Hexxx
· Личное сообщение · #11

Isaev пишет:
; вот то, что тут в EAX кладётся надо получить...
; В данном случае там будет (009516D4).
; Как это найти???

Все равно не понятно. Где "тут"? И что "это" ты собираешься найти?

Опиши use-case: откуда чего берешь и чего не хватает чтобы получить нужные тебе данные.

Isaev пишет:
2 - В не запущеном бинарнике (просто из своей проги)


RTTI базовых типов лежит в начале бинаря:
Code:
  1. CODE:00401000 off_401000      dd offset unk_401004    ; DATA XREF: CODE:00401016o
  2. CODE:00401000                                         ; CODE:00415F69r ...
  3. CODE:00401004 unk_401004      db    3
  4. CODE:00401005                 db    7
  5. CODE:00401006                 db  42h ; B
  6. CODE:00401007                 db  6Fh ; o
  7. CODE:00401008                 db  6Fh ; o
  8. CODE:00401009                 db  6Ch ; l
  9. CODE:0040100A                 db  65h ; e
  10. CODE:0040100B                 db  61h ; a
  11. CODE:0040100C                 db  6Eh ; n

Все классы основываются на базовых типах, т.е. их дескрипторы содержат указатель на "предка". То есть тебе надо парсить RTTI которые лежат вначале бинаря и потом искать xref.

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 28 августа 2008 16:55
· Личное сообщение · #12

Hexxx =) помоему это и требовалось , вопрос тогда такой , всегда ли они лежат в начале бинаря ??? =) Может есть особенность какаянть чтоб найти по маске или еще как , в измененой проге

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 28 августа 2008 17:56
· Личное сообщение · #13

mak пишет:
помоему это и требовалось

нифига не это...
Нужно RTTI не базовых типов, а на некую рекурсивную структуру или так называемый "список наследственности" через который можно определить какой компонент чьим потомком является и какие имеет свойства и события... т.е. как бы воссоздать *.dfm

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 28 августа 2008 18:37
· Личное сообщение · #14

Isaev пишет:
Нужно RTTI не базовых типов, а на некую рекурсивную структуру или так называемый "список наследственности" через который можно определить какой компонент чьим потомком является и какие имеет свойства и события... т.е. как бы воссоздать *.dfm


1. Ищешь по маске / сигнатуре вызовы функций, создающих экземпляр твоего компонента
2а. В цикле обрабатываешь все вызовы этих функций, получая указатель на RTTI типов
2b. Указываешь ручками интересующий RTTI
3. Идешь к предкам этого компонента (см. указатель на предка)
4. Начиная с предков анализируешь таблицу обработчиков, каждый из потомков добавляет только новые виртуальные методы и методы работы с полями компонента

-----
DREAMS CALL US





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 28 августа 2008 21:39
· Личное сообщение · #15

=TS= поиск по маске / сигнатуре - это конечно логично, но последнее к чему хотельсь бы прибегать... Неужели этот указатель не лежит где-нибудь и тупой поиск - единственный выход?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





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

Создано: 28 августа 2008 23:40
· Личное сообщение · #16

ARCHANGEL пишет:
так что ж этот брутфорс нихрена не даёт при упаковке ехе файлов UPXом, а потом при ручной распаковке? Был бы брутфорс, не обсирасля б т.к. указатели то никуда не делись

Ну вот. Сам себе противоречишь. То говоришь что деде всего лишь табличку показывает и ничего сложного нет, то, что после упекса уже ничего не показывает. упекс табличку стирает?

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

Isaev пишет:
т.е. как бы воссоздать *.dfm

Дык dfm же в ресурсах лежат.

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





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 29 августа 2008 02:45
· Личное сообщение · #17

PE_Kill пишет:
Isaev пишет:
т.е. как бы воссоздать *.dfm
Дык dfm же в ресурсах лежат.



Я тоже об этом подумал , но ничего не нашел в обыкновенной форме с мессагой , файл не пакован вроде , ресурсы не видны.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 29 августа 2008 03:11
· Личное сообщение · #18

PE_Kill пишет:
Дык dfm же в ресурсах лежат.

Лежат, только оттуда имена только можно вытянуть, а адреса обработчиков событий потом всё равно нужно по RTTI искать, а где она?
mak пишет:
Я тоже об этом подумал , но ничего не нашел в обыкновенной форме с мессагой , файл не пакован вроде , ресурсы не видны.

там немного в друдом виде всё представлено, но можно вытащить...
dfm лежит в RT_RCDATA, смотри в сторону EnumResourceNames

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 29 августа 2008 12:11
· Личное сообщение · #19

=) Одын товарсч вот что пишет

В VMT каждого класса есть ссылка на родителя. Глобальной "структуры" нет.
есть неплохой скриптик для разбора дельфёвского RTTI для иды как пример, в то время ида еще не поддерживала классы РТТИ

Delphi_Typeinfo.idc - parses Delphi classes RTTI. You need to edit the
script before loading to set the correct Delphi version. It then registers
a few hotkeys (sorry, GUI users) to parse the class VMT/typeinfo.

bcc.idc - parsing Borland C++ tpids and exception infos. Inspired by IDA
parser, which didn't work for all cases so I tried to improve it

ms_typeinfo.idc - extracts a class name for a VMT if the RTTI for it is
present.

ti_incl.idc, utils.idc - support files for Delphi_Typeinfo.idc. Need to be
placed in the IDA IDC subdir (IDA limitation? I couldn't get #include work
outside IDC dir)

Code:
  1. Usage examples:
  2. 1. Delphi 4 (edit Delphi_Typeinfo.idc to uncomment "#define D4" and load it)
  3. mov     ecx, ds:off_0_5AB580       <- form variable
  4. mov     eax, ds:off_0_5ABAAC       <- Application object
  5. mov     eax, [eax]
  6. mov     edx, ds:off_0_487D70       <- form class pointer
  7. call    TApplication::CreateForm
  8. Follow off_0_487D70 and press Ctrl-F8 there
  9. You'll get something like this:
  10. TAboutBoxClass  dd offset TAboutBox     ; DATA XREF: start+83r
  11.                                         ; Pointer to self
  12.                 dd 0                    ; Pointer to interface table
  13.                 dd 0                    ; Pointer to Automation initialization
  14.                 dd 0
  15.                 dd offset tiTAboutBox   ; Pointer to type information table
  16.                 dd offset ftTAboutBox   ; Pointer to field definition table
  17.                 dd offset mtTAboutBox   ; Pointer to method definition table
  18.                 dd 0                    ; Pointer to dynamic method table
  19.                 dd offset aTaboutbox    ; Class name pointer
  20.                 dd 334h                 ; Instance size
  21.                 dd offset TFormClass    ; Pointer to parent class
  22.                 dd offset TComponent::SafeCallException ; SafeCallException m
  23.                 dd offset TCustomForm::AfterConstruction ; AfterConstruction
  24.                 dd offset TCustomForm::BeforeDestruction ; BeforeDestruction m
  25.                 dd offset TObject::Dispatch ; Dispatch method
  26.                 dd offset TCustomForm::DefaultHandler ; DefaultHandler method
  27.                 dd offset TObject::NewInstance ; NewInstance method
  28.                 dd offset TObject::FreeInstance ; FreeInstance method
  29.                 dd offset TCustomForm::Destroy ; destructor Destroy
  30. TAboutBox       dd offset TWinControl::Virtual00 ; DATA XREF: CODE:00487D70o
  31.                                         ; CODE:00487FFFo
  32.                                         ; Virtual method 00
  33.                 dd offset TCustomForm::Virtual04 ; Virtual method 04
  34.                 dd offset TPersistent::Virtual08 ; Virtual method 08
  35.                 ...............
  36. The script also creates the class structure with all fields that can be 
  37. extracted from RTTI info.
  38. 2. Borland C++/Builder (load bcc.idc)
  39. Here's an example of parsed tpid (after pressing Shift-F7 at the beginning of the structure):
  40. `__tpdsc__'[Sysutils::Exception] dd 0Ch ; tpSize
  41.                                         ; DATA XREF: .text:004013B8o
  42.                                         ; .text:00401538o ...
  43.                 dw TM_IS_STRUCT or TM_IS_CLASS; tpMask
  44.                 dw 30h                  ; tpName
  45.                 dd 0                    ; tpcVptrOffs
  46.                 dd CF_HAS_CTOR or CF_HAS_DTOR or CF_HAS_BASES or CF_HAS_VTABPPTR or CF_HAS_VIRTDT or CF_DELPHICLASS; tpcFlags
  47.                 dw 44h                  ; tpcBaseList
  48.                 dw 54h                  ; tpcVbasList
  49.                 dd 0                    ; tpcDlOpAddr
  50.                 dw 0                    ; tpcDlOpMask
  51.                 dw 0                    ; tpcDaOpMask
  52.                 dd 0                    ; tpcDaOpAddr
  53.                 dd 3                    ; tpcDtorCount
  54.                 dd 3                    ; tpcNVdtCount
  55.                 dd offset Sysutils::Exception::~Exception(void); tpcDtorAddr
  56.                 dw 3                    ; tpcDtorMask
  57.                 dw 58h                  ; tpcDtMembers
  58.                 db 'Sysutils::Exception',0 ; Name of the type
  59. ; Base classes:
  60.                 dd offset `__tpdsc__'[System::TObject]; blType ; Parent
  61.                 dd 0                    ; blOffs
  62.                 dd 3                    ; blFlags
  63.                 dd 0                    ; End of list
  64. ; Virtual base classes:
  65.                 dd 0                    ; End of list
  66. ; Destructible members:
  67.                 dd offset `__tpdsc__'[System::AnsiString]; dmType
  68.                 dd 4                    ; dmOffs
  69.                 dd 0                    ; End of list
  70. 3. MS Visual C++
  71. Load ms_typeinfo.idc when cursor is on 0046E5F8 (beginning of vtable)
  72. .rdata:0046E5F4                            dd offset dword_0_46F360
  73. .rdata:0046E5F8 const exception::`vftable' dd offset sub_0_45BFB3
  74. .rdata:0046E5F8                            dd offset sub_0_45C06C
  75. You'll get vtable renamed if the pointer at VMT-4 points to a valid
  76. typeinfo.



Вот именно об этом я говорил в самомо начале , то есть Поиск через VMT должен быть универсален.

d90e_29.08.2008_CRACKLAB.rU.tgz - typeinfo_idc_10.zip

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 29 августа 2008 12:17 · Поправил: Hexxx
· Личное сообщение · #20

(удалено) достали...

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 29 августа 2008 12:21 · Поправил: Hexxx
· Личное сообщение · #21

mak пишет:
=) Одын товарсч вот что пишет

Я тоже такой товарищ:
www.codebreakers-journal.com/downloads/cbj/2004/CBJ_1_2_2004_Hex_Classes_Restoration.pdf

А толку... если тут люди никак не могут сформулировать чего хотят.

Isaev пишет:
Нужно RTTI не базовых типов, а на некую рекурсивную структуру или так называемый "список наследственности" через который можно определить какой компонент чьим потомком является и какие имеет свойства и события... т.е. как бы воссоздать *.dfm


Так вот я тебе предлагаю обратную рекурсию, т.е. идти от базовых типов вверх. Потому что в коде используются не указатели на начало RTTI дескрипторов, а на середину таблиц виртуальных методов.

Isaev пишет:
dfm лежит в RT_RCDATA

Там лежат тока параметры для элементов форм, т.е. координаты, цвет и т.д.

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 29 августа 2008 12:39
· Личное сообщение · #22

www.geocities.com/tr_vladsoft1/TObject.htm

Вот по теме , что куда идет =)

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 29 августа 2008 13:08
· Личное сообщение · #23

mak пишет:
Вот по теме , что куда идет =)

Не, это абы что-то сказать...

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 29 августа 2008 17:03 · Поправил: =TS=
· Личное сообщение · #24

Вопрос всем, слушаем ВНИМАТЕЛЬНО:

Как ОДНОЗНАЧНО, БЕЗ ПОИСКА ПО МАСКЕ (а с каких-либо структур, параметров фунций) узнать местоположение RTTI базовых типов?

Hexxx пишет:
Все классы основываются на базовых типах, т.е. их дескрипторы содержат указатель на "предка". То есть тебе надо парсить RTTI которые лежат вначале бинаря и потом искать xref.


согласен, так тоже можно (если грамотно организовать процедуру поиска ссылок, ида часто находит не все), но надо БЕЗ ПОИСКА найти RTTI базовых типов. Я просто это говорю, т.к. копал делфи с 3 по 9 версии, и вот там совершенно по разному могут лежать эти RTTI, тем более текстовые названия могут быть обфусцированы

PS. Щас при анализе я реально хожу от потомка к предкам и дочерним компонентам...
PPS. Очень интересует DCC32.EXE и LNKDFM90.DLL для 9го (2005) Delphi

-----
DREAMS CALL US





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 29 августа 2008 17:30
· Личное сообщение · #25

Hexxx это я смотрю тебе сказать нечего , судя по последним коментам. У нас тут обсуждают а не умничают. Если тебе это ни о чем не говорит это твои проблемы

=TS= Я напишу в приват , вот файлы.

70bd_29.08.2008_CRACKLAB.rU.tgz - 2005.rar

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 251.8 (наставник), 17thx
Активность: 0.120
Статус: Участник
Seeker

Создано: 29 августа 2008 18:13
· Личное сообщение · #26

скрипт от RedPlait, выполняет базовый функционал: reng.ru/tools/011/descr.html

mak
спасибо, вот еще бы архивчики папок RTL и VCL из сурцов

-----
DREAMS CALL US





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 30 августа 2008 00:09
· Личное сообщение · #27

rapidshare.com/files/141146291/Win32.rar.html
RTL и VCL

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 37.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 01 сентября 2008 03:43
· Личное сообщение · #28

Isaev пишет:
Лежат, только оттуда имена только можно вытянуть, а адреса обработчиков событий потом всё равно нужно по RTTI искать


Если обработчик события указан в design time, он (адрес) тоже сохраняется в ресурсах exe и более того все design time свойства всех компонентов лежат ввиде связанных списков. Я тут глянул что делает DeDe - ищет начало ресурсов, а затем наполняет списки компонентов и их свойств. Конечно, это не работает в случае динамического назначения обработчиков...



Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 01 сентября 2008 12:32
· Личное сообщение · #29

mak пишет:
Hexxx это я смотрю тебе сказать нечего, судя по последним коментам.

Та вот как раз есть что сказать. Но в отличии от тебя, у меня есть что сказать по теме.
Ща начался просто флуд и уход от темы. Кидают все подряд, что хоть каким-то краем связано с VCL и Delphi. А саму проблему реально не решают.

-----
Реверсивная инженерия - написание кода идентичного натуральному



<< . 1 . 2 .
 eXeL@B —› Основной форум —› Нахождение кода обработки событий!
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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