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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top