Код (Text): format PE64 include '%fasm%\win64ax.inc' entry start ; тут ресурсы всякие... start: invoke GetCommandLine invoke CommandLineToArgv,eax,argsNum cmp qword[argsNum],1 push rax jbe @F ; jump_if_below_or_equal push qword[eax+4] call AdjustMyToken stdcall findProcessID test rax,rax jz @F invoke OpenProcess,PROCESS_TERMINATE,FALSE,rax push rax invoke TerminateProcess,rax,1 invoke CloseHandle,[hToken] jmp start @@: invoke ExitProcess,0 ; ret argsNum dq ? section '.idata' import data executable readable writeable library advapi32,'ADVAPI32.dll',kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL' include '%fasm%\api\advapi32.inc' import kernel32,OpenProcess,'OpenProcess',\ TerminateProcess,'TerminateProcess',\ CloseHandle,'CloseHandle',\ lstrcmpi,'lstrcmpiW',\ CreateToolhelp32Snapshot,'CreateToolhelp32Snapshot',\ Process32First,'Process32FirstW',\ Process32Next,'Process32NextW',\ GetCommandLine,'GetCommandLineW',\ LocalFree,'LocalFree',ExitProcess,'ExitProcess' import shell32,CommandLineToArgv,'CommandLineToArgvW' TOKEN_ADJUST_PRIVILEGES equ 20h TOKEN_QUERY equ 8h SE_PRIVILEGE_ENABLED equ 2h AdjustMyToken: invoke LookupPrivilegeValue,emptyStr,privName,tokenPriv.LUID1 mov qword[tokenPriv.PrivilegeCount],1h mov qword[tokenPriv.Attributes],SE_PRIVILEGE_ENABLED invoke OpenProcessToken,-1,TOKEN_ADJUST_PRIVILEGES OR TOKEN_QUERY,hToken invoke AdjustTokenPrivileges,[hToken],FALSE,tokenPriv,0,0,0 invoke CloseHandle,[hToken] ret emptyStr db '',0 privName db 'SeDebugPrivilege',0 struct TOKEN_PRIVILEGES PrivilegeCount dq ? LUID1 dq ? LUID2 dq ? Attributes dq ? ends hToken dq ? TH32CS_SNAPPROCESS equ 2 findProcessID: ; takes one parameter through stack: pointer to the process name push rbp invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 mov rbp,rax mov qword[procEntry.dwSize],sizeof.PROCESSENTRY32W invoke Process32First,rax,procEntry @@: invoke Process32Next,ebp,procEntry test rax,rax jz @F invoke lstrcmpi,procEntry.szExeFile,qword[rsp+8] test rax,rax jnz @B mov rax,qword[procEntry.th32ProcessID] @@: pop rbp retn 8 struct PROCESSENTRY32W dwSize dq ? cntUsage dq ? th32ProcessID dq ? th32DefaultHeapID dq ? th32ModuleID dq ? cntThreads dq ? th32ParentProcessID dq ? pcPriClassBase dq ? dwFlags dq ? szExeFile dw MAX_PATH dup (?) ends tokenPriv TOKEN_PRIVILEGES <> procEntry PROCESSENTRY32W <> align 8 над кодом не смейтесь, я просто эксперементировал, важно что он в x86 работает! а вот в x64 кампилится без ошибок, но не работает. Может быть пустяк, где-то в данных типы не совпали, это хорошо! Но может быть чисто что-то PE64 я не учитываю, помогите понять?
А нельзя ли ещё таким образом SellExt.dll расширения проводника выгружать, раз exe выгружается? В чём разница?
Недавно столкнулся с подобной проблемой -- в 64битном режиме изменилась конвенция вызова. Почитать о ней можно в Педивикии. Вкратце, выглядит она так: 1. Параметры передаются в rcx, rdx, r8, r9, остальное в стеке. 2. Перед вызовом процедуры необходимо зарезервировать в стеке 32 (0х20) байт для сохранения предыдущих значение rcx, rdx, r8, r9. 3. Стек очищает вызывающая ф-ия. Т.е. вызов ф-ии с пятью параметрами будет выглядеть примерно так: Код (Text): mov rcx, arg0 mov rdx, arg1 mov r8, arg2 mov r9, arg3 push arg4 sub rsp, 0x20 call func add rsp, 0x20 Детали читаем здесь: http://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention
Mika0x65 В fasm win64a.inc подключает proc64.inc, которая в свою очередь определяет макрос invoke в соответствии с 64-битной конвенцией вызова. Semiono push qword[eax+4] заменить на push qword[rax+4] и определения tokenPriv TOKEN_PRIVILEGES <> procEntry PROCESSENTRY32W <> за исключением строковых снести ПОД (сколько раз уже об этом говорил!) align 8 в конце исходника. В остальном не знаю.
Mika0x65 >push arg4 >sub rsp, 0x20 >call func >add rsp, 0x20 О Боги, в действительности всё совсем не так. Конкретно в данном случае один запихивает arg4 в P1Home, а для arg4 передаётся мусор из стека – это чудовищно, абсолютно, абсолютно ужасающе. Кроме того, хоть RSP и имеет право изменяться во время выполнения функции, но как правило это делается лишь в прологе и эпилоге, а в основном теле функции RSP обычно статичен. Semiono >не работает Это тоже чудовищно. Один всегда должен конкретизировать подобное. Не запускается – с каким статусом? Падает при запуске – на каком месте, с каким статусом? Какая-то апи не выполняет то, что должна – какая апи, какой статус ошибки?
Я в дебагере не проверял. Что можно сказать о консольном приложении! Ничего! Молча выполняется но работу не делает! # pkill.exe calc.exe
Semiono Пишите на C и не парьтесь: Код (Text): #define _WIN32_WINNT 0x500 #include <windows.h> #include <tlhelp32.h> #include <stdio.h> #include <tchar.h> BOOL AdjustDebugPrivilege() { BOOL bRet = FALSE; HANDLE hToken; if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) { LUID luid; if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL) && GetLastError() != ERROR_NOT_ALL_ASSIGNED) { bRet = TRUE; } } CloseHandle(hToken); } return bRet; } DWORD GetProcessIdByName(LPCTSTR lpstrProcessName) { DWORD dwProcessId = 0; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot != INVALID_HANDLE_VALUE) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &pe32)) { do { if (lstrcmpi(pe32.szExeFile, lpstrProcessName) == 0) { dwProcessId = pe32.th32ProcessID; break; } } while (Process32Next(hSnapshot, &pe32)); } CloseHandle(hSnapshot); } return dwProcessId; } int _tmain(int argc, _TCHAR* argv[]) { DWORD dwProcessId; HANDLE hProcess; if (argc != 2) { _tprintf(__T("Argument requiered.\n")); return 1; } if (!AdjustDebugPrivilege()) { _tprintf(__T("Can't set debug privilege.\n")); } dwProcessId = GetProcessIdByName(argv[1]); if (dwProcessId == 0) { _tprintf(__T("Couldn't find the process.\n")); return 1; } hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId); if (hProcess == NULL) { _tprintf(__T("Couldn't open the process for terminating.\n")); return 1; } TerminateProcess(hProcess, 0); CloseHandle(hProcess); return 0; }
Sol_Ksacap А можно подробнее? Под рукой того кода нет, но, сделал так, как написал выше и работало. Если, конечно, ничего не перепутал.
а где тут директива что это x64 код? 8-) сейчас вытащу cl.exe из msi дистриба и начну кодить ))) у меня 2005 притом Express Studio, эх даже портабл сборку неохота делать из этого шита. :\ А на Dev-Cpp нельзя такое кампилить?... или на mingw %)
Это указывается в свойствах конфигурации сборки. Код выглядит одинаково для обоих архитектур. Ничего не получится, ибо cl.exe подходит только для сборки под x86. Для IA64 нужно дополнительно компилятор искать. У меня его можно было поставить опционально при установке MSVS. Толковый образ студии легко можно раздобыть в инете, в том числе на сайте майкрософт (90 дневная триал лицензия. Удаляем студию и ставим заново - еще 90 дней и т.д.) Можно компилить любым компилятором, поддерживающим генерацию кода под нужную платформу. MinGW/GCC есть такие.
litrovith Я очень ленивый человек, мне лень искать что и где фиксить. Подскажите пожалуйста. З.Ы. Хотя может быть и не надо, я ОС чаще переустанавливаю по причине того, что после вставки второй планки оперативки, виста отказывается принимать мой лицензионный ключ, заявляя, что этот ключ уже используется на другом компьютере, а звонить в службу поддержки и объяснять им ситуацию мне лень. Раскладку клавиатуры мне тоже лень переключать =(
Semiono, извините за оффтоп. KeSqueer, не ленитесь и юзайте лучше FASM, 'мышками' мож, давайте не будем меряться?