почумута не работает CreateThread

Discussion in 'WASM.BEGINNERS' started by goga2007, Jun 4, 2007.

  1. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    ..все компилируется без проблемм, но функция не создает тред с моей процедурой, посмотрите пожалуйста,кто распологает временем:
    Code (Text):
    1. Main:
    2.  
    3.         push    threadID 0 0 thrd 0 0
    4.         call    dword[CreateThread]         ;в переменной CreateThread лежит адрес одноименной ф-ции
    5.         push    eax
    6.         call    dword[CloseHandle]           ; the same
    7.  
    8.  
    9.   thrd:
    10.         mov     esi,findMZ
    11.   .lop: cmp     esi,Main
    12.         jae     .finish
    13.         mov     eax,dword[esi]
    14.         xor     eax,eax
    15.         mov     dword[esi],eax
    16.         add     esi,4
    17.         jmp     .lop
    18.   .finish:
    19.         ret
    это отрывок на ФАСМЕ.
    постигаю азы криптографии %)))
     
  2. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    Кстати, надо делать в thrd не ret, а Ret 4, потому что передается 1 параметр и тип вызова stdcall
    это к слову.

    Насчет CreateThread: покажи как определен threadID
    И лучше используй макрос invoke раз уж на то пошло..
     
  3. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    ThreadID определен простой переменной. я все переменные и данные определил в секции кода(чтоб меньше места занимал):
    Code (Text):
    1. format PE GUI
    2. findMZ:
    3.         pop     eax
    4.         push    eax
    5.         and     eax,0ffff0000h
    6.  compare:
    7.         cmp     word[eax],5A4Dh
    8.         jz      findExport
    9.         sub     eax,10000h
    10.         jmp     compare
    11.  
    12. findExport:
    13.         mov     ebx,eax
    14.         add     eax,3ch
    15.         mov     eax,dword[eax]
    16.         add     eax,ebx
    17.         add     eax,78h
    18.         mov     eax,dword[eax]                  ;rva of export table
    19.         add     eax,ebx                         ;address of export table
    20.         add     eax,1ch
    21.         call    GetAddr                         ;stack=vaAddressTable
    22.         add     eax,4
    23.         call    GetAddr                         ;stack=vaNamesTable(address of the first name)
    24.         add     eax,4
    25.         call    GetAddr                         ;stack=vaOrdinalsTable
    26.         jmp     findLoadLibraryA
    27.  
    28.  GetAddr:
    29.         pop     edx
    30.         mov     esi,dword[eax]
    31.         add     esi,ebx
    32.         push    esi
    33.         push    edx
    34.         ret
    35.  
    36. findLoadLibraryA:
    37.         mov     eax,dword[esp+4]                ;eax=va of address of the first name
    38.         mov     dword[myFunc],LoadLibraryA
    39.         mov     ecx,0ch
    40.         call    findingAPI
    41.         mov     dword[LoadLibraryA],eax
    42.         mov     dword[myFunc],CreateThread
    43.         mov     eax,dword[esp+4]
    44.         mov     ecx,0ch
    45.         call    findingAPI
    46.         mov     dword[CreateThread],eax
    47.         mov     eax,dword[esp+4]
    48.         mov     dword[myFunc],CloseHandle
    49.         mov     ecx,0bh
    50.         call    findingAPI
    51.         mov     dword[CloseHandle],eax
    52.  
    53.  
    54. findGetProcAddress:
    55.         mov     eax,dword[esp+4]
    56.         mov     dword[myFunc],GetProcAddress
    57.         mov     ecx,0eh
    58.         push    GPA
    59.  
    60.     findingAPI:
    61.         push    ecx
    62.         mov     dword[addrName],eax
    63.         xor     edx,edx
    64.         cld
    65.      next:
    66.         mov     eax,dword[eax]
    67.         add     eax,ebx
    68.         mov     esi,eax
    69.         mov     edi,dword[myFunc]
    70.         repe    cmpsb
    71.         jne     .notequal
    72.  
    73.         shl     edx,1                           ;begining of getting addressAPI
    74.         add     edx,dword[esp+8]
    75.         xor     eax,eax
    76.         mov     ax,word[edx]
    77.         shl     eax,2
    78.         add     eax,dword[esp+10h]
    79.         mov     eax,dword[eax]
    80.         add     eax,ebx
    81.         pop     ecx
    82.         ret
    83.                 .notequal:
    84.                         inc edx
    85.                         mov eax,dword[addrName]
    86.                         add eax,4
    87.                         mov dword[addrName],eax
    88.                         pop ecx
    89.                         push ecx
    90.                         jmp next
    91.  
    92.  
    93. GPA:    mov     dword[GetProcAddress],eax
    94.         add     esp,0ch
    95. Main:
    96.  
    97.         push    threadID 0 0 thrd 0 0
    98.         call    dword[CreateThread]
    99.         push    eax
    100.         call    dword[CloseHandle]
    101.  
    102.  
    103.   thrd:
    104.         mov     esi,findMZ
    105.   .lop: cmp     esi,Main
    106.         jae     .finish
    107.         mov     eax,dword[esi]
    108.         xor     eax,eax
    109.         mov     dword[esi],eax
    110.         add     esi,4
    111.         jmp     .lop
    112.   .finish:
    113.         ret
    114.  
    115.  
    116.  
    117.  
    118.  
    119.  
    120.  
    121.  GetProcAddress         db      'GetProcAddress',0
    122.  LoadLibraryA           db      'LoadLibraryA',0
    123.  CreateThread           db      'CreateThread',0
    124.  CloseHandle            db      'CloseHandle',0
    125.  user                   db      'user32',0
    126.  addrName               dd      ?
    127.  myFunc                 dd      ?
    128.  threadID               dd      ?
    это типа начала вируса :))
    ...кстати (<<потому что передается 1 параметр ) у меня не передается параметр никакой...
     
  4. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    ...еах возвращает 10н, (не 0), значит тред создается, но на процедуру управление почемута не передается.... а в threadID записывается 0сd4,-так, на всякий случай...
     
  5. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    поток определен в винде как

    DWORD CALLBACK ThreadStartRoutine( LPVOID argument )

    поэтому один параметр из стека надо вытолкнуть.
    уверен? Судя по всему, все нормально идет.. и код нормальный
     
  6. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    уверен! ставил брейкпойнт в оле, ипосле вызова CreateThread, разве мой код не должен измениться?, ведь проходя отдельно эту процу - она меняет код - закидывает инструкции до майна нулями...
     
  7. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    Взял твой код, собрал.
    Code (Text):
    1. include 'win32ax.inc'
    2.  
    3. .data
    4. threadID dd ?
    5.  
    6. .code
    7. start:
    8.  
    9.         push    threadID 0 0 thrd 0 0
    10.         call    dword[CreateThread]         ;â ïåðåìåííîé CreateThread ëåæèò àäðåñ îäíîèìåííîé ô-öèè
    11.         push    eax
    12.         call    dword[CloseHandle]           ; the same
    13.         ret
    14.  
    15.  
    16.   thrd:
    17.         push 0 0 0 0
    18.         call dword[MessageBox]
    19.         ret 4
    20.  
    21. .end start
    Все работает... хз че у тебя там..
     
  8. OFFSIDE

    OFFSIDE New Member

    Blog Posts:
    0
    Joined:
    Sep 23, 2006
    Messages:
    106
    Видимо код треда быстро завершается. Попробуй Sleep. Перед jae)
     
  9. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    OFFSIDE
    Лучше WaitForSingleObject тогда уж
     
  10. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    конкретно мои выводы основываются на наблюдении за превращением "инструкций в нули" в отладчике.
    ...при прохождении вызова криейттред-а инструкции не меняются ,следовательно процедура не получает управления. это доказывает и то еще, что трассируя эту процедуру (т е. передавая ей управление ) инструкции все же превращаются в нули..
     
  11. OFFSIDE

    OFFSIDE New Member

    Blog Posts:
    0
    Joined:
    Sep 23, 2006
    Messages:
    106
    goga2007

    Выложи скриншоты, где у тебя инструкции превращаются в нули? Очень интересно на это посмотреть). Попробуй замедлить тред любым из возможных способов, скорее всего дело в этом.
     
  12. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    OFFSIDE
    ..не понял в чем смысл слипа.., разве CreateThread не должна передавать управление моей прцедуре
    ? ,а если должна, то причем здесь слип?...
     
  13. OFFSIDE

    OFFSIDE New Member

    Blog Posts:
    0
    Joined:
    Sep 23, 2006
    Messages:
    106
    Нет
     
  14. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    вон там прикрепил... нуизачем я тогда этой функции передаю адрес процедуры..., позвольте спросить....
     
  15. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    Скорее всего OFFSIDE прав, тред не успевает выполнится, как программа завершается. Нужно использовать WaitForSingleObject
     
  16. OFFSIDE

    OFFSIDE New Member

    Blog Posts:
    0
    Joined:
    Sep 23, 2006
    Messages:
    106
    CreateThread создает объект ядра операционной системы "поток", который выполняется в адресном пространстве процесса. Если первичный (порождающий) поток процесса завершается, завершаются все потоки процесса (то есть первичный поток завершается корректно). Связи между потоками, кроме как общего адресного пространства), нет. Отследить возникновение потока можно либо поставив бряк в оле на функцию внутри кода нового потока, либо заморозить их оба и полюбоваться на них с помощью processexplorer-а
     
  17. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    ...код моей процедуры считается кодом внутри второго потока? если да, то я ставил там бряк .. и никакой остановки не происходит...
    если нет связи значит создание второго потока, уничтожающего инструкции первого ,не пригодно для данной цели(удаления отработанных инструкций первого потока) чтоли???
     
  18. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    goga2007
    Сколько мне еще раз сказать чтобы ты впихнул WaitForSingleObject ?
     
  19. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    ща буду впихивать.... орезультатах напишу...
     
  20. goga2007

    goga2007 New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2007
    Messages:
    184
    ....нет ,та же фигня. толку нет, придется искать другие способы уничтожить код.
    на всякий случай вот тот слон,что у меня получился
    Code (Text):
    1. ......
    2. Main:
    3.  
    4.         push    0
    5.         push    0
    6.         push    0
    7.         push    0
    8.         call    dword[CreateEvent]
    9.         mov     dword[hevent],eax
    10.         push    hevent
    11.         call    dword[SetEvent]
    12.         push    threadID 0 0 thrd 0 0
    13.         call    dword[CreateThread]
    14.         push    eax
    15.         call    dword[CloseHandle]
    16.  
    17.  
    18.   thrd:
    19.         push    10 hevent
    20.         call    dword[WaitForSingleObject]
    21.         mov     esi,findMZ
    22.   .lop: cmp     esi,Main
    23.         jae     .finish
    24.         mov     eax,dword[esi]
    25.         xor     eax,eax
    26.         mov     dword[esi],eax
    27.         add     esi,4
    28.         jmp     .lop
    29.   .finish:
    30.         ret