Fråga:
Hur ser jag parametrarna skickas till RegOpenKeyEx och ställer in en villkorlig brytpunkt?
Justin Dearing
2013-05-02 01:49:48 UTC
view on stackexchange narkive permalink

Jag har WinDbg kopplad till en process som jag inte har källkoden till. Jag har satt en brytpunkt med bm ADVAPI32! _RegOpenKeyExW @ 20 . Utgången från dv är:

  Det går inte att räkna upp lokalbefolkningen, HRESULT 0x80004005Privata symboler (symbols.pri) krävs för lokalbefolkningen. Skriv ".hh dbgerr005" för detaljer.  

Utgången från kP är:

  0: 000> kPChildEBP RetAddr 001ae174 5b73a79c ADVAPI32! _RegOpenKeyExW @ 20001ae1cc 5b77bb20 msenv!? ReadSecurityAddinSetting8 @ @ G! QueryStatusCmd @ CVSCommandTarget @@ QAEJPBVCIcmdGuidCmdId @@ PBU_GUID @@ KQAU_tagOLECMD @@ PAU_tagOLECMDTEXT @@@ Z + 0x254001ae49c 5b786073 msenv? IsCommandVisible @ CVSShellMenu @@ QAEJPBVCIcmdGuidCmdId @@ _ N @ Z + 0xbf001ae4e4 5b785fd2 msenv? IsCommandVisible @ CSurfaceCommandingSupport @@ UAGJABU_COMMANDTABLEID @@ _NPAH @ Z + 0xa0. . .  

Vad kan jag göra för att titta på parametrarnas skickade värden (särskilt den andra: LPCTSTR lpSubKey )? Vad kan jag också göra för att ställa in en villkorlig brytpunkt baserat på värdet?

Jag har Visual Studio-felsökaren liksom WinDbg. Jag är också villig att prova andra verktyg.

Fem svar:
Brendan Dolan-Gavitt
2013-05-02 03:11:33 UTC
view on stackexchange narkive permalink

Detta är möjligt i WinDbg, men syntaxen är inte den största. De andra svaren är förmodligen bättre om du bara vill få ett resultat snabbt. Som sagt, så här skulle du göra det.

RegOpenKeyExW är en stdcall-funktion, och det ser ut som om du är på en 32-bitarsversion av Windows, så när du går in i funktionen kommer det första argumentet att vara vid ESP + 4 , den andra vid ESP + 8 , etc. Underskriften för den är:

  LÅNG WINAPI RegOpenKeyEx (_In_ HKEY hKey, _In_opt_ LPCTSTR lpSubKey, _Reserved_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult);  

Så vid ESP + 8 hittar du en pekare till en null-avslutad Unicode-sträng ( lpSubKey ). Du kan testa detta genom att ställa in en ovillkorlig brytpunkt på RegOpenKeyExW och sedan använda du poi (esp + 8) för att skriva ut strängen.

För att göra nästa bit - stoppa när värdet av lpSubKey är lika med något mönster, du kan kolla in MSDNs dokumentation, som innehåller ett exempel på att göra exakt det. Jag har inte tillgång till en Windows-maskin för tillfället, men följande bör göra vad du vill (anpassat från MSDN-exemplet):

  bp advapi32! RegOpenKeyExW "$$ <c: \ \ commands.txt " 

Och skapa sedan c: \ commands.txt med följande innehåll:

  .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}  

Du kan ersätta " Foo * " i ovanstående med alla giltiga jokertecken för strängar.

Att bryta ner detta, den första .om ställer in ett alias med namnet SubKey lika med innehållet i unicode-strängen vid esp + 8 . Den andra raden matchar den strängen mot mönstret "Foo *" ; om det inte matchar används gc för att fortsätta körningen utan att stoppa. Om den matchar skriver .echo SubKey ut strängen och bryts sedan.

Bra svar. Jag föraktar den mystiska syntaxen för WinDbg-skriptet, men du spikade det verkligen :)
Det är coolt. Jag antar att utan tillgång till rubrikerna finns det inget sätt att förutsäga parametertyperna, så om jag ville skapa ett windbg-plugin för att automatisera detta skulle jag behöva alla huvudversioner.
Ja, tyvärr stämmer det. Inuti MS har de tillgång till privata symboler, vilket ger dem typerna av argument. Du kan ibland se detta eftersom vissa av de inbyggda WinDbg-tilläggen misslyckas när de körs utanför Microsoft ...
@JustinDearing: boken ["Odokumenterade Windows 2000-hemligheter" av Sven B. Schreiber] (http://undocumented.rawol.com/) IIRC har implementerat ett schema som kräver en tabell med "formatsträngar" och kommer då att kunna ge dig parametrarna. Boken finns nu som en kostnadsfri PDF-fil. Jag är också frestad att återställa mitt svar, men då är jag osäker på dina exakta krav.
@0xC0000022L, en vän till mig, gjorde min bok uppmärksam under vår [windows internals studiegrupp] (https://groups.google.com/forum/#!forum/nynj-winternals-studygroup). Jag har laddat ner den. Jag ska titta dit. Det andra alternativet jag övervägde var att använda Rohits XML som har all rubrikinformation.
@JustinDearing: bestämde sig för att återställa mitt svar, kanske det är till nytta för dig ändå.
@0xC0000022L Det är inte något jag skulle använda för tillfället, men ja det är bra för referens, och andra kanske tycker att det är användbart. Också en annan anledning för mig att lära mig python.
0xC0000022L
2013-05-02 02:42:03 UTC
view on stackexchange narkive permalink

Jag har haft de bästa upplevelserna med PaiMei, eller särskilt PyDbg för dessa ändamål. Boken "Grayhat Python" väckte den till min uppmärksamhet och jag bestämde mig för att prova.

Skriptet

Här är ett något generiskt skelett jag har använt i min dynamiska analys (). Jag har justerat det så att det kommer att koppla Unicode-versionen av den funktion du är intresserad av att koppla till.

Svaret kanske inte är perfekt, eftersom du kan uppnå ett villkorligt brott, men du måste för att lägga till den interaktiva felsökningsdelen i skriptet. Om du ville vreak istället för att fortsätta, måste du be felsökaren att göra just det genom att ändra raden returnera DBG_CONTINUE .

  importera sysimport ctypesimport tracebacktry: från pydbg import * från pydbg.definerar import * från verktyg importera hookingexcept: skriv "FEL: du behöver pydbg och utils.hooking från PAIMEI." sys.exit (-1) reg = Noneclass reg_pydbg (pydbg): @staticmethod def __getlen (mbi, address): # Vad är det maximala antalet byte vi kan läsa? _maxlen = 64 * 1024 absmaxlen = (mbi.BaseAddress + mbi.RegionSize) - adress om absmaxlen > _maxlen: return _maxlen return absmaxlen def rootkey_const (self, key): if 0x80000000 == key: return "HKCR" elif 0x8000000 : returnera "HKCU" elif 0x80000002 == nyckel: returnera "HKLM" elif 0x80000003 == nyckel: returnera "HKU" elif 0x80000004 == nyckel: returnera "HKEY_PERFORMANCE_DATA" elif 0x80000050 == tangent: returnera "HKEY_PERFORMANCE_TEXT60 = key = elif 0x : returnera "HKEY_PERFORMANCE_NLSTEXT" elif 0x80000005 == nyckel: returnera "HKEY_CURRENT_CONFIG" elif 0x80000006 == nyckel: returnera "HKEY_DYN_DATA" elif 0x80000007 == nyckel: returnera "HKEY_CURRENT_USER_LOC
returnera "0x% 08X"% (key) def readmem (self, address, len = 0): try: mbi = self.virtual_query (address) utom: return None, "% 08X <invalid ptr>"% (address) if mbi. Skydda & PAGE_GUARD: # inget sätt att visa innehållet på en skyddssida returnerar inget, "% 08X <guard page>"% (adress) om 0 == len: # försök att göra en bra gissning då len = själv .__ getlen (mbi, adress ) try: explored = self.read_process_memory (address, len) utom: return None, "% 08X <ReadProcessMemory failed>"% (address) return explored, None def readstring (self, address, unicodeHint = False, returnNone = False): om 0 == adress: om returnNone: return None return "<nullptr>" utforskad, retval = self.readmem (adress) om den inte undersöktes: om returnNone: retur Ingen retur retval explored_string = Ingen om inte unicodeHint: explored_string = self.get_ascii_string (utforskad) om inte explored_string: explored_string = self.get_unicode_string (utforskad) om inte explored_string: explored_string = self.get_printable_string (explored) return explored_string , ret): keyname = dbg.readstring (args [1], True) print "RegOpenKeyExW (% s,% s, ...) ->% s (% d)"% (dbg.rootkey_const (args [0] ), keyname, ctypes.FormatError (ret), ret) return DBG_CONTINUEclass reghooks: fct2hook = {"advapi32.dll": {"RegOpenKeyExW": {"args": 5, "entry": None, "exit": exit_RegOpenKeyExW} ,},} hooked = {} hookcont = None dbg = None def __init__ (self, dbg): self.hookcont = hooking.hook_container () self.hooked = {} self.dbg = dbg
dbg.set_callback (LOAD_DLL_DEBUG_EVENT, self.handler_loadDLL) def hookByDLL (self, dll): om inte dll.name.lower () i self.hooked: för nyckel, värde i self.fct2hook.items (): om key.lower ( ) == dll.name.lower (): self.hooked [dll.name.lower ()] = 1 tryck "% s vid% 08x"% (dll.name, dll.base) för funk, fctprops i värde. objekt (): post = Ingen; exit = Ingen; args = 0 om "entry" i fctprops och None! = fctprops ["entry"]: skriv ut "\ tentry hook" + func entry = fctprops ["entry"] om "exit" i fctprops och None! = fctprops ["exit "]: skriv ut" \ texit hook "+ func exit = fctprops [" exit "] om" args "i fctprops och None! = fctprops [" args "]: args = fctprops [" args "] om None! = post eller Ingen! = Exit: funcaddr = self.dbg.func_resolve (dll.name, func) self.hookcont.add (self.dbg, funcaddr, args, entry, exit) else: self.hooked [dll.name.lower () ] + = 1 retur @staticmethod def handler_loadDLL (dbg): global reg dbg.hide_debugger () last_dll = dbg.get_system_dll (-1) reg.hookByDLL (last_dll) return DBG_CONTINUEdef main (): dbg = reg_pydbg () dbg.load ("C: \\ Windows \\ regedit.exe") global reg reg = reghooks (dbg) dbg.run () if __name__ == "__main__": main ()  

Exempel på utdata

  >C: \ Python26 \ python.exe hookreg.pyadvapi32.dll vid 75840000 exit hook RegOpenKeyExWRegOpenKeyExW (HKCU, Software \ Microsoft \ Windows \ CurrentVersion \ Applets \ Regedit , ...) -> Åtgärden slutfördes. (0)
RegOpenKeyExW (HKLM, SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ FontLink \ SystemLink, ...) -> Åtgärden har slutförts. (0) RegOpenKeyExW (HKLM, SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ LanguagePack \ DataStore_V1.0, ...) -> Åtgärden slutfördes. (0) RegOpenKeyExW (HKLM, SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ LanguagePack \ SurrogateFallback, ...) -> Åtgärden har slutförts. (0)  

Förklaring

De viktiga delarna är:

  "RegOpenKeyExW": {"args": 5, "entry ": Ingen," exit ": exit_RegOpenKeyExW},  

och funktionen exit_RegOpenKeyExW . Du kan också ändra ovanstående för att bara koppla vid inmatning RegOpenKeyExW istället för vid utgång eller för att göra båda. Beror på vad du vill uppnå.

Jag har använt den här metoden för att avkoda buffertar ( SCSI_PASS_THROUGH_DIRECT och SCSI_PASS_THROUGH ) skickas via DeviceIoControl kod>, så ovanstående är överlägset inte det mest komplexa du kan göra.

På en annan anteckning har jag också anslutit saker som att öppna filer (eller registernycklar) och hållit listor över de returnerade handtagen längs med strängformen av vad de är. På det här sättet kunde jag implementera ganska komplexa mänskligt läsbara loggningsscenarier.

Motiv

Anledningen till att saker som den kapslade ordboken finns är så att den lätt kan utökas för att koppla in vilken funktion som helst DLL, tack. Naturligtvis kan det också vara hårdkodat, men jag har haft scenarier där jag kopplade in dussintals funktioner.

blabb
2013-05-05 01:42:04 UTC
view on stackexchange narkive permalink

Med OllyDbg kan du göra det så här

  F: \ odbg110>regedit & tasklist / fi "imagename eq rege *" Image Name PID Session Name Session # Mem Usage ====== ========================== ========================= = =========== regedit.exe 2820 Konsol 0 2,512 KF: \ odbg110>ollydbg -P 2820F: \ odbg110>  

I OllyDbg slog Alt + g (goto) skriv advapi32.RegOpenKeyExW och tryck Enter . Om du använder Windows XP SP3 ska det se ut så här:

  77DD6AAF ADVAPI32.RegOpenKeyExW U> / $ 8BFF MOV EDI, EDI  

Hit Ctrl + F4 (villkorlig loggbrytpunkt)

I redigeringsrutan "villkor" anger du säga (inga jokertecken behöver ett giltigt undantaget mönster)

  UNICODE [[esp + 8]] == "system \\ CurrentControlSet \\ Services \\ Beep" 

I redigeringsrutan "förklaring" anger du någon förklaring som du vill ha

  logga RegOpenKeyExW undernyckel  

Ange redigeringsrutan för uttrycket

  [esp + 8]  kod > 

Välj "pekare till Unicode-sträng" i "Avkodningsvärde"

  pausprogram på villkorsvärde för uttrycklogg alltid funktionsargument på villkor  

(allt detta kan göras utan att pausa debuggee) (dynamiska brytningsinsättningar)

Gå nu till regedit och leka med det lite och välj "Beep Service "

OllyDbg kommer att bryta och wi Låt också funktionsargumenten loggas; och du kommer att ha alla andra strängar loggade också utan paus, som nedan

  LoggdataAddress Message77DD6AAF COND: log reop Subkey = 0007FBC8 "SYSTEM \ CurrentControlSet \ Services \ aswMonFlt" 77DD6AAF COND: log reop Subkey = 0007FBC8 "SYSTEM \ CurrentControlSet \ Services \ aswRdr" 77DD6AAF COND: log reop Subkey = 0007FBC8 "SYSTEM \ CurrentControlSet \ Services \ aswRvrt"
77DD6AAF COND: log reop Undernyckel = 0007FBC8 "SYSTEM \ CurrentControlSet \ Services \ aswSnx" 77DD6AAF COND: log reop Subkey = 0007FBC8 "SYSTEM \ CurrentControlSet \ Services \ aswSP" 77DD6AAF COND: log reop Undernyckel = 0007 "77DD6AAF COND: log reop Subkey = 0007FBC8" SYSTEM \ CurrentControlSet \ Services \ aswVmm "77DD6AAF COND: log reop Subkey = 0007FBC8" SYSTEM \ CurrentControlSet \ Services \ avast! Antivirus "77DD6AAF COND: log reop SubBC Tjänster \ Beep "77DD6AAF SAMTAL till RegOpenKeyExW från regedit.01008B23 hKey = HKEY_LOCAL_MACHINE Undernyckel =" SYSTEM \ CurrentControlSet \ Services \ Beep "Reserverad = 0 Åtkomst = 2000000 pHandle = regedit.0101909877DD6AAV villkorsavsnitt = >
använd [formateringen ordentligt] (http://reverseengineering.stackexchange.com/editing-help). Båda dina svar hittills hade hemska formateringsproblem i sin ursprungliga form.
Mick
2013-05-02 02:14:26 UTC
view on stackexchange narkive permalink

Ladda ner Rohitabs API Monitor och ställ in API-inspelningsfiltret på bara RegOpenKeyEx . Nedan följer bara några exempel på skärmdumpar av hur det fungerar och vilken information det ger.

Från vad du beskrev bör detta göra precis vad du behöver.

enter image description here

enter image description here

Detta visar mig parametervärdena. Men det låter mig inte villkorligt bryta baserat på dem. Mitt problem är att appen hela tiden läser många registervärden. Jag bryr mig bara när den läser vissa.
Korrekta, villkorliga brytpunkter stöds för närvarande inte. FWIW, författaren nämnde på webbplatsens forum att han planerar att lägga till det i en kommande release.
Dessutom tillåter API Monitor dig att söka igenom de fångade API-uppgifterna. Även om det inte är precis vad du letar efter (villkorliga brytpunkter), kommer lite CTRL + F och F3 att ta dig dit.
Remko
2013-05-15 17:46:10 UTC
view on stackexchange narkive permalink

Även om det inte stöder brytpunkter är Process Monito r ett utmärkt verktyg för att övervaka registeråtkomst. Med hjälp av filter kan du enkelt välja vilka nycklar du vill inkludera, utesluta, markera osv. Det låter dig också visa stapelspåret för alla händelser. som visar filsystem, register och process- / trådaktivitet i realtid. Den kombinerar funktionerna i två äldre Sysinternals-verktyg, Filemon och Regmon, och lägger till en omfattande lista över förbättringar inklusive omfattande och icke-destruktiv filtrering, omfattande händelseegenskaper som sessions-ID och användarnamn, pålitlig processinformation, full trådstaplar med integrerat symbolstöd för varje operation, samtidig loggning till en fil och mycket mer. Dess unikt kraftfulla funktioner kommer att göra Process Monitor till ett kärnverktyg i ditt system för felsökning och jaktverktyg för skadlig programvara.

enter image description here enter image description here

I do use ProcessMonitor.


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...