Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Незнайка
26 / 11 / 2
Регистрация: 14.10.2016
Сообщений: 373
Записей в блоге: 2

Как правильно разместить секцию импорта в секции кода?

25.08.2017, 17:23. Показов 2687. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я тут посмотрел файл masm1k.exe, это оконное приложение, весом в 1 кб (!).

У него отсутствует секция импорта, её как-то запихали в секцию кода, поэтому программа весит так мало. А как они это сделали? Я посмотрел их код и вообще не понял. Не понятно то, что там в masm1k.inc происходит:

masm1k.asm
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
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
    .486                      ; create 32 bit code
    .model flat, stdcall      ; 32 bit memory model
    option casemap :none      ; case sensitive
 
    include masm1k.inc        ; local includes for this file
 
  .code
    szClassName db "MASM 1k", 0
 
  start:
 
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
Main proc
 
    LOCAL msg      :MSG
    LOCAL wc       :WNDCLASSEX
 
    xor edi, edi
    mov esi, 400000h
 
    mov ebx, OFFSET szClassName
 
    invoke LoadCursor,edi,IDC_ARROW
 
    mov wc.cbSize,         sizeof WNDCLASSEX
    mov wc.style,          CS_VREDRAW or CS_HREDRAW
    mov wc.lpfnWndProc,    offset WndProc
    mov wc.cbClsExtra,     edi
    mov wc.cbWndExtra,     edi
    mov wc.hInstance,      esi
    mov wc.hbrBackground,  COLOR_BTNFACE+1
    mov wc.lpszMenuName,   edi
    mov wc.lpszClassName,  ebx
    mov wc.hIcon,          edi
    mov wc.hCursor,        eax
    mov wc.hIconSm,        edi
 
    invoke RegisterClassEx, ADDR wc
 
    mov ecx, CW_USEDEFAULT
 
    invoke CreateWindowEx,edi,ebx,ebx,
                          WS_OVERLAPPEDWINDOW,
                          ecx,edi,
                          ecx,edi,
                          edi,edi,
                          esi,edi
 
    invoke ShowWindow,eax,SW_SHOWNORMAL
 
    lea ebx, msg
    jmp inloop
 
  StartLoop:
    invoke DispatchMessage,ebx
  inloop:
    invoke GetMessage,ebx,edi,edi,edi
    test al, al
    jnz StartLoop
 
    ret
 
Main endp
 
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
WndProc proc hWin   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD
 
    cmp DWORD PTR uMsg, WM_DESTROY
    jne @F
      invoke PostQuitMessage,NULL
    @@:
 
    invoke DefWindowProc,hWin,uMsg,wParam,lParam
 
    ret
 
WndProc endp
 
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
end start


masm1k.inc
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
; #########################################################################
 
;     include files
;     ~~~~~~~~~~~~~
      include \masm32\include\windows.inc
 
externdef _imp__BeginPaint@8:PTR pr2
BeginPaint equ <_imp__BeginPaint@8>
 
externdef _imp__DispatchMessageA@4:PTR pr1
DispatchMessage equ <_imp__DispatchMessageA@4>
 
externdef _imp__DrawTextA@20:PTR pr5
DrawText equ <_imp__DrawTextA@20>
 
externdef _imp__EndPaint@8:PTR pr2
EndPaint equ <_imp__EndPaint@8>
 
externdef _imp__GetClientRect@8:PTR pr2
GetClientRect equ <_imp__GetClientRect@8>
 
externdef _imp__GetMessageA@16:PTR pr4
GetMessage equ <_imp__GetMessageA@16>
 
externdef _imp__DefWindowProcA@16:PTR pr4
DefWindowProc equ <_imp__DefWindowProcA@16>
 
externdef _imp__MessageBoxA@16:PTR pr4
MessageBox equ <_imp__MessageBoxA@16>
 
externdef _imp__PostQuitMessage@4:PTR pr1
PostQuitMessage equ <_imp__PostQuitMessage@4>
 
externdef _imp__RegisterClassExA@4:PTR pr1
RegisterClassEx equ <_imp__RegisterClassExA@4>
 
externdef _imp__ShowWindow@8:PTR pr2
ShowWindow equ <_imp__ShowWindow@8>
 
externdef _imp__UpdateWindow@4:PTR pr1
UpdateWindow equ <_imp__UpdateWindow@4>
 
externdef _imp__LoadCursorA@8:PTR pr2
LoadCursor equ <_imp__LoadCursorA@8>
 
externdef _imp__LoadIconA@8:PTR pr2
LoadIcon equ <_imp__LoadIconA@8>
 
externdef _imp__CreateWindowExA@48:PTR pr12
CreateWindowEx equ <_imp__CreateWindowExA@48>
 
externdef _imp__ExitProcess@4:PTR pr1
ExitProcess equ <_imp__ExitProcess@4>
 
externdef _imp__SetBkMode@8:PTR pr2
SetBkMode equ <_imp__SetBkMode@8>
 
externdef _imp__TranslateMessage@4:PTR pr1
TranslateMessage equ <_imp__TranslateMessage@4>
 
;     libraries
;     ~~~~~~~~~
      includelib \masm32\lib\masm32.lib
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
      includelib \masm32\lib\gdi32.lib
 
; #########################################################################
 
        ;=================
        ; Local prototypes
        ;=================
        WinMain          PROTO :DWORD,:DWORD,:DWORD,:DWORD
        WndProc          PROTO :DWORD,:DWORD,:DWORD,:DWORD
        Main             PROTO


В параметрах линкера data=text.

Я решил повторить их подвиг на фасме, и у меня ничего не получилось ни так:

1
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
format PE GUI 4.0
entry start
 
include '%include%\win32a.inc'
 
section         '.text' code readable executable
 
        start:
                invoke  MessageBox,0,_text,_capture,0
                invoke  ExitProcess,0
 
        _text           db              'Текст',0
        _capture        db              'Капча',0
 
        library         kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
 
        include         '%include%\API\kernel32.inc'
        include         '%include%\API\user32.inc'


ни так:

2
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
; fasm example of writing 32-bit PE program using Win32 API
 
format PE GUI
entry start
 
section '.code' code readable executable
 
CodeSectionOrigin:
 
  start:
        push    0
        push    _caption
 
        push    _message
        push    0
        call    [MessageBox]
  .local1:
        push    0
  .local2:
        call    [ExitProcess]
 
        jmp     .local1
 
DataSectionOrigin:
 
  _caption db 'Капча',0
  _message db 'Текст!',0
 
ImportSectionOrigin:
 
  dd 0,0,0,RVA kernel_name,RVA kernel_table
  dd 0,0,0,RVA user_name,RVA user_table
  dd 0,0,0,0,0
 
  kernel_table:
    ExitProcess dd RVA _ExitProcess
    dd 0
  user_table:
    MessageBox dd RVA _MessageBoxA
    dd 0
 
  kernel_name db 'KERNEL32.DLL',0
  user_name db 'USER32.DLL',0
 
  _ExitProcess dw 0
    db 'ExitProcess',0
  _MessageBoxA dw 0
    db 'MessageBoxA',0


Оба варианта запускаются, но через секунду-две выгружаются.

А как правильно засунуть импорты в секцию кода?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.08.2017, 17:23
Ответы с готовыми решениями:

Разместить секцию .const вплотную к секции .code
Между секцией .code и секцией .const разрыв в 16 байтов. Подсмотрено в оллидебугере. Можно ли его убрать?

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

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

4
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
25.08.2017, 17:49
mkostoevr, в masm1k есть секция импорта. Она не находится в коде. И весит она не 1, а 1.5 кб. По крайней мере, у меня так (со стандартными ключами).
Как прога компилится в 1 кб, какими командами иключами?
0
Незнайка
26 / 11 / 2
Регистрация: 14.10.2016
Сообщений: 373
Записей в блоге: 2
25.08.2017, 17:53  [ТС]
Jin X, странно... Вот мой "мейкбатник":

Bash
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
@echo off
 
if exist %1.obj del masm1k.obj
if exist %1.exe del masm1k.exe
 
: -----------------------------------------
: assemble masm1k.asm into an OBJ file
: -----------------------------------------
\MASM32\BIN\Ml.exe /c /coff masm1k.asm
if errorlevel 1 goto errasm
 
: -----------------------
: link the main OBJ file
: -----------------------
\MASM32\BIN\PoLink.exe /SUBSYSTEM:WINDOWS /merge:.data=.text masm1k.obj > nul
if errorlevel 1 goto errlink
dir masm1k.*
goto TheEnd
 
:errlink
: ----------------------------------------------------
: display message if there is an error during linking
: ----------------------------------------------------
echo.
echo There has been an error while linking this project.
echo.
goto TheEnd
 
:errasm
: -----------------------------------------------------
: display message if there is an error during assembly
: -----------------------------------------------------
echo.
echo There has been an error while assembling this project.
echo.
goto TheEnd
 
:TheEnd
 
pause
Добавлено через 1 минуту
Jin X, это из-за линкера polink?
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
25.08.2017, 18:09
Лучший ответ Сообщение было отмечено mkostoevr как решение

Решение

Ну тогда так:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
format PE GUI 4.0
entry start
 
include '%include%\win32a.inc'
 
        start:
                invoke  MessageBox,0,_text,_capture,0
                invoke  ExitProcess,0
 
        _text           db              'Текст',0
        _capture        db              'Капча',0
 
data import
        
        library         kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
 
        include         '%include%\API\kernel32.inc'
        include         '%include%\API\user32.inc'
 
end data
Добавлено через 1 минуту
Можно перед меткой start: добавить при желании...
Assembler
1
section '.text' code readable writeable
Добавлено через 41 секунду
1 кб создаёт polink и в .text засовывает импорт тоже он, т.к. обычный link так не делает.
1
Незнайка
26 / 11 / 2
Регистрация: 14.10.2016
Сообщений: 373
Записей в блоге: 2
25.08.2017, 18:10  [ТС]
Jin X, дело в линкере... понятно. Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.08.2017, 18:10
Помогаю со студенческими работами здесь

Как правильно составить файл импорта *.zdi для Бест-звита?
Народ!! Подскажите, как правильно составить файл импорта *.zdi для Бест-звита? Может, где-то кто-то встречал рабочий пример из нескольких...

Как правильно разместить?
Вопрос такой: имеется фон сайта... http://s53.***********/i141/0911/57/af5c49e0236a.jpg Нужно расположить например текст или...

Добавить секцию кода в исполняемый файл. Редактирование PE заголовка
Ребят, я уже не знаю что с ним сделать. Мне надо свой код добавить в чужой ехе-шник, а места не хватает, надо расширить секцию кода,...

Как правильно разместить статью?
Как правильно разместить статью чтобы был 1 Наибольший + ТИц 2 также эффект в выдаче? -- как ставить ссылки? может просто инфа...

Как правильно разместить оперативу?
Добрый день! Имеется материнская плата ASRock M3A770DE (http://www.asrock.com/mb/AMD/M3A770DE/index.ru.asp) с четырьмя модулями памяти на...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru