Assembleur: Obtenir les paramètres WinMain de Win32
-
07-11-2019 - |
Question
J'ai besoin d'accéder au WinMain
Paramètres à l'aide de l'assemblage, mais je ne semble pas pouvoir le faire malgré le fait que je sache soi-disant où ils se trouvent dans la pile (DWORD Offsets 0 à 16 et 0 à 20 lors de la poussée d'EBP avant les opérations). Ci-dessous, il y a un exemple pour montrer le lpszCmdline
chaîne qui contient le ligne de commande du programme, mais il semble toujours contenir 0, donc rien n'est affiché. Si j'essaie d'utiliser d'autres arguments dans le code d'assemblage, aucun pointeur de chaîne valide ne semble être présent et / ou le programme se bloque, comme prévu.
;[esp+20]==nCmdShow
;[esp+16]==lpszCmdLine
;[esp+12]==0 in win32
;[esp+8]==hInst
;[esp+4]==EIP
;[esp+0]==EBP
push ebp
mov ebp,esp
mov eax,[ebp+16]
push dword 0x00001030 ;UINT uType
push eax ;LPCTSTR lpCaption
push eax ;LPCTSTR lpText
push dword 0 ;HWND hWnd
call dword[MessageBoxA@USER32.DLL]
pop ebp
Cependant, si j'utilise GetCommandLine
Je peux obtenir un pointeur valide vers la chaîne de ligne de commande, et il s'affiche.
call dword[GetCommandLineA@KERNEL32.DLL]
push dword 0x00001030 ;UINT uType
push eax ;LPCTSTR lpCaption
push eax ;LPCTSTR lpText
push dword 0 ;HWND hWnd
call dword[MessageBoxA@USER32.DLL]
Où est l'erreur dans le premier bloc de code? De quoi ai-je besoin pour obtenir les paramètres et être en mesure d'implémenter mon propre code pour renvoyer un pointeur valide vers lpszCmdLine
juste comme GetCommandLine
Et en conséquence, à l'autre WinMain
paramètres? Si je ne peux pas obtenir le pointeur de ligne de commande de la pile, alors je ne pourrai probablement pas obtenir les autres paramètres, comme nCmdShow
, pour d'autres initialisations importantes.
Veuillez me faire savoir si vous avez besoin de plus de code que le fourni ci-dessus. S'il vous est utile de le savoir, je n'ai utilisé aucun linker mais entièrement la génération d'EXE manuelle (fait-il n'importe quel Différence de WinMain
, comme d'autres paramètres de pile?), Mais en gros, c'est juste un programme pour lequel Windows appelle automatiquement son point d'entrée et ce qui précède serait les 2 options différentes de quel programme il contiendrait.
Pas de solution correcte