Я после Айса терпеть не мог WinDBG, а потом так привык и думаю нахер бы он нужен был вообще Айс. Разве что для отладки компа за которым сидишь но... это в принципе актуально если комп у тебя только один. Когда их два - никаких проблем. Да даже на виртуалке все ок. Т.ч. Айс R.I.P.
из под виндбг я могу всё что захочется, единственный минус в его гуе - так это то что дампы памяти не обновляются в реалтайме. а все остальные проблемы решаются встроенными эвалуаторами что асма что с++, - и это заебись фича кстати, которая дружит с символами))
да лан)) ты гонишь - когда я с айсом познакомился - ты еще в подготовке в школе был же))) я тогда и понятия не имел зачем нужен отладчик, а тем более ядерный, - так просто - поставил с диска с радиорынка и почувствовал себя хакером))
Там не хватает скриптов. Были-бы скрипты - ты бы смог обновлять дамп на каждом шаге как нехрен делать. А так... ну две команды писать придется. И тем более не каждый же раз надо чекать что там изменилось... mov eax,ebx можно и пропустить
Чо в школе ? В 2001-м году где-то я был уже не в школе. Тогда я уже косил пары в универе и почитывал ксакеп, да Дрова правда начал писать значительно позже, год какой точно не вспомню, но Айс еще застал.
А. Кстати Айс я первым и начал юзать. Про Оль всяких и знать не знал. Тогда развлечение состояло в том чтобы ставить bpx на MessageBoxA и там выискивать как надо крякнуть программу Кряк божественный, ничего не скажешь, но для нуба - это было прям пипец как круто !!!
чел, ты угараешь?)) пожалуй, не буду выёбываться - но вот тебе мой справочник с комментами Code: **** evaluating expressions - substituting dtx with ?? to expand type info 0:000> ?? @@c++(head_list) struct _LIST_ENTRY * 0x777d01f4 [ 0x533c98 - 0x539290 ] +0x000 Flink : 0x00533c98 _LIST_ENTRY [ 0x533bb8 - 0x777d01f4 ] +0x004 Blink : 0x00539290 _LIST_ENTRY [ 0x777d01f4 - 0x539140 ] **** evaluating expressions - @@c++(...) vs @@masm(...) identifier interpreting 0:000> dv __formal = 0x00400000 __formal = 0x00000000 __formal = 0x005943aa "" __formal = 0n1 pInMemoryOrderModuleList = 0x777d01f4 [ 0x593c98 - 0x59d478 ] imagebase = 0 0:000> dtx nt!_LIST_ENTRY @@c++(pInMemoryOrderModuleList) (*((nt!_LIST_ENTRY *)0x777d01f4)) [Type: _LIST_ENTRY] [+0x000] Flink : 0x593c98 [Type: _LIST_ENTRY *] [+0x004] Blink : 0x59d478 [Type: _LIST_ENTRY *] 0:000> dtx nt!_LIST_ENTRY @@masm(pInMemoryOrderModuleList) (*((nt!_LIST_ENTRY *)0x18ff30)) [Type: _LIST_ENTRY] [+0x000] Flink : 0x777d01f4 [Type: _LIST_ENTRY *] [+0x004] Blink : 0x18ff80 [Type: _LIST_ENTRY *] **** evaluating expressions - when operand for debugger command required 0:000> dtx ntdll!_LIST_ENTRY @@c++(pInMemoryOrderModuleList) (*((ntdll!_LIST_ENTRY *)0x777d01f4)) [Type: _LIST_ENTRY] [+0x000] Flink : 0x213c98 [Type: _LIST_ENTRY *] [+0x004] Blink : 0x21d130 [Type: _LIST_ENTRY *] where pInMemoryOrderModuleList is a local var, that could be checked out with dv command ? - masm basic expression ?? - c++ basic expression @@masm(...) in-expression @@c++(...) in-expression **** windbg doesnt update a memory views while int3 hit (all threads suspended) KUSER ticks updating, or another external wrtites to mem. **** windbg cant handle um access to memory from foreign process (thru NtWriteVirtualMemory etc) via ba bp **** HEAP info !heap with various parameters (use block sizes to detect most frequent allocs) **** display the SEH chain 0:000> !exchain 0018ffcc: ntdll!_except_handler4+0 (77f174a0) CRT scope 0, filter: ntdll!__RtlUserThreadStart+544f3 (77f2f253) func: ntdll!__RtlUserThreadStart+5453a (77f2f29a) 0018ffe4: ntdll!FinalExceptionHandlerPad1+0 (77ec00a0) **** dg (Display Selector) 0:000> dg fs P Si Gr Pr Lo Sel Base Limit Type l ze an es ng Flags ---- -------- -------- ---------- - -- -- -- -- -------- 0053 7ffdd000 00000fff Data RW Ac 3 Bg By P Nl 000004f3 **** break on SetWindowTextA by '*erio*' pattern bp user32!SetWindowTextA "$$<d:\\commands.txt" .if (poi(@esp+8) != 0) {as /ma ${/v:WndText} poi(@esp+8)} .else {ad /q ${/v:WndText}} .if ($spat(@"${WndText}", "*erio*") == 0){ gc } .else {.echo WndText} **** eb @$peb+2 00 Windbg break-in flaw ntdll!DbgUiRemoteBreakin and/or other internals (WinDbg COM supplied interface) calls this(or some) where PEB::IsDebuggerPresent is checked to follow with INT3 **** walk thru frames in disassembly .f+ .f- or: k .frame N **** menu item logging (bp on wndproc, rdx=uMessage r8=wParam (WM_COMMAND==0x111)) bp 00007ff6`31451820 ".if @rdx==0x111 {.printf \"ITEM_ID %08x\\n\", @r8;gc} .else{gc}" **** heap leak (TODO: gc symantics) 0:000:x86> bp MSVCR80D!free ".printf \"%08x free\\n\", dwo(esp+4);gc" 0:000:x86> bp MSVCR80D!malloc "bp /1 @$ra \".printf \\\"%08x malloc\\\\n\\\",eax;g\";g" 0:000:x86> g ... 008d3f80 malloc 008d1190 malloc 008d11d8 malloc 008d1220 malloc 008d1268 malloc 008d3f80 free 008d1190 free 008d11d8 free 008d1220 free ntdll!NtTerminateProcess+0xa: **** stack !uniquestack - show all stacks excluding duplicates !findstack Symbol - locate all stacks that contain Symbol or module ***** verbose and recursive dump type info with sizes 0:000> dt-v-r windowsproject1!_MY_TYPE **** sizeof (c++ eval) ?? sizeof(_IMAGE_NT_HEADERS64) **** step into to leave address bound 0:000> .while(1){t;.if(@rip>0x7ff771a8f000){.break}} **** handle info !handle hnd **** CLR .Net sxr sxe ld clr.dll g //тут ждём окончательной прогрузки CLR.DLL например как завершится заполнение IAT итд .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll // а можно заюзать путь в %Path% и .loadby sos clr // а также: bp $iment(mscoree) ".loadby sos clr;bc*;.chain" bp $iment(mscoree) ".if (@rdx == 2) {.loadby sos clr;bc*;.chain;} .else {gc;}" // или sxe -c ".loadby sos clr;sxn -c \"\" ld clr;.chain" ld clr // или sxe ld clr g .loadby sos clr // //формат: !DllName.ExportFunc 0:008> !sos.t ThreadCount: 3 UnstartedThread: 0 BackgroundThread: 2 PendingThread: 0 DeadThread: 0 Hosted Runtime: no **** kernel connect windbg.exe -b -k com:pipe,port=\\.\pipe\com_1,resets=0,reconnect **** initial break sxe ld ntdll - breaks on return from syscall ntdll!NtMapViewOfSection for specified module - at this point: - IAT not filled - relocs not applied - TLS not invoked **** multiple child procs with specified module // list processes with ids 0..4, attach and look for module xul* .foreach /s (id "0 1 2 3 4"){.echo id; | id s; lmm xul*;.echo --------------------------------------------} **** entrypoint 0:000> bp $iment(768a0000) <-- макрос получающий адрес EP 0:000> bp $iment(ws2_32) <-- макрос получающий адрес EP **** general !analyze -v |~[PID]s //set process (debugging childs etc) ~Ns //set thread (in thread list index. not a TID) **** UM EXCEPTIONS PAGEKD:005C93FB push offset aNoumex ; "NOUMEX" PAGEKD:005C9400 push eax ; char * PAGEKD:005C9401 call _strncmp PAGEKD:005C9406 add esp, 0Ch PAGEKD:005C9409 test eax, eax PAGEKD:005C940B jnz short loc_5C9414 PAGEKD:005C940D mov _KdIgnoreUmExceptions, 1 **** list IAT 0:000> !dh 400000 ... 0 [ 0] address [size] of Bound Import Directory 3000 [ 3C] address [size] of Import Address Table Directory 0 [ 0] address [size] of Delay Import Directory ... 0:000> dps 400000+3000 L3C/4 **** no memory at target address .pagein /p EProcess addr **** expand type info for object at address(-b - recursive) kd> dt nt!_ETHREAD -b Addr **** display process threads and stacktrace for them, then attach to specific thread kd> !process EProcess 6 kd> .thread /p /r EThread (now registers available) set bp: kd> bp /t EThread (/p EProcess) Addr **** breakpoint on line .lines -e bp (@@masm(`main.c:8+`)) Optionally, you can load the source file in WinDBG, set the cursor to the line you want to set a breakpoint to, and hit F9. **** conditional breakpoints: bp kernel32!FindResourceW ".if poi(@esp+8) == 0x0000322A {} .else {gc}" bp mydriver!myFunction ".if (@eax & 0x0`ffffffff) == 0x0`c0004321 {} .else {gc}" bp kernel32!CreateFileW "du poi(@esp+4);kv;gu;? @eax; g" > display arg in unicode, display stack backtrace, complete exec and show result in EAX bp ntdll!LdrxCallInitRoutine ".if poi(@esp+0xc) == 0x00000001 {} .else {gc}" > breakpoint on DLL_PROCESS_ATTACH bp csgohack+0x12345 "r @$t5 = poi(@ebp-3c); .if @$t5 >= 1 & @$t5 <=64 {} .else{? @$t5;gc}" > bp on the range of local variable value **** conditional breakpoint with scriptfile bp advapi32!RegOpenKeyExW "$$<c:\\commands.txt" And then create c:\commands.txt with the following contents: .if (poi(esp+8) != 0) { as /mu ${/v:SubKey} poi(esp+8) } .else { ad /q ${/v:SubKey} } .if ($spat(@"${SubKey}", "Foo*") == 0) { gc } .else { .echo SubKey } **** disassemble pointer uf poi(@fs:[c0]) uf /c show calls uf /c /o show calls and sort as they appears in func code **** memory info !address addr !vprot addr !heap **** logged on user info !kuser **** bp on sourcecode bp source.c:12 Optionally, you can load the source file in WinDBG, set the cursor to the line you want to set a breakpoint to, and hit F9. **** search s 0 L?7FFFFFFF 64 ff 15 c0 00 00 00 s-b 00007ffb`2ae10000 L4c44000 41 57 41 56 41 55 41 54 56 57 55 53 48 83 ec 68 0F 29 74 24 50 4D 89 CC 4D 89 C6 48 89 D6 49 89 **** symbols x module!* -list all symbols in module ln addr -list nearest .sympath+ srv*C:\Symbols*http://msdl.microsoft.com/download/symbols .reload /f mod_name **** operations poi() -dereference pointer -string strstr **** my crazy ideas bp ntdll!LdrpCallInitRoutine -bp when LoadLibrary calls DllMain **** n (Set Number Base) **** kernel to usermode breakpoint 0: kd> !process 0 0 notepad.exe PROCESS fffffa8012256980 SessionId: 1 Cid: 0990 Peb: 7f72f0bf000 ParentCid: 07ac DirBase: 1babb8000 ObjectTable: fffff8a007c7a040 HandleCount: 68. Image: notepad.exe 0: kd> .process /i fffffa8012256980 (Go required) ( .process /p fffffa8012256980 - not requires Go to switch context + safe in multicore mode) ( /r - reload usermode syms ) 0: kd> g 3: kd> .reload 3: kd> bp /p fffffa8012256980 ntdll!ntcreatefile 3: kd> g **** memory dump .writemem c:\temp\string_content.txt 0x0d900024 L?005f7a1c **** PE header and sections info !dh baseaddr **** kd set register context !process .thread **** kd query current thread 0: kd> r @$thread $thread=fffff80002c02cc0 TID: 0: kd> ?? @$thread->Cid **** execution control ~n (Suspend Thread) ~m (Resume Thread) ~f (Freeze Thread) ~u (Unfreeze Thread) **** list thread callstack (um) ~*k *** bp on WM_MESSAGE // if MSG::message == 0x666 bp USER32!DispatchMessageW ".if poi(poi(@esp+4)+4) = 0x666 {} .else {gc}"
Гагой порядочный господин, справочник себе намутил Я пытался сие совершить раз 5 но забил. У них help нормальный в принципе, так что к нему обращался пока не запомнил что-то. Щас уже не вспомню вообще нихрена наверное. Не, я совсем даже и не против того что командный режим повеселее чем тыцкать в окошки и команд там овер дохрена на все случаи жизни. Но просто какбэ сложно объяснить в чем суть скрипта если ты не привык их юзать. Имеется ввиду что ты буквально на лету можешь что-то тестить, где-то что-то патчить, компилить какой-то код и делать трассировку и все одной кнопкой. Ну т.е. в этом есть свои удобства и весьма существенные. Т.е. можно патчить и не скидывать дамп на винт чтобы потом опять заново грузить, искать где ты там что-то патчил... а если ошибся - процедуру надо повторять заново... и весь этот геморой отметается одним маленьким скриптом который все делает за тебя.
я те кстати рекомендую - какими ни было изысками не оперируешь - дневник - это всё. просто без наркоты такие объёмы в голове попросту не удержать. это как линкер, знаешь как работает? у него на входе куча говна, нагенерённая компилятором, и всё это надо объединить в один модуль и прочиее пиздецы, и он сжирает всю дозволенную динамическую память, после чего система валится в подкачку на винте, ну и короче говоря -боттлнек
Про линковку кстати пасиб за хорошую мысль Как-то не задумывался... надо затестить. Дневник... всмысле дневник ? Я когда что-то разбираю - обычно записываю в MindManager какой-нибудь из них. Там в виде дерева можно оформлять все эти изыскания и какбэ если надо запомнить какие-то адреса - туда их в соответствующую ветку. И сразу ясно к чему эти адреса вообще запоминал и что ожидал там найти. Как-то пробовал каждый адрес подписывать - но это слишком дохера времени уходит да и не нужно сие. Что-то такое общее набросал и все понятно относительно. Правда если сделать перерыв дня в 3-4 - все. Можно выбрасывать. Нихрена не понятно что там за херня понаписана
Вооот. А ежели это скрипт - то у тебя есть прям логическая структура. Т.е. до того момента до которого ты дошел - все вроде-как более-менее понятно. Только комментарии надо писать. Но все-равно... небольшой перерыв и все из головы вылетает.
вот это зря - записывай то чем заморачивался. человеческая память - она охуенная штука. я например могу в один момент пересказать имена всех порноактрис на которых дрочил, а в другой момент - как отшибло. тоже самое и в изысканиях с кодингом - можно заснуть с одной идеей, а проснуться нихуя не помня(это я как пропитый алкаш говорю, у зожников вероятно всё не так) что исполнял. хотя это наверное уже пиздец моим мозгам))
Да я ушь сколько лет пытаюсь записывать - постоянно лень Но вообще забываю редко. Обычно я долгих перерывов не делаю, карахтер ебанутый. Пока не доделаю до какой-то логической точки как минимум - хрен успокоюсь. Праздников и выходных у меня все-равно не существует поэтому вроде-как не особо проблема с этим есть. За день - два не забываю обычно. Но вообще было-бы удобнее с нормальным логом действий, намного удобнее. Х/з. Может когда-нибудь в праздничный день свершится сея затея, но пока не выходит
ой блин ну спасибо за чмаки-обнимаки, цем, цем, цем))) но такто тв при запуске дропится в Temp на венде, поэтому исходный код автоматичен и аутотентичен
Не ну а как... человек старался - надо и похвалить. А то критиковать это кажный может !!! Я ж те говорю узрел я FakeWndProc, получение списка тредов и думаю "ну походу Снег подменяет вендовую процЕдурку", потом где-то увидел шаманство с иконкой в трее - думаю точно, скрывает TV с глаз долой. Соответственно цель - создание вредоноса, соответственно TV лучше бы упаковать в ресурсы. Ну... в общем не в ту степь. Кто ж думал что идея совсем полностью другая
да, хорошо что напомнил - ЛЕНЬ! она есть и если хочешь продуктивности - борись с ней всеми возможными методами. например - я начал изучать cppreference.com - почитал, нихуя не понял, отложил на завтра. но нет - остановиться не смог не добившись, а потом в голову себе вдалбливал, а потом поспишь когда - дак оно само заезжает вместе со всеми понятиями и деассемблированием. я понял одно - что если хочешь не просто знать, что на заборе хуй написано, а если хочешь разбираться - придётся работать над собой, примерно так как качки это делают в спортзале. регулярно. такие дела, бро)
Сколько пробовал - насильно нихрена не получается. Кодес пишется вяло, если вообще пишется. Как-то оно хреново получается когда насильно. Поэтому вот стараюсь как-то сделать так чтобы было кайфово и установить соответствующее "настроение". Короче все сложно, но вроде успехи имеются.