..все компилируется без проблемм, но функция не создает тред с моей процедурой, посмотрите пожалуйста,кто распологает временем: Code (Text): Main: push threadID 0 0 thrd 0 0 call dword[CreateThread] ;в переменной CreateThread лежит адрес одноименной ф-ции push eax call dword[CloseHandle] ; the same thrd: mov esi,findMZ .lop: cmp esi,Main jae .finish mov eax,dword[esi] xor eax,eax mov dword[esi],eax add esi,4 jmp .lop .finish: ret это отрывок на ФАСМЕ. постигаю азы криптографии %)))
Кстати, надо делать в thrd не ret, а Ret 4, потому что передается 1 параметр и тип вызова stdcall это к слову. Насчет CreateThread: покажи как определен threadID И лучше используй макрос invoke раз уж на то пошло..
ThreadID определен простой переменной. я все переменные и данные определил в секции кода(чтоб меньше места занимал): Code (Text): format PE GUI findMZ: pop eax push eax and eax,0ffff0000h compare: cmp word[eax],5A4Dh jz findExport sub eax,10000h jmp compare findExport: mov ebx,eax add eax,3ch mov eax,dword[eax] add eax,ebx add eax,78h mov eax,dword[eax] ;rva of export table add eax,ebx ;address of export table add eax,1ch call GetAddr ;stack=vaAddressTable add eax,4 call GetAddr ;stack=vaNamesTable(address of the first name) add eax,4 call GetAddr ;stack=vaOrdinalsTable jmp findLoadLibraryA GetAddr: pop edx mov esi,dword[eax] add esi,ebx push esi push edx ret findLoadLibraryA: mov eax,dword[esp+4] ;eax=va of address of the first name mov dword[myFunc],LoadLibraryA mov ecx,0ch call findingAPI mov dword[LoadLibraryA],eax mov dword[myFunc],CreateThread mov eax,dword[esp+4] mov ecx,0ch call findingAPI mov dword[CreateThread],eax mov eax,dword[esp+4] mov dword[myFunc],CloseHandle mov ecx,0bh call findingAPI mov dword[CloseHandle],eax findGetProcAddress: mov eax,dword[esp+4] mov dword[myFunc],GetProcAddress mov ecx,0eh push GPA findingAPI: push ecx mov dword[addrName],eax xor edx,edx cld next: mov eax,dword[eax] add eax,ebx mov esi,eax mov edi,dword[myFunc] repe cmpsb jne .notequal shl edx,1 ;begining of getting addressAPI add edx,dword[esp+8] xor eax,eax mov ax,word[edx] shl eax,2 add eax,dword[esp+10h] mov eax,dword[eax] add eax,ebx pop ecx ret .notequal: inc edx mov eax,dword[addrName] add eax,4 mov dword[addrName],eax pop ecx push ecx jmp next GPA: mov dword[GetProcAddress],eax add esp,0ch Main: push threadID 0 0 thrd 0 0 call dword[CreateThread] push eax call dword[CloseHandle] thrd: mov esi,findMZ .lop: cmp esi,Main jae .finish mov eax,dword[esi] xor eax,eax mov dword[esi],eax add esi,4 jmp .lop .finish: ret GetProcAddress db 'GetProcAddress',0 LoadLibraryA db 'LoadLibraryA',0 CreateThread db 'CreateThread',0 CloseHandle db 'CloseHandle',0 user db 'user32',0 addrName dd ? myFunc dd ? threadID dd ? это типа начала вируса ) ...кстати (<<потому что передается 1 параметр ) у меня не передается параметр никакой...
...еах возвращает 10н, (не 0), значит тред создается, но на процедуру управление почемута не передается.... а в threadID записывается 0сd4,-так, на всякий случай...
поток определен в винде как DWORD CALLBACK ThreadStartRoutine( LPVOID argument ) поэтому один параметр из стека надо вытолкнуть. уверен? Судя по всему, все нормально идет.. и код нормальный
уверен! ставил брейкпойнт в оле, ипосле вызова CreateThread, разве мой код не должен измениться?, ведь проходя отдельно эту процу - она меняет код - закидывает инструкции до майна нулями...
Взял твой код, собрал. Code (Text): include 'win32ax.inc' .data threadID dd ? .code start: push threadID 0 0 thrd 0 0 call dword[CreateThread] ;â ïåðåìåííîé CreateThread ëåæèò àäðåñ îäíîèìåííîé ô-öèè push eax call dword[CloseHandle] ; the same ret thrd: push 0 0 0 0 call dword[MessageBox] ret 4 .end start Все работает... хз че у тебя там..
конкретно мои выводы основываются на наблюдении за превращением "инструкций в нули" в отладчике. ...при прохождении вызова криейттред-а инструкции не меняются ,следовательно процедура не получает управления. это доказывает и то еще, что трассируя эту процедуру (т е. передавая ей управление ) инструкции все же превращаются в нули..
goga2007 Выложи скриншоты, где у тебя инструкции превращаются в нули? Очень интересно на это посмотреть). Попробуй замедлить тред любым из возможных способов, скорее всего дело в этом.
OFFSIDE ..не понял в чем смысл слипа.., разве CreateThread не должна передавать управление моей прцедуре ? ,а если должна, то причем здесь слип?...
вон там прикрепил... нуизачем я тогда этой функции передаю адрес процедуры..., позвольте спросить....
Скорее всего OFFSIDE прав, тред не успевает выполнится, как программа завершается. Нужно использовать WaitForSingleObject
CreateThread создает объект ядра операционной системы "поток", который выполняется в адресном пространстве процесса. Если первичный (порождающий) поток процесса завершается, завершаются все потоки процесса (то есть первичный поток завершается корректно). Связи между потоками, кроме как общего адресного пространства), нет. Отследить возникновение потока можно либо поставив бряк в оле на функцию внутри кода нового потока, либо заморозить их оба и полюбоваться на них с помощью processexplorer-а
...код моей процедуры считается кодом внутри второго потока? если да, то я ставил там бряк .. и никакой остановки не происходит... если нет связи значит создание второго потока, уничтожающего инструкции первого ,не пригодно для данной цели(удаления отработанных инструкций первого потока) чтоли???
....нет ,та же фигня. толку нет, придется искать другие способы уничтожить код. на всякий случай вот тот слон,что у меня получился Code (Text): ...... Main: push 0 push 0 push 0 push 0 call dword[CreateEvent] mov dword[hevent],eax push hevent call dword[SetEvent] push threadID 0 0 thrd 0 0 call dword[CreateThread] push eax call dword[CloseHandle] thrd: push 10 hevent call dword[WaitForSingleObject] mov esi,findMZ .lop: cmp esi,Main jae .finish mov eax,dword[esi] xor eax,eax mov dword[esi],eax add esi,4 jmp .lop .finish: ret