使用Win内核基础编程的GetLocalTime函数

时间:2018-12-07 03:47:07

标签: api assembly masm32

我正在使用基于内核的编程在MASM32中进行“创建一个将在上午7:00提醒“早上好”的程序”活动,这意味着我需要使用peb结构。我已经有了kernel32.dll的基地址,可以在调用API时使用。我还获得了要使用的API Im的地址,即GetLocalTime。

我的问题是最后一部分,我将调用GetLocalTime函数获取时间。现在我迷失了这一部分,我无法调用在GetlocalTime函数中很重要的SYSTEMTIME。有什么建议吗?谢谢!

.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 :(得分:0)

SYSTEMTIME只是8个字的块(16位整数);您可以分配8个单词,并参考Win32的字段顺序。