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?
Odpowiedz
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.
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
- 1. Jak zatrzymać aplikację przed otwarciem?
- 2. Jak zatrzymać wiązanie właściwości przed aktualizacją?
- 3. LCC printf zmiennoprzecinkowych
- 4. Jak zatrzymać rejestrację Jenkinsa przed ogromnym?
- 5. Jak zatrzymać Eclipse przed automatycznym dodawaniem nawiasów?
- 6. xTend: Jak zatrzymać zmienną przed drukowaniem na wydruku?
- 7. Jak zatrzymać okno dialogowe przed ukryciem?
- 8. ddd zawiesza się na początku
- 9. Jak zatrzymać debugowanie w aplikacji na Androida w Eclipse
- 10. Zatrzymać użytkownika przed użyciem 5 ostatnich haseł?
- 11. Jak zatrzymać Swing EDT
- 12. Jak zatrzymać ikonę IntelliJ w stacji dokującej przed odbiciem, bez wyłączania podskakiwania dla wszystkich aplikacji
- 13. Czy powinienem zatelefonować Zatrzymać przed odczytaniem ElapsedMilliseconds?
- 14. Jak zatrzymać Vima przed utworzeniem/otwarciem nowego pliku?
- 15. Jak zatrzymać boty przed zwiększaniem licznika pobierania pliku w PHP?
- 16. Jak zatrzymać Eclipse przed automatycznym tworzeniem filtrów dla systemu Android?
- 17. Jak zatrzymać wszystkie poprzednie animacje w Jquery przed wykonaniem nowego?
- 18. Jak zatrzymać program PowerShell przed rozpakowaniem obiektu podlegającego zamianie?
- 19. HTML CSS Jak zatrzymać komórkę tabeli przed rozwinięciem
- 20. Jak zatrzymać Doctrine 2 przed buforowaniem wyniku w Symfony 2?
- 21. Awaria aplikacji na początku spowodowana przez NPE w android.content.Context.getString
- 22. Jak zatrzymać program Proguard przed usunięciem parametrów typu?
- 23. Jak odróżnić debugger LLDB od obsługi SIGBUS?
- 24. Jak zatrzymać wideo na akordeonie
- 25. Jak zatrzymać autouzupełnianie przed nadpisaniem pliku o podobnej nazwie
- 26. Jak zatrzymać json.Marshal przed ucieczką < and >?
- 27. Jak zatrzymać czas przed uruchomieniem w systemie Linux?
- 28. Jak zatrzymać program Visual Studio przed tworzeniem folderów debugowania pdb?
- 29. WCF: Jak zatrzymać myServiceHost.Close() przed usunięciem obiektu myServiceHost?
- 30. Jak zatrzymać Sass dodawanie spacji przed jednostkami miary?
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. –
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? –
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