Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/47: Рейтинг темы: голосов - 47, средняя оценка - 4.87
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759

Делаем в IDE FASM’a кнопку Debug и дружим его с OllyDbg

29.08.2014, 06:11. Показов 11206. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаем в IDE FASM’a кнопку Debug и дружим его с OllyDbg

статья была взята здесь

Статья посвящена всем любителям компилятора FASM и тем кто пишет код используя его IDE.

Известно что любое написание кода, особенно на ассемблере, не обходится без его отладки. Иначе, как искать ошибки и вообще тестировать своё творение?

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

Итак, однажды, мне в голову пришла идея встроить в IDE FASM'a отладчик OllyDbg, так чтоб скомпилированная программа одним кликом запускалась в «Ольке».

Зачем и почему я это затеял?

Ну, наверно, из-за того, что я очень ленив и мне надоело делать лишние движения
  1. Скомпилировать
  2. открыть файл с программой
  3. загрузить его в отладчик
Куда проще ― кликнуть одну кнопку и код автоматически компилируется и автоматически загрузится в отладчик.

На самом деле причина даже не в лени, а в удобстве.

Можно было бы не парится с этой интеграцией и использовать, например, BAT-файлы или скрипт на VBS, но, опять же, это нужно постоянно создавать, править файлы и т.д. и т.п... Лично мне такое решение не подходит ― слишком много ненужных движений...

Ближе к делу. Фактически ― всё, что нам нужно для того, чтобы встроить в IDE FASM’a отладчик OllyDbg ― это добавить в FASMW всего одну кнопку. Debug например. Ну и, соответственно, привязать некое действие к этой кнопке (обработчик).

Известно, что отладчик OllyDbg может принимать параметры при запуске. Например, вот так можно загрузить программу test.exe для отладки:
Code
1
C:\тут_путь_к_отладчику\OLLYDBG.EXE C:\путь_к_программе\test.exe
Можно сделать BAT файл или запустить этот «код» в командной строке. После запуска OLLYDBG.EXE принимает в качестве параметров строку
Code
1
C:\путь_к_программе\test.exe
и загружает для отладки файл test.exe, естественно, если он существует.

Запустить OLLYDBG.EXE с параметрами из своей программы можно воспользовавшись например функцией ShellExecute.

На FASM’e это будет выглядеть так:
Assembler
1
2
3
4
5
...
invoke  ShellExecute,0,0,debugger,param,0,1
...
debugger db ‘C:\тут_путь_к_отладчику\OLLYDBG.EXE’,0
param    db ‘C:\путь_к_программе\test.exe’,0
Нечто подобное нам и нужно встроить в IDE FASMW.

Приступаем к операции. Открываем сорцы фасма, конкретно нам нужен файл FASMW.ASM именно его нам предстоит немного дополнить. Файл FASMW.ASM находится в директории \SOURCE\IDE\FASMW. Открываем его. Ищем там строку:
Assembler
1
menuitem ‘&Run’,0,MFR_POPUP
Этот код отвечает за кнопки выпадающего меню Run в FASMW. Посмотрев чуть ниже этой найденной строки можно заметить что есть закомментированная строка
Assembler
1
;menuitem ‘&Debug’ _ ‘F8?,IDM_DEBUG
Судя по всему Автор FASM’a предусмотрел что нам может понадобится кнопочка Debug) Раскомментируем эту строку убрав знак «;». Теперь если скомпилировать этот отредактированный исходник и запустить получившийся FASMW.EXE (IDE) тогда в выпадающем меню Run у нас появится кнопка (пункт меню) Debug. Данная кнопка не выполняет не каких действий, пока это просто пустышка. Нужно привязать к этой кнопке действие(обработчик). В качестве действия будет — запуск OLLYDBG c нужными параметрами. Запускать будем как было сказано выше с помощью функции ShellExecute. Правим дальше. Ищем кусок кода:
Assembler
1
2
cmp     eax,IDM_COMPILE
je      compile
и после него вставляем:
Assembler
1
2
cmp     eax,IDM_DEBUG
je      debug
Таким образом программа будет реагировать на нажатия на кнопку Debug и прыгать на обработчик debug. Пишем обработчик. Ищем всё в том же исходнике FASMW.ASM такой код:
Assembler
1
2
3
4
compile:
and     [command_flags],0
invoke  SendMessage,[hwnd],FM_COMPILE,0,TRUE
jmp     finish
и после него вставляем свой код (это и будет наш обработчик):
Assembler
1
2
3
4
5
6
7
debug:
and     [command_flags],0
invoke  SendMessage,[hwnd],FM_COMPILE,0,FALSE
or      eax,eax
jnz     finish
invoke  ShellExecute,0,0,debugger,path_buffer,0,1
jmp     finish
Часть этого кода взята из обработчика Run, он находится чуть выше.Вместо запуска скомпилированной программы,как это происходит в обработчике Run, мы вставили функцию ShellExecute и таким образом мы будем запускать свои отладчик а в качестве параметров будем передавать путь к свежесобранной программе (path_buffer).
Едем дальше. Где-нибудь в пределах секции section ‘.data’ data readable writeable Вписываем:
Assembler
1
debugger rb 1000h
Я, например, это сделал тут:
Assembler
1
2
3
4
5
6
7
8
9
10
11
param_buffer rd 10h
user_colors rd 10h
name_buffer rb 100h
search_string rb 1000h
replace_string rb 1000h
string_buffer rb 2000h
help_path rb 1000h
ini_path rb 1000h
path_buffer rb 4000h
 
debugger rb 1000h
Данный буфер — debugger rb 1000h нужен нам для записи пути к отладчику. Для того, чтоб при смене путей к дебаггеру нам не нужно было каждый раз править и пересобирать исходник, путь к отладчику будем считывать из конфигурационного файла FASM’a FASMW.INI Ищем в FASMW.ASM строки:
Assembler
1
2
_section_help db ‘Help’,0
_key_help_path db ‘Path’,0
После них добавляем:
Assembler
1
2
_section_debug db ‘debugger’,0
_key_debug_path db ‘Path’,0
Далее ищем строку:
Assembler
1
2
invoke  GetPrivateProfileString,_section_help,_key_help_path,\
help_path,help_path,1000h,ini_path
Сразу после неё вставляем:
Assembler
1
2
invoke  GetPrivateProfileString,_section_debug,_key_debug_path,\
debugger,debugger,1000h,ini_path
Тем самым каждый раз при запуске FASMW будет читать свои файл конфигураций FASMW.INI, брать оттуда путь к отладчику и помещать его в тот самый буфер debugger rb 1000h

Всё это нужно для функции ShellExecute которую мы вписали выше.
Assembler
1
ShellExecute, 0,0,debugger,path_buffer,0,1
В буфере debugger у нас будет путь к отладчику. В path_buffer будет путь к программе. Он же служит как параметр для запуска отладчика.
Вот и всё, теперь можно скомпилировать наш подправленный FASMW.ASM.
Последний штрих — открываем файл конфигураций FASM’a FASMW.INI (он всегда лежит в одной папке с FASM.EXE) и в самый конец или начало вписываем строки:
Code
1
2
[debugger]
Path=C:\путь_к_отладчику\OLLYDBG.EXE
Сохраняем,закрываем.
Всё, теперь наш новый FASMW.EXE при запуске будет брать путь к отладчику из FASMW.INI.
Тестируем новую программу. Берем любой исходник,открываем в новом FASMW.EXE, жмем кнопку Debug что находится в меню Run. Код должен автоматически скомпилироваться и программа автоматически загрузится в отладчике. Один клик и никаких лишних движений. Да здравствует матушка лень
Ну, а если серьёзно, так ведь удобней? Теперь осталось научить FASM понимать и исполнять мысли кодера. Пускай это будет вашим домашним заданием
4
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2014, 06:11
Ответы с готовыми решениями:

obj\Debug\IDE.o||In function `Z11OpenProjectv':| C:\tsserver\Projects\cpp\codeblocks\MyComp\IDE\IDE\IDE.cpp|2 36|undefined reference to `GetOpenFileNam
obj\Debug\IDE.o||In function `Z11OpenProjectv':| C:\tsserver\Projects\cpp\codeblocks\MyComp\IDE\IDE\IDE.cpp|236|undefined reference to...

Программа на fasm + ollydbg
Скомпилировал программу на fasm, далее загрузил в олли, вот ассемблерный код - 00401000 > $ 6A 00 PUSH 0 00401002 . FF15...

Fasm + linux + ide
Господа! В данный момент приходится кодить на fasm под Linux (Debian). Хотелось бы узнать ваше мнение какую IDE можно подружить с fasm'ом....

3
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
18.02.2015, 14:09
Осталось прикрутить отладочную инфу, генерируемую FASM`ом к Olly.

Добавлено через 5 минут
Конвертер вроде бы уже написан
0
-1 / 2 / 1
Регистрация: 03.03.2011
Сообщений: 61
25.02.2016, 12:24
connect fasm with VS2005 В этой теме есть ссылка на архив с утилитой pecvt.exe, добавляющую отладочную информацию в obj-файл.

В сорце конвертера нет 2-х заголовочных файлов и соответств. файлов с кодом.
0
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 224
28.08.2016, 14:32
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
; flat assembler IDE for Win32
; Copyright (c) 1999-2016, Tomasz Grysztar.
; All rights reserved.
 
format PE GUI 4.0 large NX
entry start
stack 20000h
 
include 'win32ax.inc'
include 'fedit.ash'
 
include '..\..\version.inc'
 
IDE_VERSION_STRING equ "0.98.03"
 
struct EDITITEM
  header      TC_ITEMHEADER
  hwnd        dd ?
  pszpath     dd ?
ends
 
FM_NEW          = WM_USER + 0
FM_OPEN         = WM_USER + 1
FM_SAVE         = WM_USER + 2
FM_COMPILE      = WM_USER + 3
FM_SELECT       = WM_USER + 4
FM_ASSIGN       = WM_USER + 5
FM_GETSELECTED  = WM_USER + 6
FM_GETASSIGNED  = WM_USER + 7
FM_GETHANDLE    = WM_USER + 8
FM_OPENREADONLY = WM_USER + 11h
 
struct HH_AKLINK
  cbStruct     dd ?
  fReserved    dd ?
  pszKeywords  dd ?
  pszUrl       dd ?
  pszMsgText   dd ?
  pszMsgTitle  dd ?
  pszWindow    dd ?
  fIndexOnFail dd ?
ends
 
HH_DISPLAY_TOPIC  = 0
HH_KEYWORD_LOOKUP = 0Dh
 
section '.data' data readable writeable
  _caption db 'flat assembler ',VERSION_STRING,0
  _class db 'FASMW_IDE32',0
  _fedit_class db 'FEDIT',0
  _listbox_class db 'LISTBOX',0
  _tabctrl_class db 'SysTabControl32',0
  _htmlhelp_library db 'HHCTRL.OCX',0
  _htmlhelp_api db 'HtmlHelpA',0
  _user_library db 'USER32.DLL',0
  _setgestureconfig_api db 'SetGestureConfig',0
  _getgestureinfo_api db 'GetGestureInfo',0
  _closegestureinfohandle_api db 'CloseGestureInfoHandle',0
 
  _memory_error db 'Not enough memory to complete this operation.',0
  _loading_error db 'Could not load file %s.',0
  _run_object_error db 'Cannot execute object file.',0
  _saving_question db 'File was modified. Save it now?',0
  _not_found db 'Text %s not found.',0
  _not_found_after db 'Text %s not found after current position.',0
  _not_found_before db 'Text %s not found before current position.',0
  _replace_prompt db 'Replace this occurence?',0
  _replaces_made db '%d replaces made.',0
  _untitled db 'Untitled',0
  _font_face db 'Courier New',0
  _row_column db 9,'%d,'
  _value db '%d'
  _null db 0
  _summary db '%d passes, %d.%d seconds, %d bytes.',0
  _summary_short db '%d passes, %d bytes.',0
  _assembler_error db 'Error: %s.',0
  _line_number db '%s [%d]',0
  _color db '%d,%d,%d',0
  _modified_status db 9,'Modified',0
  _readonly_status db 9,'Read-only',0
  _pick_help db 'Pick help file',0
  _find db 'Find',0
  _replace db 'Replace',0
 
  _asm_extension db 'ASM',0
 
  _section_environment db 'Environment',0
  _key_environment_include db 'Include',0
  _section_compiler db 'Compiler',0
  _key_compiler_memory db 'Memory',0
  _key_compiler_priority db 'Priority',0
  _key_compiler_passes db 'Passes',0
  _section_options db 'Options',0
  _key_options_securesel db 'SecureSelection',0
  _key_options_autobrackets db 'AutoBrackets',0
  _key_options_autoindent db 'AutoIndent',0
  _key_options_smarttabs db 'SmartTabs',0
  _key_options_optimalfill db 'OptimalFill',0
  _key_options_revivedeadkeys db 'ReviveDeadKeys',0
  _key_options_consolecaret db 'ConsoleCaret',0
  _key_options_oneinstanceonly db 'OneInstanceOnly',0
  _section_colors db 'Colors',0
  _key_color_text db 'Text',0
  _key_color_background db 'Background',0
  _key_color_seltext db 'SelectionText',0
  _key_color_selbackground db 'SelectionBackground',0
  _key_color_symbols db 'Symbols',0
  _key_color_numbers db 'Numbers',0
  _key_color_strings db 'Strings',0
  _key_color_comments db 'Comments',0
  _section_font db 'Font',0
  _key_font_face db 'Face',0
  _key_font_height db 'Height',0
  _key_font_width db 'Width',0
  _key_font_weight db 'Weight',0
  _key_font_italic db 'Italic',0
  _key_font_charset db 'CharSet',0
  _section_window db 'Window',0
  _key_window_top db 'Top',0
  _key_window_left db 'Left',0
  _key_window_right db 'Right',0
  _key_window_bottom db 'Bottom',0
  _key_window_maximized db 'Maximized',0
  _section_help db 'Help',0
  _key_help_path db 'Path',0
  _section_debug db ‘debugger’,0
  _key_debug_path db ‘Path’,0
Добавлено через 4 минуты
написал вроде правильно, но ругается
Assembler
1
_section_debug db ‘debugger’,0
потом
Assembler
1
 _key_debug_path db ‘Path’,0
потом
Assembler
1
2
 invoke  GetPrivateProfileString,_section_debug,_key_debug_path,\
debugger,debugger,1000h,ini_path
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2016, 14:32
Помогаю со студенческими работами здесь

Делаем кнопку из компонета Image
Всем ПРИВЕТ! С помощью ниже описанного кода можно сделать из компонента Image кнопку с анимацией. unit Unit1; interface uses ...

Debug в Eclipse IDE
Значит, сделал конфигурацию Java Application с названием LibLauncher, main class - файл-лаунчер, который запускает проект, поставил точки...

Создание debug-режима в своей ide
Как это можно реализовать? Ясно, что надо в рантайме заменить кусочек памяти, занимаемый программой, но как это делается?

Подключение плагина OllyDbg v2.01: Отладчик его не распознает
Подключаю плагин, который использовался в OllyDbg v1.01. Отладчик его не распознает. Есть ли плагин COMMAND BAR для OllyDbg v2.01?

[ILINK32 Error] Fatal: Could not open .\Debug\Win32\Variant_1.ilf (project already open in IDE?)
Fatal: Could not open .\Debug\Win32\Variant_1.ilf (project already open in IDE?) на русском Fatal: Не удалось открыть \ Debug \...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru