Проблема с добавлением АСМ кода в готовое приложение

Тема в разделе "WASM.BEGINNERS", создана пользователем lvlcister, 18 апр 2008.

  1. lvlcister

    lvlcister New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    4
    Моё приветствие, Вам (с)

    Есть код:
    Код (Text):
    1. 00536F84   55                     push    ebp
    2. 00536F85   8BEC                   mov     ebp, esp
    3. 00536F87   51                     push    ecx
    4. 00536F88   53                     push    ebx
    5. 00536F89   8945FC                 mov     [ebp-$04], eax
    6. 00536F8C   8B45FC                 mov     eax, [ebp-$04]
    7. 00536F8F   8B9014040000           mov     edx, [eax+$0414]
    8. 00536F95   8B45FC                 mov     eax, [ebp-$04]
    9. 00536F98   E80B1B0000             call    00538AA8
    10. 00536F9D   33DB                   xor     ebx, ebx                    ;****
    11. 00536F9F   8AD8                   mov     bl, al                       ;****
    12. 00536FA1   85DB                   test    ebx, ebx                   ;****
    13. 00536FA3   7E4A                   jle     00536FEF                   ;****
    14. 00536FA5   8B45FC                 mov     eax, [ebp-$04]
    15. 00536FA8   8B9014040000           mov     edx, [eax+$0414]
    16. 00536FAE   8B45FC                 mov     eax, [ebp-$04]
    17. 00536FB1   8B80FC030000           mov     eax, [eax+$03FC]
    18. 00536FB7   8B8068020000           mov     eax, [eax+$0268]
    19. 00536FBD   E8BEB4EFFF             call    00432480
    20. 00536FC2   8B153CC74F00           mov     edx, [$004FC73C]
    21. 00536FC8   E85FC7ECFF             call    0040372C
    22. 00536FCD   BA00FF0000             mov     edx, $0000FF00
    23. 00536FD2   E8C593F6FF             call    004A039C
    24. 00536FD7   8B45FC                 mov     eax, [ebp-$04]
    25. 00536FDA   8B8014040000           mov     eax, [eax+$0414]
    26. 00536FE0   03C0                   add     eax, eax
    27. 00536FE2   8B15803A5500           mov     edx, [$00553A80]
    28. 00536FE8   8B12                   mov     edx, [edx]
    29. 00536FEA   881CC2                 mov     [edx+eax*8], bl
    30. 00536FED   EB32                   jmp     00537021
    31. 00536FEF   8B45FC                 mov     eax, [ebp-$04]
    32. 00536FF2   8B9014040000           mov     edx, [eax+$0414]
    33. 00536FF8   8B45FC                 mov     eax, [ebp-$04]
    34. 00536FFB   8B80FC030000           mov     eax, [eax+$03FC]
    35. 00537001   8B8068020000           mov     eax, [eax+$0268]
    36. 00537007   E874B4EFFF             call    00432480
    37. 0053700C   8B153CC74F00           mov     edx, [$004FC73C]
    38. 00537012   E815C7ECFF             call    0040372C
    39. 00537017   BAFF000000             mov     edx, $000000FF
    40. 0053701C   E87B93F6FF             call    004A039C
    из него нужно сделать:

    Код (Text):
    1. 55                     push    ebp
    2. 8BEC                   mov     ebp, esp
    3. 51                     push    ecx
    4. 53                     push    ebx
    5. 8945FC                 mov     [ebp-$04], eax
    6. 8B45FC                 mov     eax, [ebp-$04]
    7. 8B9014040000           mov     edx, [eax+$0414]
    8. 8B45FC                 mov     eax, [ebp-$04]
    9. E81F1B0000             call    00555F7C
    10. 33DB                   xor     ebx, ebx
    11. 8AD8                   mov     bl, al
    12.  
    13. 6891000000             push    $00000091
    14. E8BD2EEBFF             call    00407328
    15. 6683F801               cmp     ax, +$01
    16. 7505                   jnz     00554476
    17. BB01000000             mov     ebx, $00000001
    18.  
    19. 85DB                   test    ebx, ebx
    20. 7E4A                   jle     005544C4
    21. 8B45FC                 mov     eax, [ebp-$04]
    22. 8B9014040000           mov     edx, [eax+$0414]
    23. 8B45FC                 mov     eax, [ebp-$04]
    24. 8B80FC030000           mov     eax, [eax+$03FC]
    25. 8B8068020000           mov     eax, [eax+$0268]
    26. E8CDE2EDFF             call    00432764
    27. 8B15D44F5000           mov     edx, [$00504FD4]
    28. E892F2EAFF             call    00403734
    29. BA00FF0000             mov     edx, $0000FF00
    30. E89408F5FF             call    004A4D40
    31. 8B45FC                 mov     eax, [ebp-$04]
    32. 8B8014040000           mov     eax, [eax+$0414]
    33. 03C0                   add     eax, eax
    34. 8B15004D5700           mov     edx, [$00574D00]
    35. 8B12                   mov     edx, [edx]
    36. 881CC2                 mov     [edx+eax*8], bl
    37. EB32                   jmp     005544F6
    38. 8B45FC                 mov     eax, [ebp-$04]
    39. 8B9014040000           mov     edx, [eax+$0414]
    40. 8B45FC                 mov     eax, [ebp-$04]
    41. 8B80FC030000           mov     eax, [eax+$03FC]
    42. 8B8068020000           mov     eax, [eax+$0268]
    43. E883E2EDFF             call    00432764
    44. 8B15D44F5000           mov     edx, [$00504FD4]
    45. E848F2EAFF             call    00403734
    46. BAFF000000             mov     edx, $000000FF
    47. E84A08F5FF             call    004A4D40
    но в исходном фрагменте для
    Код (Text):
    1. 6891000000             push    $00000091
    2. E8BD2EEBFF             call    00407328
    3. 6683F801               cmp     ax, +$01
    4. 7505                   jnz     00554476
    5. BB01000000             mov     ebx, $00000001
    нет места, поэтому я сделал так:

    Код (Text):
    1. 00536F9D     E9 FE730100    JMP copy_tes.0054E3A0
    2. 00536FA2     90             NOP
    3. 00536FA3     90             NOP
    4. 00536FA4     90             NOP
    ----
    Код (Text):
    1. 0054E3A0     33DB           XOR EBX,EBX
    2. 0054E3A2     8AC3           MOV AL,BL
    3. 0054E3A4     90             NOP
    4. 0054E3A5     68 91000000    PUSH 91
    5. 0054E3AA     E8 698FEBFF    CALL <JMP.&user32.GetKeyState>
    6. 0054E3AF     66:83F8 01     CMP AX,1
    7. 0054E3B3    ^0F85 EC8BFEFF  JNZ copy_tes.00536FA5
    8. 0054E3B9     BB 01000000    MOV EBX,1
    9. 0054E3BE     85DB           TEST EBX,EBX
    10. 0054E3C0    ^0F8E 298CFEFF  JLE copy_tes.00536FEF
    11. 0054E3C6     90             NOP
    Подскажите что не так, пожалуйста,...ибо мой кусочек кода должен работать только при СкруллЛокк=Истина, а именно команда 0054E3B9 BB 01000000 MOV EBX,1, а она всегда выполняется

    зы\ сильно не ругайтесь, ибо несведущь, но пытлив
     
  2. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Посмотри внимательно описание возвращаемого значения функции GetKeyState.
    AX = 16 bit
     
  3. lvlcister

    lvlcister New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    4
    замена
    Код (Text):
    1. 0054E3AF     66:83F8 01     CMP AX,1
    на
    Код (Text):
    1.  0054E3AF     66:83F8 01     CMP AL,1
    исправляет ситуацию, но возврящает меня опять к проблеме того, что в модифицированном коде
    Код (Text):
    1. 0054E3C0    ^0F8E 298CFEFF  JLE copy_tes.00536FEF
    2. 0054E3C6     90                    NOP
    3. 0054E3C7     E92D8DFEFF       JMP 00536FA5
    ВСЕГДА осуществляется переход на 00536FEF, ибо в регистре EBX - 0, всегда...
     
  4. lvlcister

    lvlcister New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    4
    У меня есть подозрение, что добавление АСМ кода в уже существующее приложение моим методом не есть хорошо. так ли это? может есть более адекватный вариант?

    и еще,...я пробовал вынести всю процедуру
    Код (Text):
    1. 00536F84   55                     push    ebp
    по адресу 0054E24E, изменил все переходы на нее и вызовы, но приложение вылетает с Access Violation... пока не знаю почему
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    lvlcister
    Попробуй проверять биты AX (см. топик GMax), а не сравнивать AX с константой.
     
  6. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Посмотри как работают логические операции.

     
  7. lvlcister

    lvlcister New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2008
    Сообщения:
    4
    всем благодарность великая.

    ниже следующее работает:
    Код (Text):
    1. 0054E24E     55             PUSH EBP
    2. 0054E24F     8BEC           MOV EBP,ESP
    3. 0054E251     51             PUSH ECX
    4. 0054E252     53             PUSH EBX
    5. 0054E253     8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
    6. 0054E256     8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
    7. 0054E259     8B90 14040000  MOV EDX,DWORD PTR DS:[EAX+414]
    8. 0054E25F     8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
    9. 0054E262     E8 41A8FEFF    CALL copy_tes.00538AA8
    10. 0054E267     33DB           XOR EBX,EBX
    11. 0054E269     8AD8           MOV BL,AL
    12. 0054E26B     90             NOP
    13. 0054E26C     68 91000000    PUSH 91
    14. 0054E271     E8 A290EBFF    CALL <JMP.&user32.GetKeyState>
    15. 0054E276     3C 01          CMP AL,1
    16. 0054E278     75 06          JNZ SHORT copy_tes.0054E280
    17. 0054E27A     BB 01000000    MOV EBX,1
    18. 0054E27F     90             NOP
    19. 0054E280     85DB           TEST EBX,EBX
    20. 0054E282    ^0F8E 678DFEFF  JLE copy_tes.00536FEF
    21. 0054E288    ^E9 188DFEFF    JMP copy_tes.00536FA5
    22. 0054E28D     90             NOP
    Код (Text):
    1. 00536F84     E9 C5720100    JMP copy_tes.0054E24E
    2. 00536F89     90             NOP
    3. ...
    4. 00536F9F     90             NOP
    5. 00536FA0     E9 A9720100    JMP copy_tes.0054E24E