Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 921

Программирование для dos4g.exe

17.12.2023, 16:59. Показов 3241. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программу компилирую с помощью Visual Studio 5.0

У меня есть dos4g.exe с примерами, я взял hello world пытаюсь компилировать. Мой BAT файл для компиляции следующий

Code
1
2
3
4
5
cl.exe /c /G3 /Z7 /I "C:\Program Files\DevStudio\VC\include" hello.c
 
link.exe /DEBUG /DEBUGTYPE:CV /SUBSYSTEM:CONSOLE /INCREMENTAL:NO /NOD /PDB:NONE /OUT:hello.exe /MAP:hello.map /DEF:hello.def /STUB:"D:\DOS4G\bin\pestub.exe" /LIBPATH:"C:\Program Files\DevStudio\VC\lib" hello.obj
 
pause
мой .def файл следующий

Code
1
2
3
4
5
6
7
NAME  HELLO
DESCRIPTION "PE C++ Hello World Example Program"
VERSION 1.0
CODE  PRELOAD MOVEABLE DISCARDABLE
DATA  PRELOAD SINGLE
EXPORTS
DOS4GOPTIONS
мой файл hello.c следующий (взят из примеров dos4g.exe поставки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
*  Standard Hello World program 
*  Copyright (c) 1996 Tenberry Software, Inc.
*  All Rights Reserved
*/
 
// Standard header files
#include <stdio.h>
 
// Test DOS4GOPTIONS string export by preventing the startup banner from 
// being displayed
char DOS4GOPTIONS[] =
    "dos4g=StartupBanner:OFF\n";
   
main(int ac, char **av)
{
    // Print the standard response to the screen
   printf("Hello, World!\n");
}
Ошибка на скриншоте. Что делать?

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2023, 16:59
Ответы с готовыми решениями:

Не запускаются AVZ. exe, CCleaner. exe, AutoLogger. exe, regedit. exe. Словил вирус bizigames
Доброго времени суток. Захотел я почистить комп от мусора всякого при помощи CCleaner, как не тут-то было. В общем, .exeшники...

Не запускаются AVZ. exe, CCleaner. exe, AutoLogger. exe, regedit. exe Дублируются процессы
Добрый день) не запускались экзешники перечисленные в топе, исправила кое как процессы chrome.exe, opera.exe, svchost.exe, explorer.exe...

Вмонтировать exe в файл для его блокировки на время работы exe
Как прикрепить (вмонтировать) exe к файлу, так чтобы до завершения этой программы содержимое файла не раскрывалось. Например,...

26
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
20.12.2023, 17:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kurlyak Посмотреть сообщение
можно взять начало функции main() из IDA (в бинаром виде) и поискать этот код в d32.exe.
Если работает SAVE, можно сохранить дамп интересующих участков работающей программы на старте, и спокойно поискать в нём вне отладчика, натравить свои утилитки, статические анализаторы, дизассемблеры и т.п.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
21.12.2023, 10:56
Цитата Сообщение от kurlyak Посмотреть сообщение
Я пробовал ставить беркпоинт в d32.exe на этот адрес CS:IEP из скрина. Ставил так "BP 1:0003a574" пишет типа NULL в ответ на команду.
Вы же отлаживаете не скрин, а программу, загруженную загрузчиком DOS/4GW или отладчиком.

Если бы у отладчика была инормация о символе main, Вы бы просто установили точку на main.
Дамп окна Watcom-отладчика:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
=======| Assembly: t |=======
 0377:02490015  main+00000005
 02490010  push       00000024 
 02490015  call       near ptr __CHK 
 0249001A  push       ebx 
 0249001B  push       ecx 
 0249001C  push       esi 
 0249001D  push       edi 
 0249001E  push       ebp 
 0249001F  mov        ebp,esp 
 02490021  sub        esp,0000000C 
 02490027  mov        dword ptr -0C[ebp],eax                                                                  __x386_zero_base_selector+0001007E=00000377
 0249002A  mov        dword ptr -08[ebp],edx                                                                  __x386_zero_base_selector+00010082=00003246
     return c * v[0][0]/2;
 0249002D  mov        eax,dword ptr -08[ebp]                                                                  __x386_zero_base_selector+00010082=00003246
 02490030  mov        eax,dword ptr [eax]                                                                                          037F:00000001=8B00A710
 02490032  movzx      eax,byte ptr [eax]                                                                                                 037F:00000001=10
 02490035  imul       eax,dword ptr -0C[ebp]                                                                  __x386_zero_base_selector+0001007E=00000377
 02490039  cdq        
 0249003A  sub        eax,edx
Фрагмент листинга компоновки:
Code
1
2
3
4
 Address        Symbol
=======        ======
Module: t.obj(C:\4G\t.c)
0001:00000010  main_
В программе main = 0377:02490010
В другой раз загрузчик может разместить object, содержащий main, в другом месте линейного адресного пространства, изначение main будет уже иным:
Code
1
2
3
4
5
6
7
8
9
10
11
=======| Assembly: t |=======
 01A0:0045C010  main
 int main(int c, char* v[])
 0045C010    push       00000024 
 0045C015    call       near ptr __CHK 
 0045C01A    push       ebx 
 0045C01B    push       ecx 
 0045C01C    push       esi 
 0045C01D    push       edi 
 0045C01E    push       ebp 
 0045C01F    mov        ebp,esp
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
 =======| CPU registers (486) |=======
EAX:00000001 EBX:0049C0B0
ECX:00000000 EDX:0049D03C
ESI:0048C0D1 EDI:0048C0CC
EBP:0049C0A4 ESP:0049C0A0
EIP:0045C010 EFL:00000246
C:  0        P:  1
A:  0        Z:  1
S:  0        I:  1
D:  0        O:  0
DS: 01A8     ES: 01A8
FS: 0000     GS: 0020
SS: 01A8     CS: 01A0
Если нам известен адрес main относительно какого-то "object", в нашем случае object 0001 а отладчику неизвестен, то нужно как-то узнать, где начинается наш object в адресном пространстве отлаживаемой программы.
Нам повезло, и в заголовке исполняемого LE/LX объектного модуля указано, какое значение загрузчик должен присвоить EIP перед началом выполнения программы относительно того же object 0001
Code
1
2
3
4
5
6
7
                        +-----------------------+
                        |   Linker Statistics   |
                        +-----------------------+
 
Stack size:  00010000 (65536.)
Memory size:  00011536 (70966.)
Entry point address: 0001:00000094
Object 0001 начинается с EIP-0x94, где EIP - содержимое регистра EIP перед началом выполнения программы.

Начинаем сеанс отладки без отладочной информации (или просим Watcom-отладчик начать отладку не с main(), а с кода инициализации C runtime, из которого main() вызывается).
Code
1
2
3
=======| Assembly: mmm |=======
 0377:02490094
 02490094  jmp        024900F6
Code
1
2
3
4
5
6
7
=======| CPU registers (Pentium Pro) |=======
EAX:00000000 EBX:00000000 ECX:00000000 EDX:00000000
ESI:00000377 EDI:00000000 EBP:00000000 ESP:024C00B0
EIP:02490094 EFL:00000200 C:  0        P:  0
A:  0        Z:  0        S:  0        I:  1
D:  0        O:  0        DS: 037F     ES: 018F
FS: 0000     GS: 017F     SS: 037F     CS: 0377
Считаем столбиком, устно или на калькуляторе начало object 0001 в сегменте с селектором 0377:
02490094
-
00000094
=========
02490000

Object начинается с 0x2490000, а main, таким образом, с 0x2490000 + 0x10 = 0x2490010

Если нас интересует адрес чего-то в другом object, то его можно найти по ссылкам из известного object.
Вложения
Тип файла: txt MMM.MAP.txt (7.1 Кб, 5 просмотров)
1
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 921
21.12.2023, 17:50  [ТС]
Спасибо, начинает до меня доходить.

Значит я посмотрел в IDA информацию про файл



Как видно

Program Entry Point (CS:EIP) 1:0003A574h

Дальше я загружаю ЕХЕ при помощи команды из батника

Code
1
d32.exe tomb.exe
Первый адрес который в окне d32.exe это

Code
1
03C7:83432574
Дальше отнимаю от этого адреса entry point из IDA

83432574 - 3A574 = 833F8000

Дальше делаю команду в окне d32.exe

Code
1
U 833F8000
Это я так понял попал на начало Object.

Я правильно пока все делаю? Но как main() найти без отладочной информации? Я знаю main смещение в IDA это нам что то дает? Я пробовал добавить к 833F8000 + 28460 смещение main() в IDA но код дизасемблерный из IDA и d32 не совпадает по этому адресу.
0
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 921
21.12.2023, 18:16  [ТС]
Я нашел main в d32.exe

833F8000 + 28460

все правильно, видно я что то напутал. Я сложил эти два числа - и получил адрес 03C7:83420460 - перешел командой U в d32 и сравнил код с IDA - все сошлось - это main().

Спасибо!
Цитата Сообщение от politoto Посмотреть сообщение
Считаем столбиком, устно или на калькуляторе начало object 0001 в сегменте с селектором 0377:
02490094
-
00000094
=========
02490000
Object начинается с 0x2490000, а main, таким образом, с 0x2490000 + 0x10 = 0x2490010
Но я не понял почему от начального адреса в d32.exe (адрес после загрузки программы) надо отнимать адрес Object?

02490094
-
00000094


Что это за адрес 02490094 что от него надо отнимать адр. Object?

Добавлено через 15 минут
Спасибо огромнейшее!

Еще вопрос, я немного не разобрался - например в d32.exe есть вызов call функции, можно как то по своему называть эту функцию - дай ей свое имя, как в IDA? И сохранить потом файл с базой данных (как в IDA).
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
22.12.2023, 11:20
Цитата Сообщение от kurlyak Посмотреть сообщение
в d32.exe есть вызов call функции, можно как то по своему называть эту функцию - дай ей свое имя
Instant-D (d32.exe) работает с таблицами символов в своём формате, возможно, это формат Instant-C.
pe2dbg.exe вроде бы и должна строить такую таблицу по отладочной информации, извлечённой из PE-модуля.

Можно ли вручную определять свои символы во время сеанса отладки, не знаю.
Не стоит привыкать к этому отладчику. Версия DOS/4G с поддержкой PE достаточно редкая, и в своё время уже мало кому была нужна.
Основной автор и основатель компании, к сожалению, не успел восстановить и привести в порядок свой архив перед неудачной операцией на сердце.
Последняя поддерживаемая версия DOS/4GW - та, которую он успел передать команде OpenWatcom.
1
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 921
22.12.2023, 15:59  [ТС]
А вот еще вопросик. Например я начинаю откладку программы в d32.exe и программа переходит в полноэкранный режим, как переключаться между окном d32.exe и отлаживаемой программой? Под чистым MS-DOS это наверно невозможно (переключение между задачами) а вот под WinMe? Может на 2х мониторах можно - в одном мониторе d32.exe в другом программа?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
22.12.2023, 16:17
Чтобы приостановить отлаживаемую программу, можно назначить горячую клавишу.
Но при этом может испортиться видеорежим, установленный программой, палитра и т.п.
Поэтому у разработчиков того времени для удобства отладки устанавливали дополнительный монохромный или совместимый с ним видеоадаптер.
В отладчике есть команды перехода в монохромный или двухэкранный режим.

В Watcom'овских отладчиках можно использовать "удалённую" отладку, когда UI отладчика запускается на другой машине или в другом процессе на той же машине в своем окне.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2023, 16:17

Никак не могу установить WinHlp32.exe/WinHlp.exe для просмотра хелпника из ПО
Добрый день. Возникла проблема с Windows Serverv 2012 R2. Никак не могу установить WinHlp32.exe/WinHlp.exe для просмотра хелпника из ПО. ...

Как внедрить dll в exe, чтобы для работы программы нужен был только exe файл
как внедрить dll ссылку в exe, чтобы для работы программы нужен был только exe файл? Выдает ошибки: Ошибка 1 Не удается внедрить...

Как по exe файлу, получить список dll либ, которые qt exe программа требует для запуска?
Как по exe файлу, получить список dll либ, которые qt exe программа требует для запуска?

вирус calc.exe*32 notepad.exe*32 cmd.exe cannhost.exe
Здравствуйте. помогите решить проблему. При включении компьютера висят процессы calc.exe*32 notepad.exe*32 cmd.exe cannhost.exe. Завершаю...

Вирусы dwm.exe dllhost.exe ctfmon.exe svchost.exe
Проблема заключается в том что у меня на компьютере в диспетчере задач стоят задачи которые я не могу снять а именно: dwm.exe dllhost.exe...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru