x64 syscall враппер

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sn0w, 16 Jan 2012.

  1. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    вообщем понадобилось написать фичу аля

    NTSTATUS ZwCallService(ULONG serviceNum, ...)

    т.е. вызов нт сервиса по его номеру, для х86 все ясно, но для 64 видел несколько кодесов, типа онион апи - но там гуано какоето.

    в итоге написал такое вот

    Code:
    ;
    ;	extern "C" NTSTATUS  ApiCallNtService(ULONG id, ...);
    ;
    
     ApiCallNtService	PROC
    		mov rax, rcx
    		mov rcx, rdx
    		mov rdx, r8
    		mov r8, r9
    		lea r9, [rsp+28h]
    		mov r9, [r9]		; FIXED: stack to register dereference forgotten
    		add rsp, 8
    		mov r10, rcx
    		syscall
    		sub rsp, 8
    		ret
     ApiCallNtService	ENDP
    собственно проблема в том что приходится значения регистров сдвигать по причине наличия переменной id в RCX и по сравнению с нормальным сисколлом - появляется лишний qword в стеке, изза чего я тупо делаю add rsp/sub rsp во время вызова. все работает но работает хреново, например NtClose на инвалидном хендле валится гдето в RtlCaptureContext, хотя ф-ии 6 параметров итд работают нормально. может у кого есть готовая идея?
     
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    я ошибаюсь,или стэк в х64 должен быть выровнен на 16 байт?
     
  3. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Зачем гадать?
    http://msdn.microsoft.com/en-us/library/ms235286.aspx
     
    _________________________
  4. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,021
    Likes Received:
    1,200
    Reputations:
    327
    проверил. на входе оригинальной NtClose и через гейт RSP mod 0x10 = 8, но никак не нулю. и одна валится а другая нет. видимо чето упустил
     
  5. m0us

    m0us New Member

    Joined:
    19 Jan 2012
    Messages:
    26
    Likes Received:
    3
    Reputations:
    -1
    не сбивайте с толку пацана, выравнивание тут ни при чем. дело в том что при сисколле параметры идут так:
    f(r10, rdx, r8, r9)...stack_vars; a в rcx syscall сохраняет retRIP

    т.е.:
    rax = service id
    r10 = param1
    rdx = param2
    r8 = param3
    r9 = param4
    [rsp+20h] = начало стековых переменных
    syscall
     
    #5 m0us, 21 Jan 2012
    Last edited: 21 Jan 2012