2011-08-10 7 views
26

Nie jestem pewien, ilu użytkowników korzysta z kompilatora LCC C i interfejsu graficznego WEdit dla systemu Windows, ale ma "funkcję", która może być dość denerwująca. Po uruchomieniu aplikacji za pomocą debuggera powoduje ona przerwanie aplikacji na początku funkcji głównej. Jak mogę to odciąć, aby debugger natychmiast wykonał kod, dopóki go nie zatrzymam lub nie osiągnie punktu przerwania, który utworzyłem?LCC-- Jak zatrzymać debugger przed włamaniem na początku aplikacji?

+0

Dobre pytanie! Używałem LCC-Win32 w przeszłości do nauczania C, a dla początkujących jest to dobra cecha, ale widzę, jak może to być denerwujące. Próbowałem ustawić i rozbrojenie punktu przerwania na klamrze otwierającej w main(), ale tak czy inaczej, zatrzymuje się. Przyjrzałem się parametrom wiersza poleceń Wedit (IDE dla LCC-Win32), ale nie ma flag kontrolujących to, co robi podczas uruchamiania. –

+0

Nie znam LCC, ale z Dokumentacji użytkownika - "Możesz zobaczyć wszystkie punkty przerwania, które posiadasz i edytować/usunąć je, wybierając z menu Kompilator-> Punkty przerwania (lub Debuguj-> Edytuj punkty przerwania)". Widziałeś punkt przerwania na main() tutaj? –

+0

Nie ma punktu przerwania. Dokuczliwość jest niezależna od tego, czy punkt przerwania jest ustawiony, czy nie, debugger/edytor zawsze łamie się w pierwszym wierszu metody main(). – RLH

Odpowiedz

6

Wow, ludzie nadal używają LCC ... Ostatnim razem, gdy używałem tego, było ~ 10 lat temu.

Dekompilowałem wedit.exe i mogę potwierdzić, że nie ma oficjalnej metody wyłączenia tego zachowania.

Naprawiłem plik binarny, jeśli to działa. Przesłałem go pod numer here.

Dla tych, którzy martwią się o wirusy i tak załatałem wedit zaczerpnięte z here. O polu mówi, że to wersja 4.0 skompilowane na wrz 16 2009.

Tutaj jest połatany funkcji dla tych, którzy interesują:

int __cdecl sub_44CF0D(HANDLE hProcess) 
{ 
    int result; // [email protected] 
    int v2; // [email protected] 
    int v3; // [email protected] 
    int v4; // [email protected] 
    int v5; // [email protected] 
    int v6; // [sp+10h] [bp-68h]@11 
    int v7; // [sp+14h] [bp-64h]@1 
    struct _DEBUG_EVENT DebugEvent; // [sp+18h] [bp-60h]@1 

    v7 = 1; 
    result = WaitForDebugEvent(&DebugEvent, dwMilliseconds); 
    if (result) 
    { 
    sub_44C67A(&DebugEvent); 
    if (DebugEvent.dwDebugEventCode == 1) 
    { 
     if (DebugEvent.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_ACCESS_VIOLATION 
     && !(dword_482860 & 1) 
     && !dword_484328 
     && DebugEvent.u.Exception.dwFirstChance) 
     { 
     sub_44E1A5(0); 
     sub_44CEB2(v2); 
     return ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x80010001u); 
     } 
     v6 = 0; 
     v7 = sub_44D2C4((int)&DebugEvent, hProcess, (int)&v6); 
     if (v6 && DebugEvent.u.Exception.dwFirstChance) 
     return ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x80010001u); 
     goto LABEL_41; 
    } 
    if (DebugEvent.dwDebugEventCode == 3) 
    { 
     if (dword_483C94) 
     { 
     dword_48428C = 1; 
LABEL_41: 
     if (dword_483C6C) 
      sub_44ECDC(); 
     if (v7) 
     { 
      result = ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x10002u); 
     } 
     else 
     { 
      dword_49BF68 = 1; 
      ResetEvent(dword_484AE4); 
      dword_4843C8 = DebugEvent.dwThreadId; 
      result = sub_4524CD(); 
     } 
     return result; 
     } 
     Sleep(0x32u); 
     dword_49BF64 = 1; 
     dword_49BF68 = 1; 
     qword_483C74 = __PAIR__(
         (unsigned int)DebugEvent.u.Exception.ExceptionRecord.ExceptionAddress, 
         DebugEvent.u.Exception.ExceptionRecord.ExceptionInformation[2]); 
     if (dword_484288) 
     ::hProcess = (HANDLE)DebugEvent.u.Exception.ExceptionRecord.ExceptionFlags; 
     else 
     ::hProcess = hProcess; 
     dword_483C84 = DebugEvent.dwProcessId; 
     hThread = DebugEvent.u.Exception.ExceptionRecord.ExceptionRecord; 
     dword_483C9C = (HANDLE)DebugEvent.u.Exception.ExceptionRecord.ExceptionCode; 
     dwThreadId = DebugEvent.dwThreadId; 
     dword_483C94 = 0; 
     if (sub_45A83A()) 
     { 
     v4 = sub_4026A6(28); 
     dword_484330 = v4; 
     *(_DWORD *)(v4 + 4) = hThread; 
     *(_DWORD *)(v4 + 8) = dwThreadId; 
     if (dword_484288) 
     { 
      sub_455B58(); 
     } 
     else 
     { 
      Sleep(0x64u); 
      v5 = sub_45AAFC(); 
      if (!v5) 
      return PostMessageA(dword_4849EC, 0x111u, 0x64u, 0); 
      if (dword_484354) 
      goto LABEL_50; 
      sub_455B58(); 
      if (dword_483C70 && *(_DWORD *)(dword_483C70 + 52)) 
      *(_DWORD *)(*(_DWORD *)(dword_483C70 + 52) + 36) = sub_451577(**(_DWORD **)(dword_483C70 + 52), 1u); 
      v5 = *(_DWORD *)(dword_483C70 + 52); 
      if (v5 && *(_DWORD *)(v5 + 36)) 
      { 
LABEL_50: 
      if (!dword_483C6C) 
       sub_44E92A(v5); 
      sub_44CC3D(); 
      sub_451600(); 
      PostMessageA(dword_4849EC, 0x111u, 0x154u, 0); 
      } 
      else 
      { 
      sub_4029CA("Imposible to find %s\nRunning without source display", *(_DWORD *)(dword_483C70 + 20)); 
      dword_484344 = 1; 
      v7 = 1; 
      PostMessageA(dword_4849EC, 0x111u, 0x154u, 0); 
      } 
     } 
     goto LABEL_41; 
     } 
     dword_484338 = 1; 
     v3 = sub_44DB56(qword_483C74); 
     if (v3) 
     *(_BYTE *)(v3 + 29) &= 0xFDu; 
     result = ContinueDebugEvent(DebugEvent.dwProcessId, DebugEvent.dwThreadId, 0x10002u); 
    } 
    else 
    { 
     if (DebugEvent.dwDebugEventCode != 5) 
     goto LABEL_41; 
     if (DebugEvent.dwProcessId != dword_483C84) 
     { 
     v7 = 1; 
     goto LABEL_41; 
     } 
     dword_49BF64 = 0; 
     dword_49BF68 = 1; 
     dword_481614 = 0; 
     result = sub_402A32(4520, SLOBYTE(DebugEvent.u.Exception.ExceptionRecord.ExceptionCode)); 
     if (!dword_483C6C) 
     result = sub_40B155(lpCmdLine); 
    } 
    } 
    else 
    { 
    if (dword_483C6C) 
     result = sub_44ECDC(); 
    } 
    return result; 
} 

if pod LABEL_50 co ja połatany (od 0x75 do 0xEB).

Łatwo było zauważyć to miejsce, ponieważ oczekiwałem, że WriteProcessMemory będzie używane do zapisu 0xCC w debugowanym punkcie wejścia aplikacji.

+1

Cóż, chciałem chwilę poczekać, zanim oznaczyłem to jako odpowiedź, na wypadek gdyby pojawiło się inne rozwiązanie. To na pewno rozwiązuje problem, po prostu nie tak elegancko, jak się spodziewałem. Dzięki za rozwiązanie! – RLH

Powiązane problemy