Nasm - недопустимый КОНТЕКСТ после вызова GetThreadContext - PullRequest
0 голосов
/ 23 сентября 2019

Я пишу PePacker для win32 и при этом обнаружил, что получаю недопустимый CONTEXT из GetThreadContext.

...
push PINFO                                    ; PROCESS_INFORMATION struct (null initialized)
push STINFO                                   ; STARTUPINFO struct (null initialized)
push 0
push 0
push CREATE_SUSPENDED
push 0
push 0
push 0
push 0
push filepointer                              ; Program file name
call [CreateProcessA]                         ; GetLastError returns 0
cmp eax, 0
jz ending

mov eax, [PINFO+4]                            ; Pinfo.hThread
push eax
call [ResumeThread]                           ; GetLastError returns 0

push 4h                                       ; PAGE_READWRITE
push 1000h                                    ; MEM_COMMIT
push 4h                                       ; sizeof(PCONTEXT)
push 0
call [VirtualAlloc]                           ; GetLastError returns 0

mov [ptrCtx], eax
mov ebx, CONTEXT_FULL
mov [eax], ebx
push eax
mov ebx, [PINFO+4] 
push ebx
call [GetThreadContext]                       ; GetLastError returns 0 but the values of the Context do not fit
cmp eax, 0
jz ending

mov ebx, [ptrCtx]
mov eax, [ebx+56]                             ; CTX.Ebx

push eax                                      ; all below for Testing purpose
push prStr                                    ; prStr = "%d\n"
call [printf]                                 ; prints 0 which is odd because CTX->Ebx should contain an address
pop ecx                                       ;
pop ecx                                       ;
...

Следующие ReadProcessMemory функции GetLastError call return 299, что, вероятно, вызвано ошибочными CONTEXT записями.

Помощь приветствуется.

1 Ответ

1 голос
/ 27 сентября 2019

Изменить режим адресации с [PINFO+4] на

mov ebx, [Pinfo]
mov eax, [ebx+4]
push eax

В GetThreadContext и ResumeThread.

...