Функция GetLocalTime, использующая базовое программирование ядра ядра - PullRequest
0 голосов
/ 07 декабря 2018

Я выполняю упражнение «Создайте программу, которая будет предупреждать« Доброе утро »в 7:00 утра» в MASM32, используя основанное на ядре программирование, что означает, что мне нужно использовать структуру peb ».Я уже получил базовый адрес kernel32.dll, который я буду использовать при вызове API.Я также получил адрес API, который я собираюсь использовать, это GetLocalTime.

Моя проблема в последней части, где я буду вызывать функцию GetLocalTime для получения времени.Теперь я потерян в этой части, я не могу вызвать SYSTEMTIME, что важно в функции GetlocalTime.Любой совет?спасибо!

.386
.model flat, stdcall

OPTION CASEMAP:NONE

.data
stime dd ?
wHour dw ?

.code
Main:
    ;getting the kernel32 base address
    xor ecx, ecx
    ASSUME FS:NOTHING
    mov eax, fs:[ecx + 30H] ; EAX = PEB
    ASSUME FS:ERROR
    mov eax, [eax + 0CH]     ; EAX = PEB->Ldrs
    mov esi, [eax + 14H]    ; ESI = PEB->Ldr.InMemOrder
    lodsd                    ; EAX = Second module
    xchg eax, esi            ; EAX = ESI, ESI = EAX
    lodsd                    ; EAX = Third(kernel32)
    mov ebx, [eax + 10H]    ; EBX = Base address

    ;finding the export table of kernel32
    mov edx, [ebx + 3CH]    ; EDX = DOS->e_lfanew
    add edx, ebx             ; EDX = PE Header
    mov edx, [edx + 78H]    ; EDX = Offset export table
    add edx, ebx             ; EDX = Export table
    mov esi, [edx + 20H]    ; ESI = Offset namestable
    add esi, ebx             ; ESI = Names table
    xor ecx, ecx             ; EXC = 0
    ;start of getlocaltime function;
    ;Find GetLocalTime function name
    Get_Time:

    inc ecx                              ; Increment the ordinal
    lodsd                                ; Get name offset
    add eax, ebx                         ; Get function name
    cmp dword ptr[eax], 4C746547H       ; GetL
    jnz Get_Time
    cmp dword ptr[eax + 4H], 6C61636FH ; ocal
    jnz Get_Time
    cmp dword ptr[eax + 8H], 656D6954H ; Time
    jnz Get_Time

    ;Find the address of GetLocalTime function
    mov esi, [edx + 24H]                ; ESI = Offset ordinals
    add esi, ebx                         ; ESI = Ordinals table
    mov cx, [esi + ecx * 2]              ; Number of function
    dec ecx
    mov esi, [edx + 1CH]                ; Offset address table
    add esi, ebx                         ; ESI = Address table
    mov edx, [esi + ecx * 4]             ; EDX = Pointer(offset)
    add edx, ebx                         ; EDX = GetLocalTime

    ;Call GetLocalTime
    add esp, 14H            ; Cleanup stack
    push offset stime      ; offset of the address of hello is pushed in the stack memory
    call edx               ; getlocaltime nasa eax babagsak

    ;comparing
    push wHour
    cmp 00402001H.wHour, 37H

end Main

1 Ответ

0 голосов
/ 07 декабря 2018

SYSTEMTIME - это просто блок из 8 слов (16-битные целые числа);Вы можете выделить 8 слов и обратиться к Win32 для определения порядка полей.

...