Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
MASM32

Получение адреса базы kernel32

25.08.2011, 19:37. Показов 4654. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Подскажите пожалуйста как получить базу kernel32. Точнее про то как её получить я читаю в статье [правила форума перечитайте], да только разобраться толком с этим не совсем получилось.
Если вам не трудно, прокомментируйте код. Особо непонятные места я отметил вопросами
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
.686
.model flat, stdcall
option casemap :none; теперь MASM32 начнёт различать регистры
 
.data
K32_Limit  equ     5;; почему именно 5??? может быть 50?
 
.code
 
    mov ESI, [ESP];в ESP находится адрес возврата (т.е. Call CreateProcess и call [ESP] - одно и то же
    ;?????????????????
    and ESI, 0FFFF0000h;получаем начало страницы из которой был вызван наш код
    
 
Start:
 test_:;почему нельзя сразу начать с метки delta???
        call    delta
 delta:
        pop     ebp;а где перед этим push? что мы из стэка выталкиваем
        sub     ebp,offset delta;зачем?
 
        mov     esi,[esp];в ESP находится адрес возврата (т.е. Call CreateProcess и call [ESP] - одно и то же
        ;?????????????????
        
        and ESI, 0FFFF0000h;получаем начало страницы из которой был вызван наш код (коммент автора)??????????????????????
        
        call    GetK32
 GetK32:
 
 __1:
        cmp     byte ptr [ebp+K32_Limit],00h;?????????????????
        jz      WeFailed
 
        cmp     word ptr [esi],"ZM"
        jz      CheckPE
 
 __2:
        sub     esi,10000h;????????????????? почему вычитаем 10 страниц
        dec     byte ptr [ebp+K32_Limit];логика? Зачем??????????????????
        jmp     __1
 CheckPE:
        mov     edi,[esi+3Ch];?????????????????
        add     edi,esi;?????????????????
        cmp     dword ptr [edi],"EP"
        jz      WeGotK32
        jmp     __2
 WeFailed:
        mov     esi,0BFF70000h;?????????????????
 WeGotK32:
        xchg    eax,esi;?????????????????
        ret
end Start
автор писал пример для TASM (ну почти одно и то же всё таки).

Вот привожу его текст
Простой способ получить адрес базы KERNEL32

Как вы знаете, когда мы запускаем приложением, код вызывается откуда-то из KERNEL32 (т.е. KERNEL делает вызов нашего кода), а потом, если вы помните, когда вызов сделан, адрес возврата лежит на стеке (адрес памяти в ESP). Давайте применим эти знания на практике:


;---[ CUT HERE ]-------------------------------------------------------------

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        .586p                           ; Бах... просто так
        .model  flat                    ; Хехехе, я люблю 32 бита
 
        .data                           ; Кое-какие данные (их требует
                                        ; TASM32/TLINK32)
 
        db      ?
 
        .code
 
 start:
        mov     eax,[esp]               ; Теперь EAX будет равен BFF8XXXXh
                                        ; (в w9X)
                                        ; т.е. где-то внутри API
                                        ; CreateProcess :)
        ret                             ; Возвраемся в него ;)
 end    start
;---[ CUT HERE ]-------------------------------------------------------------
Ок, это просто. У нас в EAX есть значение, примерно равно BFF8XXXX (XXXX не играет роли, нам не нужно знать его точно. Так как Win32-платформы обычно все огруляют до страницы, значит заголовок KERNEL32 находится в начале страницы, и мы можем легко найти его. А как только мы найдем заголовок PE, о котором я и веду речь, мы будем знать адрес KERNEL32. Хммм, наш лимит - 50h страниц. Хехе, не беспокойтесь, далее последует некоторый код .


;---[ CUT HERE ]-------------------------------------------------------------

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
        .586p
        .model  flat
 
 extrn  ExitProcess:PROC
 
        .data
 
 limit  equ     5
 
        db      0
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 ; Ненужные и несущественные данные :)                                       ;
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
        .code
 
 test:
        call    delta
 delta:
        pop     ebp
        sub     ebp,offset delta
 
        mov     esi,[esp]
        and     esi,0FFFF0000h
        call    GetK32
 
        push    00000000h
        call    ExitProcess
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 ; Грхм, я предполагаю, что вы, по крайней мере, нормальный asm-кодер, то   ;
 ; то есть знаете, что первый блок инструкций предназначается для получения ;
 ; дельта-смещения (хорошо, это не необходимо в данном примере, как бы то   ;
 ; ни было я хочу придать данному коду сходство с вирусом). Нам интересен   ;
 ; второй блок. Мы помещаем в ESI адрес, откуда было вызвано наше           ;
 ; приложение. Он находится в ESP (если мы, конечно, не трогали стек после  ;
 ; загрузки программы. Вторая инструкция, AND, получает начало страницы, из ;
 ; которой был вызван наш код. Мы вызываем нашу процедуру, после чего       ;
 ; прерываем процесс ;).                                                    ;
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
 GetK32:
 
 __1:
        cmp     byte ptr [ebp+K32_Limit],00h
        jz      WeFailed
 
        cmp     word ptr [esi],"ZM"
        jz      CheckPE
 
 __2:
        sub     esi,10000h
        dec     byte ptr [ebp+K32_Limit]
        jmp     __1
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 ; Сначала мы проверяем, не превысили ли мы лимит (50 страниц). После того, ;
 ; как мы находим страницу с сигнатурой 'MZ' в начале, ищем заголовок PE.   ;
 ; Если мы его не находим, то вычитае 10 страниц (10000h байтов), уменьшаем ;
 ; переменную лимита и ищем снова.                                          ;
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
 CheckPE:
        mov     edi,[esi+3Ch]
        add     edi,esi
        cmp     dword ptr [edi],"EP"
        jz      WeGotK32
        jmp     __2
 WeFailed:
        mov     esi,0BFF70000h
 WeGotK32:
        xchg    eax,esi
        ret
 
 K32_Limit      dw      limit
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 ; Мы получаем значение по смещению 3Ch из заголовка MZ (там содержится     ;
 ; RVA-адрес начала заголовка PE), потом соотносим его с адресом страницы,  ;
 ; и если адрес памяти, находящийся по данному смещению - метка PE, мы      ;
 ; мы считаем, что нашли то, что нужно... и это действительно так! ;)       ;
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
end     test
;---[ CUT HERE ]-------------------------------------------------------------
Рекомендация: я протестировал это у меня не было никаких проблем в Win98 и WinNT4 с установленным SP3, как бы то ни было, так как я не знаю, что может произойти, я советую вам использовать SEH, чтобы избежать возможных ошибок и синего экрана. SEH будет объяснен в последующих уроках. Хех, этот метод использовал Lord Julus в своих туториалах (для поиска GetModuleHandleA в зараженных файлах), что не очень эффективно для моих нужд, как бы то ни было, я покажу собственную версию этого кода, где объясню, что можно сделать с импортами. Например, это можно использовать в пер-процессных (per-process) резидентных вирусах с небольшими изменениями в процедуре .
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2011, 19:37
Ответы с готовыми решениями:

Поиск адреса функции в ядре kernel32
Billy Belcedu пишет что 1 получив номер функции(хранится в ecx) нам надо по этому номеру умноженному на 2 + RVA таблицы ординалов ...

Отличие между kernel32.lib и kernel32.dll
Объясните пожалуйста в чем отличие между kernel32.lib и kernel32.dll

Не могу импортировать kernel32.inc и kernel32.lib
Здравствуйте. Подскажите мне насчёт импорта библиотеки в программу. Пишу на FASM. include 'C:\FASM\INCLUDE\API\KERNEL32.INC' ...

10
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
25.08.2011, 21:09
Загнал в отладчик - программа не работает.
Я выдирал адрес базы и адреса функций LoadLibrary и GetProcAddress так:
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
format PE GUI 4.0
entry start
 
include 'include\win32a.inc'
 
;Секция кода
section '.text' code readable writeable executable
 
start:  pushad
    call gbase
gbase:  pop ebp
    add ebp,dat-gbase
    jmp dword start1
dat:
oep dd 401000h
p   db 'GetProcAddress',0
l   db 'LoadLibraryA',0
LoadLibrary dd 0
GetProcAddress  dd 0
functions   dd freelib-dat,ter-dat
numfunctions    =($-functions)/4
hmodule dd 0
 
FreeLibrary dd 0
ExitProcess dd 0
kernel  db 'kernel32.dll',0
 
freelib db 'FreeLibrary',0
ter db 'ExitProcess',0
 
start1: xor eax,eax
    mov eax, [fs:eax] ; Указатель на список обработчиков
    inc eax ; Увеличиваем eax на 1
next_seh:xchg eax, ebx ; Обмениваем содержимое eax c ebx
    mov eax, [ebx-1] ; Номер текущего обработчика
    inc eax ; Увеличиваем eax на 1
    jnz next_seh ; Является ли он системным (-1)?
    mov edx, [ebx-1+4] ; Адрес обработчика
    xchg ax, dx ; Эквивалентно xor dx,dx (eax=0)
    xor eax,eax ; Обнуляем eax
    mov ax,1001h ; Помещаем в eax
    dec ax ; 1000
next_block:
    cmp [edx],word 5a4dh ; Начало?
    je found_MZ ; ДА!
    sub edx,eax ; Ищем дальше
    jmp next_block
found_MZ:
    mov ebx,edx ; Сохраним указатель
    mov edi,[edx+3Ch] ; Адрес PE заголовка
    add edi,edx ; +Адрес kernel'a
    cmp [edi],word 4550h ; Проверка на PE
    jne ex1 ; Не равно - выходим
    mov ebx,edx ; Сохраним указатель
    mov edi,[edx+3Ch] ; Адрес PE заголовка
    add edi,edx ; +Адрес kernel'a
    cmp [edi],word 4550h ; Проверка на PE
    jne ex1 ; Не равно - выходим
 
    add ebx,[edi+78h] ; Получим адрес таблицы эксп.
    mov ecx,[ebx+18h] ; Количество указателей
    mov esi,[ebx+20h] ; Указатель на таблицу указателей имен
    add esi,edx ; Адр. таблицы имен в памяти
fndstr: lodsd ; Берем указатель из таблицы указателей
    add eax,edx ; Получаем адрес памяти
    xchg esi,eax ; В esi указетль на имя найденной ф-ции
    push ecx ; Кладём ecx в стэк
    mov ecx,15
    lea edi,[p+ebp-dat]
    repe cmpsb ; Сравниваем
    test ecx,ecx
    pop ecx
    xchg esi,eax
    jz r1
    loop fndstr
r1:     mov edi,[ebx+24h] ; Указатель на таблицу ординалов
    add edi,edx
    sub ecx,[ebx+18h]
    neg ecx
    movzx eax, word [ecx*2+edi]
    mov esi,[ebx+1ch]
    add esi,edx
    mov eax,[esi+eax*4]
    add eax,edx
    mov [GetProcAddress+ebp-dat],eax
    lea ecx,[l+ebp-dat]
    stdcall [GetProcAddress+ebp-dat],edx,ecx
    mov [LoadLibrary+ebp-dat],eax
    lea eax,[kernel+ebp-dat]
    stdcall [LoadLibrary+ebp-dat],eax
    mov [hmodule+ebp-dat],eax
    lea esi,[functions+ebp-dat]
    lea edi,[FreeLibrary+ebp-dat]
    mov ebx,numfunctions
@@: lodsd
    add eax,ebp
    stdcall [GetProcAddress+ebp-dat],[hmodule+ebp-dat],eax
    stosd
    dec ebx
    jnz @b
;Инициализация выхода
    mov eax,[ExitProcess+ebp-dat]
    lea ecx,[j2+4+ebp-dat]
    sub eax,ecx
    mov [j2+ebp-dat],eax
 
 
    stdcall [FreeLibrary+ebp-dat],[hmodule+ebp-dat]
    jmp exit
 
return:
    mov eax,[oep+ebp-dat]
    lea ecx,[j+4+ebp-dat]
    sub eax,ecx
    mov [j+ebp-dat],eax
    popad
    db 0e9h
j:  dd 0
 
exit:   popad
    push 0
    db 0e8h
j2: dd 0
 
 
ex1:    popad
    ret
Остальные можно получить при помощи этих двух. Код полностью адресо независим, то есть, если его выполнить в области памяти с атрибутами, разрешающими чтение, запись и выполнение, он сам найдет себе все, что нужно
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
25.08.2011, 21:24  [ТС]
alexcoder, ты в FASM что ли писал? просто я на MASM писал

Добавлено через 2 минуты
alexcoder, ты можешь рассказать для куаких целей компилятор использует регистры ESI, ESP, EBP?
Насколько я знаю ESI - адрес возврата из процедуры
EBP - указатель на то где локальные переменные находятся в стэке? хотя я малость криво понял.
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
25.08.2011, 21:25
Я тоже использую MASM, но для данного я взял часть кода определения базы kernel32(закомментированный код), он был на fasm, проще было продолжить
Тот код у меня не работает (скомпилируй и посмотри в отладчике). У меня в EBP помещается адрес данных в коде. Увидеть это можно в отладчике, на пальцах объяснить не могу.
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
11.01.2012, 19:19  [ТС]
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
.586p
.model flat
option casemap:none
 
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
 
.data   
    limit               DB              0D7h
    YPA                 DB              "Ура! Адрес найден!",0
    for_wsprintf        DB              "%s",0
    strOutput           DB              100 dup (0)
.code
_start:
    mov EAX, [ESP];получаем адрес вызова функции CreateProcess внутри Kernel32
    _test:
        call _delta; здесь сохраняется ESP
    _delta:
        pop EBP;меняются значения EBP и ESP
        sub EBP, offset _delta
        mov ESI, [ESP];в ESP находится адрес вершины стэка, в котором находится адрес вызова программы
        and ESI, 00FFFF0000h;переходим на начало страницы
        call _GetK32
    
    
    _GetK32:
        _1:
            cmp limit,0
                jz WeFailed
            
            cmp word ptr [ESI], "ZM"
                jz _CheckPE
        _2:
            sub ESI, 01000h;так как адрес загрузки dll выровнен на 10h страниц
            dec limit
        _CheckPE:
            mov EDI,[ESI+3Ch];в EDI записываем RVA-адрес PE-заголовка
            add EDI, ESI;далее - получаем виртуальный адрес PE_заголовка
            cmp word ptr [EDI], "EP"
            jz _WeGotKernel32
            jmp _2
        _WeGotKernel32:
            invoke wsprintf, offset strOutput, for_wsprintf, EDI
            invoke MessageBox, 0, offset strOutput,offset YPA,1
        
        WeFailed:   
        push 0
        call ExitProcess
end _start
Только у меня MASM32 миллион ошибок выдаёт. Такого еще не было!
Code
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
Microsoft Windows [Version 6.1.7600]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.
 
C:\Users\Dimarik>cd c:/masm32/bin
 
c:\masm32\bin>ml /c /coff takekernelladdress.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.
 
 Assembling: takekernelladdress.asm
\masm32\include\windows.inc(53) : error A2119: language type must be specified
\masm32\include\windows.inc(54) : error A2119: language type must be specified
\masm32\include\windows.inc(55) : error A2119: language type must be specified
\masm32\include\windows.inc(56) : error A2119: language type must be specified
\masm32\include\windows.inc(57) : error A2119: language type must be specified
\masm32\include\windows.inc(58) : error A2119: language type must be specified
\masm32\include\windows.inc(59) : error A2119: language type must be specified
\masm32\include\windows.inc(60) : error A2119: language type must be specified
\masm32\include\windows.inc(61) : error A2119: language type must be specified
\masm32\include\windows.inc(62) : error A2119: language type must be specified
\masm32\include\windows.inc(63) : error A2119: language type must be specified
\masm32\include\windows.inc(64) : error A2119: language type must be specified
\masm32\include\windows.inc(65) : error A2119: language type must be specified
\masm32\include\windows.inc(66) : error A2119: language type must be specified
\masm32\include\windows.inc(67) : error A2119: language type must be specified
\masm32\include\windows.inc(68) : error A2119: language type must be specified
\masm32\include\windows.inc(69) : error A2119: language type must be specified
\masm32\include\windows.inc(70) : error A2119: language type must be specified
\masm32\include\windows.inc(71) : error A2119: language type must be specified
\masm32\include\windows.inc(72) : error A2119: language type must be specified
\masm32\include\windows.inc(73) : error A2119: language type must be specified
\masm32\include\windows.inc(74) : error A2119: language type must be specified
\masm32\include\windows.inc(75) : error A2119: language type must be specified
\masm32\include\windows.inc(76) : error A2119: language type must be specified
\masm32\include\windows.inc(77) : error A2119: language type must be specified
\masm32\include\user32.inc(13) : error A2119: language type must be specified
\masm32\include\user32.inc(14) : error A2119: language type must be specified
\masm32\include\user32.inc(15) : error A2119: language type must be specified
\masm32\include\user32.inc(16) : error A2119: language type must be specified
\masm32\include\user32.inc(17) : error A2119: language type must be specified
\masm32\include\user32.inc(19) : error A2119: language type must be specified
\masm32\include\user32.inc(22) : error A2119: language type must be specified
\masm32\include\user32.inc(23) : error A2119: language type must be specified
\masm32\include\user32.inc(24) : error A2119: language type must be specified
\masm32\include\user32.inc(25) : error A2119: language type must be specified
\masm32\include\user32.inc(26) : error A2119: language type must be specified
\masm32\include\user32.inc(27) : error A2119: language type must be specified
\masm32\include\user32.inc(28) : error A2119: language type must be specified
\masm32\include\user32.inc(29) : error A2119: language type must be specified
\masm32\include\user32.inc(32) : error A2119: language type must be specified
\masm32\include\user32.inc(33) : error A2119: language type must be specified
\masm32\include\user32.inc(36) : error A2119: language type must be specified
\masm32\include\user32.inc(37) : error A2119: language type must be specified
\masm32\include\user32.inc(38) : error A2119: language type must be specified
\masm32\include\user32.inc(41) : error A2119: language type must be specified
\masm32\include\user32.inc(42) : error A2119: language type must be specified
\masm32\include\user32.inc(43) : error A2119: language type must be specified
\masm32\include\user32.inc(44) : error A2119: language type must be specified
\masm32\include\user32.inc(45) : error A2119: language type must be specified
\masm32\include\user32.inc(48) : error A2119: language type must be specified
\masm32\include\user32.inc(51) : error A2119: language type must be specified
\masm32\include\user32.inc(52) : error A2119: language type must be specified
\masm32\include\user32.inc(53) : error A2119: language type must be specified
\masm32\include\user32.inc(56) : error A2119: language type must be specified
\masm32\include\user32.inc(57) : error A2119: language type must be specified
\masm32\include\user32.inc(60) : error A2119: language type must be specified
\masm32\include\user32.inc(63) : error A2119: language type must be specified
\masm32\include\user32.inc(64) : error A2119: language type must be specified
\masm32\include\user32.inc(65) : error A2119: language type must be specified
\masm32\include\user32.inc(68) : error A2119: language type must be specified
\masm32\include\user32.inc(71) : error A2119: language type must be specified
\masm32\include\user32.inc(72) : error A2119: language type must be specified
\masm32\include\user32.inc(75) : error A2119: language type must be specified
\masm32\include\user32.inc(78) : error A2119: language type must be specified
\masm32\include\user32.inc(79) : error A2119: language type must be specified
\masm32\include\user32.inc(82) : error A2119: language type must be specified
\masm32\include\user32.inc(85) : error A2119: language type must be specified
\masm32\include\user32.inc(86) : error A2119: language type must be specified
\masm32\include\user32.inc(87) : error A2119: language type must be specified
\masm32\include\user32.inc(90) : error A2119: language type must be specified
\masm32\include\user32.inc(93) : error A2119: language type must be specified
\masm32\include\user32.inc(94) : error A2119: language type must be specified
\masm32\include\user32.inc(95) : error A2119: language type must be specified
\masm32\include\user32.inc(96) : error A2119: language type must be specified
\masm32\include\user32.inc(97) : error A2119: language type must be specified
\masm32\include\user32.inc(98) : error A2119: language type must be specified
\masm32\include\user32.inc(99) : error A2119: language type must be specified
\masm32\include\user32.inc(100) : error A2119: language type must be specified
\masm32\include\user32.inc(101) : error A2119: language type must be specified
\masm32\include\user32.inc(102) : error A2119: language type must be specified
\masm32\include\user32.inc(104) : error A2119: language type must be specified
\masm32\include\user32.inc(105) : error A2119: language type must be specified
\masm32\include\user32.inc(106) : error A2119: language type must be specified
\masm32\include\user32.inc(107) : error A2119: language type must be specified
\masm32\include\user32.inc(110) : error A2119: language type must be specified
\masm32\include\user32.inc(111) : error A2119: language type must be specified
\masm32\include\user32.inc(112) : error A2119: language type must be specified
\masm32\include\user32.inc(113) : error A2119: language type must be specified
\masm32\include\user32.inc(115) : error A2119: language type must be specified
\masm32\include\user32.inc(118) : error A2119: language type must be specified
\masm32\include\user32.inc(119) : error A2119: language type must be specified
\masm32\include\user32.inc(120) : error A2119: language type must be specified
\masm32\include\user32.inc(121) : error A2119: language type must be specified
\masm32\include\user32.inc(124) : error A2119: language type must be specified
\masm32\include\user32.inc(125) : error A2119: language type must be specified
\masm32\include\user32.inc(128) : error A2119: language type must be specified
\masm32\include\user32.inc(129) : error A2119: language type must be specified
\masm32\include\user32.inc(132) : error A2119: language type must be specified
\masm32\include\user32.inc(133) : error A2119: language type must be specified
\masm32\include\user32.inc(134) : error A2119: language type must be specified
\masm32\include\user32.inc(134) : fatal error A1012: error count exceeds 100; st
opping assembly
 
c:\masm32\bin>
как исправить?
0
14 / 13 / 1
Регистрация: 30.09.2011
Сообщений: 160
11.01.2012, 20:42
Dimarik__, обратитесь на wasm-там быстрее вам обьяснят=) это не реклама,это дружеский совет. и кстати,не вставляйте код из FASM'a в MASM-там немного разные приколы)
1
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
11.01.2012, 20:50
нужно указать соглашение вызовов:
Assembler
1
.model flat,stdcall
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
13.01.2012, 21:40  [ТС]
Цитата Сообщение от X-Cod Посмотреть сообщение
Dimarik__, обратитесь на wasm-там быстрее вам обьяснят=)
Можно вопрос? Почему?=)
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
13.01.2012, 21:47
Цитата Сообщение от Dimarik__ Посмотреть сообщение
Можно вопрос? Почему?=)
очевидно человек считает, что тут недостаточно хорошие специалисты)
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
14.01.2012, 04:47
vital792, уровень вопросов здесь и на ВАСМ разный, там сайт посвящен низкоуровневому программированию, а здесь 95% сообщений это -- требования ленивых студентов написать за них программы
1
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
14.01.2012, 17:21  [ТС]
Цитата Сообщение от Mikl___ Посмотреть сообщение
vital792, уровень вопросов здесь и на ВАСМ разный, там сайт посвящен низкоуровневому программированию, а здесь 95% сообщений это -- требования ленивых студентов написать за них программы
ахахах!!! Как хорошо помечено, особенно слово "Требования"!!!!!!!! +10000

Добавлено через 16 минут
Какая-то глупая ошибка возникла с вызовом функции wsprintf.
Самое главное, адрес нашёл, а функцию вызвать не смог(((((((
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
.586p
.model flat,stdcall
option casemap:none
 
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
 
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
 
 
.data   
    limitForSearch      DB              0D7h
    YPA                 DB              "Ура! Адрес найден!",0
    for_wsprintf        DB              "%s",0
    strOutput           DB              100 dup (0)
.code
_start:
    mov EAX, [ESP];получаем адрес вызова функции CreateProcess внутри Kernel32
    _test:
        call _delta; здесь сохраняется ESP
    _delta:
        pop EBP;меняются значения EBP и ESP
        sub EBP, offset _delta
        mov ESI, [ESP];в ESP находится адрес вершины стэка, в котором находится адрес вызова программы
        and ESI, 00FFFF0000h;переходим на начало страницы
        call _GetK32
    
    
    _GetK32:
        _1:
            cmp limitForSearch,0
                jz _WeFailed
            
            cmp word ptr [ESI], "ZM"
                jz _CheckPE
            _2:
            sub ESI, 01000h;так как адрес загрузки dll выровнен на 10h страниц
            dec limitForSearch
            jmp _1
        _CheckPE:
            mov EDI,[ESI+3Ch];в EDI записываем RVA-адрес PE-заголовка
            add EDI, ESI;далее - получаем виртуальный адрес PE_заголовка
            cmp word ptr [EDI], "EP"
            jz _WeGotKernel32
            jmp _2
        _WeGotKernel32:
            invoke wsprintf, offset strOutput, for_wsprintf, EDI
            invoke MessageBox, 0, offset strOutput,offset YPA,1
        
        _WeFailed:  
        push 0
        call ExitProcess
end _start
и ещё. у меня вопрос. Почему-то автор писал что в качестве счётчика нужно использовать 50h (просматриваем только 50h страниц). Но почему?
Я с помощью поиска нашёл библиотеку kernel32.dll, посмотрел её размер, он оказался равным857 кб.А это D6400h байт.А если MASM за одну страницу считает 1000h байт, то нужно будет просмотреть 0D7h страниц, но не 50. Почему в качестве счётчика было взято меньшее число? Именно 050h, а не 049h, не 041h и не какое-нибудь другое?

Добавлено через 2 часа 42 минуты
всё))разобрался)) я offset забыл))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.01.2012, 17:21
Помогаю со студенческими работами здесь

Корректное получение адреса элемента
Имеется следующие задание: Дан массив A из 16 байтов. Скопировать его в массив B, заменяя числа, большие –3, единицами. Сосчитать...

Получение относительного адреса по физическому
Известна Формула вычисления физического адреса по сегменту и смещению: Физ_адр = (сегмент * 10h) + смещение Простите за дилетантский...

Получение MAC адреса из IP адреса
Доброго времени суток, форумчане! Скажите, пожалуйста, как получить MAC адрес из IP адреса на C# в Windows Form? IP адрес я...

Не удаляется kernel32.dll (надо заменить устаревший файл kernel32.dll на новый из sp3)
У меня стоит WinXP sp2. Мне надо заменить устаревший файл kernel32.dll на новый из sp3. Я зашел в безопасном режиме и от имени...

Получение IP адреса (Си)
Есть ли функция или библиотека для С для определения своего реального интернет IP адреса? Или может есть сервис?


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru