PE2PE64

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 14 мар 2010.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. format PE64
    2. include '%fasm%\win64ax.inc'
    3. entry start
    4.  
    5. ; тут ресурсы всякие...
    6.  
    7. start:
    8.         invoke GetCommandLine
    9.         invoke CommandLineToArgv,eax,argsNum
    10.         cmp qword[argsNum],1
    11.         push rax
    12.         jbe @F  ; jump_if_below_or_equal
    13.                 push qword[eax+4]
    14.                 call AdjustMyToken
    15.                 stdcall findProcessID
    16.                 test rax,rax
    17.                 jz @F
    18.                 invoke OpenProcess,PROCESS_TERMINATE,FALSE,rax
    19.                 push rax
    20.                 invoke TerminateProcess,rax,1
    21.                 invoke CloseHandle,[hToken]
    22.                 jmp start
    23.         @@:
    24.  
    25.         invoke ExitProcess,0
    26. ; ret
    27.  
    28.         argsNum dq ?
    29.  
    30. section '.idata' import data executable readable writeable
    31.         library advapi32,'ADVAPI32.dll',kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
    32.         include '%fasm%\api\advapi32.inc'
    33.         import kernel32,OpenProcess,'OpenProcess',\
    34.                         TerminateProcess,'TerminateProcess',\
    35.                         CloseHandle,'CloseHandle',\
    36.                         lstrcmpi,'lstrcmpiW',\
    37.                         CreateToolhelp32Snapshot,'CreateToolhelp32Snapshot',\
    38.                         Process32First,'Process32FirstW',\
    39.                         Process32Next,'Process32NextW',\
    40.                         GetCommandLine,'GetCommandLineW',\
    41.                         LocalFree,'LocalFree',ExitProcess,'ExitProcess'
    42.         import shell32,CommandLineToArgv,'CommandLineToArgvW'
    43.  
    44.         TOKEN_ADJUST_PRIVILEGES equ 20h
    45.         TOKEN_QUERY             equ 8h
    46.         SE_PRIVILEGE_ENABLED    equ 2h
    47.  
    48. AdjustMyToken:
    49.         invoke LookupPrivilegeValue,emptyStr,privName,tokenPriv.LUID1
    50.         mov qword[tokenPriv.PrivilegeCount],1h
    51.         mov qword[tokenPriv.Attributes],SE_PRIVILEGE_ENABLED
    52.         invoke OpenProcessToken,-1,TOKEN_ADJUST_PRIVILEGES OR TOKEN_QUERY,hToken
    53.         invoke AdjustTokenPrivileges,[hToken],FALSE,tokenPriv,0,0,0
    54.         invoke CloseHandle,[hToken]
    55. ret
    56.  
    57.         emptyStr                db '',0
    58.         privName                db 'SeDebugPrivilege',0
    59.  
    60. struct TOKEN_PRIVILEGES
    61.         PrivilegeCount          dq ?
    62.         LUID1                   dq ?
    63.         LUID2                   dq ?
    64.         Attributes              dq ?
    65. ends
    66.  
    67.         hToken  dq ?
    68.  
    69.         TH32CS_SNAPPROCESS      equ 2
    70.  
    71. findProcessID: ; takes one parameter through stack: pointer to the process name
    72.         push rbp
    73.         invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
    74.         mov rbp,rax
    75.         mov qword[procEntry.dwSize],sizeof.PROCESSENTRY32W
    76.         invoke Process32First,rax,procEntry
    77.         @@:
    78.                 invoke Process32Next,ebp,procEntry
    79.                 test rax,rax
    80.                 jz @F
    81.                 invoke lstrcmpi,procEntry.szExeFile,qword[rsp+8]
    82.                 test rax,rax
    83.         jnz @B
    84.         mov rax,qword[procEntry.th32ProcessID]
    85.         @@:
    86.         pop rbp
    87. retn 8
    88.  
    89. struct PROCESSENTRY32W
    90.         dwSize                  dq ?
    91.         cntUsage                dq ?
    92.         th32ProcessID           dq ?
    93.         th32DefaultHeapID       dq ?
    94.         th32ModuleID            dq ?
    95.         cntThreads              dq ?
    96.         th32ParentProcessID     dq ?
    97.         pcPriClassBase          dq ?
    98.         dwFlags                 dq ?
    99.         szExeFile               dw MAX_PATH dup (?)
    100. ends
    101.  
    102.         tokenPriv               TOKEN_PRIVILEGES <>
    103.         procEntry               PROCESSENTRY32W <>
    104.  
    105.         align 8
    над кодом не смейтесь, я просто эксперементировал, важно что он в x86 работает!
    а вот в x64 кампилится без ошибок, но не работает.
    Может быть пустяк, где-то в данных типы не совпали, это хорошо!
    Но может быть чисто что-то PE64 я не учитываю, помогите понять?
    :)
     
  2. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    А нельзя ли ещё таким образом SellExt.dll расширения проводника выгружать, раз exe выгружается?
    В чём разница?
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Недавно столкнулся с подобной проблемой -- в 64битном режиме изменилась конвенция вызова. Почитать о ней можно в Педивикии. Вкратце, выглядит она так:

    1. Параметры передаются в rcx, rdx, r8, r9, остальное в стеке.
    2. Перед вызовом процедуры необходимо зарезервировать в стеке 32 (0х20) байт для сохранения предыдущих значение rcx, rdx, r8, r9.
    3. Стек очищает вызывающая ф-ия.

    Т.е. вызов ф-ии с пятью параметрами будет выглядеть примерно так:

    Код (Text):
    1. mov rcx, arg0
    2. mov rdx, arg1
    3. mov r8, arg2
    4. mov r9, arg3
    5. push arg4
    6. sub rsp, 0x20
    7. call func
    8. add rsp, 0x20
    Детали читаем здесь: http://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mika0x65
    В fasm win64a.inc подключает proc64.inc, которая в свою очередь определяет макрос invoke в соответствии с 64-битной конвенцией вызова.
    Semiono
    push qword[eax+4] заменить на push qword[rax+4]
    и определения
    tokenPriv TOKEN_PRIVILEGES <>
    procEntry PROCESSENTRY32W <>

    за исключением строковых снести ПОД (сколько раз уже об этом говорил!) align 8 в конце исходника.
    В остальном не знаю.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Т.е. не на push qword[rax+4], а на push qword[rax+8].
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    И этого словосочетания тоже не должно быть. :) Осталось от предыдущей версии поста.
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Mika0x65
    >push arg4
    >sub rsp, 0x20
    >call func
    >add rsp, 0x20

    О Боги, в действительности всё совсем не так. Конкретно в данном случае один запихивает arg4 в P1Home, а для arg4 передаётся мусор из стека – это чудовищно, абсолютно, абсолютно ужасающе. Кроме того, хоть RSP и имеет право изменяться во время выполнения функции, но как правило это делается лишь в прологе и эпилоге, а в основном теле функции RSP обычно статичен.

    Semiono
    >не работает
    Это тоже чудовищно. Один всегда должен конкретизировать подобное. Не запускается – с каким статусом? Падает при запуске – на каком месте, с каким статусом? Какая-то апи не выполняет то, что должна – какая апи, какой статус ошибки?
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Я в дебагере не проверял. Что можно сказать о консольном приложении! Ничего!
    Молча выполняется но работу не делает! # pkill.exe calc.exe
     
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Если бы там был StdOut вывод ошибки, тогдаб понятно... надо будет подумать над этим.
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Semiono
    >Я в дебагере не проверял.
    Ага, так надо проверить же. Или ты из секты?
     
  11. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    А!!! Ура секта! ))) Нас уже много! =)
     
  12. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Semiono
    Пишите на C и не парьтесь:
    Код (Text):
    1. #define _WIN32_WINNT 0x500
    2. #include <windows.h>
    3. #include <tlhelp32.h>
    4. #include <stdio.h>
    5. #include <tchar.h>
    6.  
    7. BOOL AdjustDebugPrivilege()
    8. {
    9.     BOOL bRet = FALSE;
    10.     HANDLE hToken;
    11.     if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
    12.     {
    13.         LUID luid;
    14.         if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
    15.         {
    16.             TOKEN_PRIVILEGES tp;
    17.             tp.PrivilegeCount = 1;
    18.             tp.Privileges[0].Luid = luid;
    19.             tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    20.             if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL) &&
    21.                 GetLastError() != ERROR_NOT_ALL_ASSIGNED)
    22.             {
    23.                 bRet = TRUE;
    24.             }
    25.         }
    26.         CloseHandle(hToken);
    27.     }
    28.     return bRet;
    29. }
    30. DWORD GetProcessIdByName(LPCTSTR lpstrProcessName)
    31. {
    32.     DWORD   dwProcessId = 0;
    33.     HANDLE  hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    34.     if (hSnapshot != INVALID_HANDLE_VALUE)
    35.     {
    36.         PROCESSENTRY32  pe32;
    37.         pe32.dwSize = sizeof(PROCESSENTRY32);
    38.         if (Process32First(hSnapshot, &pe32))
    39.         {
    40.             do {
    41.                 if (lstrcmpi(pe32.szExeFile, lpstrProcessName) == 0)
    42.                 {
    43.                     dwProcessId = pe32.th32ProcessID;
    44.                     break;
    45.                 }
    46.             } while (Process32Next(hSnapshot, &pe32));
    47.         }
    48.         CloseHandle(hSnapshot);
    49.     }
    50.     return dwProcessId;
    51. }
    52.  
    53. int _tmain(int argc, _TCHAR* argv[])
    54. {
    55.     DWORD dwProcessId;
    56.     HANDLE hProcess;
    57.  
    58.     if (argc != 2)
    59.     {
    60.         _tprintf(__T("Argument requiered.\n"));
    61.         return 1;
    62.     }
    63.     if (!AdjustDebugPrivilege())
    64.     {
    65.         _tprintf(__T("Can't set debug privilege.\n"));
    66.     }
    67.     dwProcessId = GetProcessIdByName(argv[1]);
    68.     if (dwProcessId == 0)
    69.     {
    70.         _tprintf(__T("Couldn't find the process.\n"));
    71.         return 1;
    72.     }
    73.     hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
    74.     if (hProcess == NULL)
    75.     {
    76.         _tprintf(__T("Couldn't open the process for terminating.\n"));
    77.         return 1;
    78.     }
    79.     TerminateProcess(hProcess, 0);
    80.     CloseHandle(hProcess);
    81.     return 0;
    82. }
     
  14. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Sol_Ksacap
    А можно подробнее? Под рукой того кода нет, но, сделал так, как написал выше и работало. Если, конечно, ничего не перепутал.
     
  15. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    весь код или только апишка ?
     
  16. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    а где тут директива что это x64 код? 8-)
    сейчас вытащу cl.exe из msi дистриба и начну кодить )))
    у меня 2005 притом Express Studio, эх даже портабл сборку неохота делать из этого шита. :\
    А на Dev-Cpp нельзя такое кампилить?... или на mingw %)
     
  17. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Это указывается в свойствах конфигурации сборки. Код выглядит одинаково для обоих архитектур.
    Ничего не получится, ибо cl.exe подходит только для сборки под x86. Для IA64 нужно дополнительно компилятор искать. У меня его можно было поставить опционально при установке MSVS.
    Толковый образ студии легко можно раздобыть в инете, в том числе на сайте майкрософт (90 дневная триал лицензия. Удаляем студию и ставим заново - еще 90 дней и т.д.)
    Можно компилить любым компилятором, поддерживающим генерацию кода под нужную платформу. MinGW/GCC есть такие.
     
  18. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    KeSqueer, не
    а фиксим реестр.
     
  19. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    litrovith
    Я очень ленивый человек, мне лень искать что и где фиксить. Подскажите пожалуйста.
    З.Ы.
    Хотя может быть и не надо, я ОС чаще переустанавливаю по причине того, что после вставки второй планки оперативки, виста отказывается принимать мой лицензионный ключ, заявляя, что этот ключ уже используется на другом компьютере, а звонить в службу поддержки и объяснять им ситуацию мне лень.
    Раскладку клавиатуры мне тоже лень переключать =(
     
  20. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Semiono, извините за оффтоп.

    KeSqueer, не ленитесь и юзайте лучше FASM, 'мышками' мож, давайте не будем меряться? ;)