• XSS.stack #1 – первый литературный журнал от юзеров форума

Не отрабатывает

DarckSol

(L1) cache
Пользователь
Регистрация
17.03.2008
Сообщения
894
Реакции
182
Собственно, вот мой кодес, точнее моего тут почти ничего нет. Это код самоудаления, если убрать API функции и проигклудить модули shellapi и windows, то всё корректно отрабатывает. Интересно, в чём же причина....
Код:
program Project1;

const
  MAX_PATH = 260;
  SW_SPOILER = 0;
type
     Dword = longword;
     HWND = longword;

//-------------API_Fun-----------------------
function GetShortPathName(lpszLongPath: PChar; lpszShortPath: PChar; cchBuffer: DWORD): DWORD; stdcall; external 'kernel32.dll' name 'GetShortPathNameA';
function GetEnvironmentVariable(lpName: PChar; lpBuffer: PChar; nSize: DWORD): DWORD; external 'kernel32.dll' name 'GetEnvironmentVariableA';
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; stdcall; external 'shell32.dll' name 'ShellExecuteA';
//-------------------------------------------

procedure SelfDelete;
var
  P: array[0..MAX_PATH - 1] of Char;
  S: string;
begin
  if GetShortPathName(PChar(ParamStr(0)), P, MAX_PATH) <> 0 then
  begin
    S := '/C DEL ' + '"' + P + '"';
    if GetEnvironmentVariable('ComSpec', P, MAX_PATH) <> 0 then
      ShellExecute(0, nil, P, PChar(S), nil, SW_SPOILER);
  end;
end;
var
st:integer;
begin
try
SelfDelete;
except end;
end.
 
В том, что декларация апишки ShellExecute как минимум находится в shellapi.
Можно задекларировать самому, делай так:

function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,
Directory: PWideChar; ShowCmd: Integer): HINST; stdcall; external shell32 name 'ShellExecuteA'; - shellapi уже не нужен, и т.д.
 
Наверное так:

Код:
function GetEnvironmentVariable(lpName: PChar; lpBuffer: PChar; nSize: DWORD): DWORD; stdcall; external 'kernel32.dll' name 'GetEnvironmentVariableA';

И личный совет - учись работать без string.
 
И личный совет - учись работать без string.
Принято...
------------------------
demien, возможно Вы меня не поняли. Код компилиться, ток вот не отрабатывает как нужно на WINAPI, но при модулях подключённых, всё нормально. Если не затруднит, поясните по подробнее...
 
Код:
00403702    8D95 F8FEFFFF   LEA EDX,DWORD PTR SS:[EBP-108]
00403708    B8 8C374000     MOV EAX,Project2.0040378C               ; ASCII "ComSpec"
0040370D    B9 04010000     MOV ECX,104
00403712    E8 51FFFFFF     CALL <JMP.&kernel32.GetEnvironmentVariab>
00403717    85C0            TEST EAX,EAX
00403719    74 1D           JE SHORT Project2.00403738; условный прыжок на 00403738    33C0            XOR EAX,EAX, тобишь GetEnvironmentVariab возвращает нуль :)
0040371B    6A 00           PUSH 0
0040371D    6A 00           PUSH 0
0040371F    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00403722    E8 09FBFFFF     CALL Project2.00403230
00403727    50              PUSH EAX
00403728    8D85 F8FEFFFF   LEA EAX,DWORD PTR SS:[EBP-108]
0040372E    50              PUSH EAX
0040372F    6A 00           PUSH 0
00403731    6A 00           PUSH 0
00403733    E8 38FFFFFF     CALL <JMP.&shell32.ShellExecuteA>
00403738    33C0            XOR EAX,EAX
0040373A    5A              POP EDX
0040373B    59              POP ECX
0040373C    59              POP ECX

учитесь дебажить свои кодесы :)
 
Код:
function SelfDelete():Boolean;
var
  szFile:  array[0..255] of Char;
  szCmd:   array[0..255] of Char;
begin
  Result := FALSE;
  if GetModuleFileName(0, szFile, 256) <> 0 then
  begin
    GetShortPathName(szFile, szFile, 256);
    lstrcpy(szCmd,'/c del ');
    lstrcat(szCmd, szFile);
    lstrcat(szCmd, ' >> NUL');
    if (GetEnvironmentVariable('ComSpec', szFile, 256) <> 0) and
       (ShellExecute(0, nil, szFile, szCmd, nil, SW_SPOILER) > 32) then
      Result := TRUE;
  end;
end;

опа опа
 
Откройте для себя wsprintf чтоле...

Код:
00403702    8D95 F8FEFFFF   LEA EDX,DWORD PTR SS:[EBP-108]
00403708    B8 8C374000     MOV EAX,Project2.0040378C              ; ASCII "ComSpec"
0040370D    B9 04010000     MOV ECX,104
00403712    E8 51FFFFFF     CALL <JMP.&kernel32.GetEnvironmentVariab>

Тут кстати видно проблему, о которой я написал в №3 посте, после чего можно было закрывать тему, но видимо вы что-то тяжелое упарываете :unsure:
 
DarckSol
можно переписать вот так но смысл не поменяется
Код:
BOOL SelfDelete()
{
  BOOL bRet = FALSE;
  PWCHAR pszwSelfFileName = (PWCHAR)AllocateHeap(BUFF_SIZE);  
  if (pszwSelfFileName != NULL)
  {
   if (GetModuleFileNameW(GetModuleHandleW(NULL),pszwSelfFileName,BUFF_SIZE)!=0)
   { 
        if (GetShortPathNameW(pszwSelfFileName,pszwSelfFileName,BUFF_SIZE)!=0)
     {
           PWCHAR pszwComSpec = (PWCHAR)AllocateHeap(BUFF_SIZE);
           if (pszwComSpec != NULL)
     {
         if (GetEnvironmentVariableW(L"COMSPEC",pszwComSpec,BUFF_SIZE)!=0)
      {
       PWCHAR pszwParamStr = (PWCHAR)AllocateHeap(BUFF_SIZE);
       if (pszwParamStr != NULL)
       {
      	// set command shell parameters
      	MyStrCatW(pszwParamStr,L"/c del ");
                            MyStrCatW(pszwParamStr,pszwSelfFileName);
      	MyStrCatW(pszwParamStr,L" > nul");
          // set struct members
                         SHELLEXECUTEINFOW sei;
                            sei.cbSize       = sizeof(sei);
                            sei.hwnd         = 0;
                            sei.lpVerb       = L"Open";
                            sei.lpFile       = pszwComSpec;
                            sei.lpParameters = pszwParamStr;
                            sei.lpDirectory  = 0;
                            sei.nShow        = SW_SPOILER;
                            sei.fMask        = SEE_MASK_NOCLOSEPROCESS;

                            SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
                            SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
                     
      	if(ShellExecuteExW(&sei))
                            {
                                 SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);
                                 SetProcessPriorityBoost(sei.hProcess,TRUE);
                                 SHChangeNotify(SHCNE_DELETE,SHCNF_PATHW,pszwSelfFileName,0);
                                 bRet = TRUE;
                            }
                            else // if error, normalize allocation
                            {
                                 SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS);
                                 SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
                            }
      	FreeHeap(pszwParamStr);
       }
      }
         FreeHeap(pszwComSpec);
     }
     }
   }
   FreeHeap(pszwSelfFileName);
  }
  return bRet;
}
можно еще разшарить секцию для процессов туда записать где находится екзе и с уже установленого екзе произвести удаление также можно заюзать реестр или создать переменную среды потом удалить и еще можно с нтфс потоками сделать
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх