Кресты / Говнокод #6075 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
BOOL NAKED CompareCurrentProcess(PCHAR pszName)
{
    /*
        1. Found PEB
        2. Found _RTL_USER_PROCESS_PARAMETERS
        3. Found _RTL_USER_PROCESS_PARAMETERS->ImagePathName
        4. Convert UNICODE to ANSI
        5. compare strings
    */
    __asm {
        MOV        ESI,ESP                            // SAVE STACK PTR

        MOV        EAX,DWORD PTR FS:[0x30]            // eax == PEB
        MOV        EAX,DWORD PTR DS:[EAX+0x10]        // eax == _RTL_USER_PROCESS_PARAMETERS
        ADD        EAX,0x38                        // eax == _RTL_USER_PROCESS_PARAMETERS->ImagePathName
        
        XOR        EDX,EDX                            //
        XOR        ECX,ECX                            //
        XOR        EDI,EDI                            //
                
        MOV        CL, BYTE PTR [EAX]                // CL = UNICODE_STRING.Length in bytes
        
        SUB        ESP,ECX                            // reserve in stack CL bytes 
                    
        ADD        EAX,4                            // EAX ptr to WCHAR ImagePathName
        MOV        EAX,DWORD PTR [EAX]                // EAX = PWCHAR

next_char:
        CMP        CL,0                            // WCHAR end
        JZ        end;

        MOV        DL,BYTE PTR [EAX]                // DL == *(PCHAR)WCHAR
        ADD        EAX,2                            // GOTO next WIDEchar
        MOV        BYTE PTR [ESP],DL                // SAVE char in memory reserved in stack
        INC        ESP                                // pStr++
        INC        EDI                                // pStrLen++
        SUB        CL,2                            // Length--;
        jmp        next_char                        // goto_next;
end:
        MOV        BYTE PTR [ESP],0                // *pStr = 0; null terminated
        SUB        ESP,EDI                            // pStr = (PCHAR)(pStr - pStrLen)
        
        XOR        EDX,EDX
        XOR        ECX,ECX

        mov        ecx,esp                            // ecx = pStr
        mov        edx,esp                            // edx = pStr

        //
        // HERE FOUND image file name 
m_loop:
        cmp        edi,0
        jz        file_founded

        cmp        byte ptr [edx],0x5C                // '\'
        JZ        founded;
        inc        edx
        dec        edi
        jmp        m_loop

founded:
        dec        edi
        mov        ecx,edx
        inc        edx
        jmp        m_loop

file_founded:
        push    esi
        inc        ecx
        push    ecx
        push    dword ptr [esi+4]
        call    my_strcmp

        pop        esi
        mov        esp,esi

        ret        
    }
}

Источник: http://www.wasm.ru/forum/viewtopic.php?id=40652
Что может быть плохого в функции кроме того, что эту задачу можно было бы решить тонной адекватных вариантов?

Запостил: ReL ReL, (Updated )

Комментарии (16) RSS

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8