Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 1678 сообщений
Cообщения с меткой

рефлексия - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Рефлексия в PowerShell

Понедельник, 02 Мая 2016 г. 17:49 (ссылка)

Немодные вещи куда интересней нежели то, что у всех на слуху и на виду. В мире .NET, например, немодной является рефлексия, о которой знают, но не пользуются в виду преклонения перед мантрами Рихтера. Несомненно, монография «CLR via C#» — лучшее из книг о .NET, однако сам ее автор далеко не везде следует своим же рекомендациям, а потому принимающим на веру абсолютно все написанное в ней, стоит перестать выдавать чужие мысли за свои.



Рефлексия типов действительно достаточно медленная вещь, но не настолько, чтобы отказаться от ее использования вовсе. В случае PowerShell издержки на упаковку и распаковку практически незаметны глазу, поэтому за производительность шибко опасаться не приходится. При этом в некоторых случаях использование рефлексии способно существенно сократить количество кода, что в свою очередь упрощает сопровождение последнего (с чем модники категорически не согласны) и открывает доступ к интимным местам операционной системы в обход оснастке управления (WMI). С точки зрения безопасности это не очень-то и хорошо, но вот в плане системного администрирования — недурственно. Хотя у этого мнения также найдутся свои противники.

Допустим, мы все же решились на использование рефлексии: как наиболее эффективно ее применять в PowerShell? Во-первых, готовых рецептов ни у кого нет, да и вряд ли когда-то будут, ибо самая суть уже описана все в той же «CLR via C#», во-вторых, само по себе понятие «эффективность» относительно, следовательно, рефлексию можно рассматривать лишь как альтернативный вариант решения некоторых задач. В качестве примера — пусть и весьма натянутого, — рассмотрим получение сборок установленных в GAC.



#requires -version 2

$al = New-Object Collections.ArrayList
[Object].Assembly.GetType(
'Microsoft.Win32.Fusion'
).GetMethod('ReadCache').Invoke($null, @(
[Collections.ArrayList]$al, $null, [UInt32]2
))
$al


В отсутствии gacutil пример вполне может заменить собой первый, запускаемый с ключом /l. Впрочем, интереснее методов-оберток могут быть только WinAPI сигнатуры, однако перебирать типы в которых они имеются ILDASM'ом или просто ковыряться в исходных кода .NET платформы не шибко заманчиво. Почему бы не доверить эту работу самому PowerShell?!




function Find-Pinvoke {
<#
.EXAMPLE
PS C:\> Find-Pinvoke Regex
#>
param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[String]$TypeName
)

begin {
if (($base = $TypeName -as [Type]) -eq $null) {
Write-Warning "В текущем домене приложений указанный тип не нйден."
break
}
}
process {
foreach ($type in $base.Assembly.GetTypes()) {
$type.GetMethods([Reflection.BindingFlags]60) | % {
if (($_.Attributes -band 0x2000) -eq 0x2000) {
$sig = [Reflection.CustomAttributeData]::GetCustomAttributes(
$_ # данные о pinvoke методе
) | ? {$_.ToString() -cmatch 'DllImportAttribute'}
New-Object PSObject -Property @{
Module = if (![IO.Path]::HasExtension(
($$ = $sig.ConstructorArguments[0].Value)
)) { "$($$).dll" } else { $$ }
EntryPoint = ($sig.NamedArguments | ? {
$_.MemberInfo.Name -eq 'EntryPoint'
}).TypedValue.Value
MethodName = $_.Name
Attributes = $_.Attributes
TypeName = $type.FullName
Signature = $_.ToString() -replace '(\S+)\s+(.*)', '$2 as $1'
DllImport = $sig
} | Select-Object Module, EntryPoint, TypeName, MethodName, `
Attributes, Signature, DllImport
}
}
} #foreach
}
end {}
}


Как оно работает? Мы передаем название некоторого публичного типа, скажем Regex, функции выше, далее тип проверяется на доступность в текущем домене приложений и извлекаются данные о сигнатурах сборки, в которой этот тип определен. Можно, конечно, вывод перенаправить в XML или любой другой формат, дабы не тратиться на повторное сканирование, но это кому как нравится, да и идея здесь главным образом в том, чтобы не размениваться на поиски сигнатур вручную. А сигнатур, между тем, не просто много, а очень много; особый интерес могут вызвать DeviceIoControl (Systemd.Data.dll), а также NtQueryInformationProcess и NtQuerySystemInformation (System.dll), — и вот здесь мы вплотную подобрались к вещам совершенно немодным: чтению данным по смещениям посредством рефлекторно вызываемых методов. В процессе подбора примера ничего оригинального, кроме как вывести список модулей, загруженных системой, не надумалось, так что будем рассматривать его.




PS C:\> Invoke-Debugger
...
0.000> dt ole32!_rtl_process_modules /r
+0x000 NumberOfModules : Uint4B
+0x004 Modules : [1] _RTL_PROCESS_MODULE_INFORMATION
+0x000 Section : Ptr32 Void
+0x004 MappedBase : Ptr32 Void
+0x008 ImageBase : Ptr32 Void
+0x00c ImageSize : Uint4B
+0x010 Flags : Uint4B
+0x014 LoadOrderIndex : Uint2B
+0x016 InitOrderIndex : Uint2B
+0x018 LoadCount : Uint2B
+0x01a OffsetToFileName : Uint2B
+0x01c FullPathName : [256] UChar
0.000> ?? sizeof(ole32!_rtl_process_modules)
unsigned int 0x120


То есть, размеры структур RTL_PROCESS_MODULES и RTL_PROCESS_MODULE_INFORMATION равны 288 и 284 байт соответственно.




0.000> dt ole32!_system_information_class
...
SystemModuleInformation = 0n11
...


Здорово! Дело за малым.




#function Get-LoadedModules {
begin {
# акселератор типа Marshal
if (($$ = [PSObject].Assembly.GetType(
'System.Management.Automation.TypeAccelerators'
))::Get.Keys -notcontains 'Marshal') {
[void]$$::Add('Marshal', [Runtime.InteropServices.Marshal])
}

$NtQuerySystemInformation = [Regex].Assembly.GetType(
'Microsoft.Win32.NativeMethods'
).GetMethod('NtQuerySystemInformation')
$ret = 0
}
process {
try { # устанавливаем истинный размер буфера
$ptr = [Marshal]::AllocHGlobal(1024)
if ($NtQuerySystemInformation.Invoke($null, (
$par = [Object[]]@(11, $ptr, 1024, $ret)
)) -ne 0) {
$ptr = [Marshal]::ReAllocHGlobal($ptr, [IntPtr]$par[3])
if ($NtQuerySystemInformation.Invoke($null, @(11, $ptr, $par[3], 0)) -ne 0) {
throw New-Object InvalidOperationException('Что-то пошло не так...')
}
}

# считываем интересующую нас информацию относительно смещений
0..([Marshal]::ReadInt32($ptr) - 1) | % {$i = 12}{
New-Object PSObject -Property @{
Address = '0x{0:X}' -f [Marshal]::ReadInt32($ptr, $i)
Size = [Marshal]::ReadInt32($ptr, $i + 4)
Name = [IO.Path]::GetFileName(([Marshal]::PtrToStringAnsi(
[IntPtr]($ptr.ToInt64() + $i + 20), 256
)).Split("`0")[0])
}
$i += 284 # переходим к следующей структуре
} | Select-Object Name, Address, Size | Format-Table -AutoSize
}
catch {
$_.Exception
}
finally {
if ($ptr) { [Marshal]::FreeHGlobal($ptr) }
}
}
end {
[void]$$::Remove('Marshal') # удаляем акселератор
}
#}


Вот таким вот незатейливым способом мы извлекли интересующие нас данные, — ничего сложного. При использовании Add-Type то же заняло примерно одинаковое количество кода, разница лишь в том, что в домене приложений не было создано вспомогательной сборки. Можно ли это считать приятным бонусом или это все же пространство для злокодинг-маневра, вопрос риторический.



Original source: habrahabr.ru.

https://habrahabr.ru/post/282842/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
AllVik

Рефлексия

Суббота, 30 Апреля 2016 г. 20:14 (ссылка)

Это цитата сообщения УхТаВ Оригинальное сообщение


Анкета-рефлексия

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Clockwork_Cherry

про трамваи

Пятница, 29 Апреля 2016 г. 08:13 (ссылка)

"Четверка" - один из моих любимых трамвайных маршрутов и, не только потому, что это чисто тема Сокольников, но еще и из-за того, что он проходит через парк и уютную ламповую "подбелку". Я все никак не привыкну, что оно теперь "Рокоссовского", но, ладно, это дело времени и желания, если честно. Весной я люблю "четверку" особенно: проезжая через парк видишь, как все зеленеет, светится изнутри салатово-желтым светом и дарит одним своим видом надежду на что-то непременно позитивное. Вообще, вот во всем этом сочетаются сразу три потрясающих темы: природа, поездка и город. Я уже не раз говорила, что обожаю кататься, восторгаюсь природой и живу городскими пейзажами. Когда получается зацепить все и сразу - это самый шик. Это, конечно, не "девяносто задом за МКАДом", но тоже более чем прекрасное действие!

Ах, я же забыла отметить, что главная фишка "четверки" - это то, что маршрут кольцевой. То есть, можно сесть в Сокольниках, на Преобраге или Рокоссовского и вернуться ровно туда же, откуда вы начали все. Причем, стороны - левая и правая, - слегка отличаются, так что, иногда я не ленюсь и трачу свое время на оба маршрута с превеликим удовольствием, тем более, под плеер - это идеальный идеал, иначе и не скажешь. Вообще, так как мы все разные, мне всегда было интересно: почему мне нравится одно, кому-то другое, а третий не признает ни мой, ни второй варианты. Это я к чему? Все просто - очень часто, когда я рассказываю о том, что люблю кататься на трамвае, машине или электричке, люди недоумевают, мол, как такое может нравится, это не серьезно, это бесцельно и так далее.

Вот, насчет цели я могу сразу возразить: цель у меня есть и она вполне себе оправданная и справедливая - я хочу получить удовольствие от поездки же! Тем более, обычно я катаюсь на трамвае, когда у меня какие-то дела в тех районах, а время позволяет потратить лишний час на трамвай, а не толкаться в метро. Но, почему-то, обычно эти фишки люди игнорируют. Они видят только результат: человек катается на трамвае и говорит об этом, а вот какие там причины и мотивы - это лишнее. Вообще, когда дело касается людей, такие методы для меня - это как кость в горле, потому что ну всегда очевидно же, что если человек что-то делает и не один раз, то, получается, у него есть какие-то свои фишки на этот счет, не так ли? К примеру, у меня знакомая везде гоняет на машине - даже в соседний магазин, - я вот допускаю, что у нее на это свои причины и не лезу. Тут, примерно, аналогичная же ситуация.

Вообще, все, что касается увлечений и интересов - это всегда какая-то больная тема выходит! Очень часто получается так, что вот любишь ты что-то, а для людей вокруг это или детский сад, или еще какая-то фигня, совершенно бездумная, бесцельная и занудная. И, как бы ты не любил пейзажи за окном, скорость, музыку в плеере, зеленеющий лес - все это обязательно разобьется о стену чьего-то непонимания и чьей-то предвзятости. Люди такие люди! Причем, самое занятное, но очень много неадекватов не могут не высказать свое мнение - это так необходимо, что я иногда думаю, что это я какая-то странная, потому что держу мнение при себе, а не высказываю его всем направо и налево. Надо задуматься над своим поведением и пересмотреть его, а то, блин, совсем я от рук отбилась, что говорить!

Хотя, весь этот негатив все равно не мешает мне по весне наслаждаться трамвайными покатушками - в выходные дни тут вообще шикарно: людей нет, сидишь, тебя никто не толкает, не дергает, музыка играет. Садишься в Сокольниках, выходишь на Рокоссовского - делаешь не полный круг! - и обратно, чтобы дважды через Яузу, через Ростокино, через парк, по этой весенней зелени, по этим тихим улочкам. И, как-то во всем этом сквозит невероятная бесконечность, вне людей, вне их мнения и суждений, вне материи и ограниченного пространства - это сложно передать словами, но оно есть, и, это - главное! И да, в такие моменты, почему-то, всегда вспоминаю начало книг про сэра Макса из Ехо, где тоже были трамваи, как проводники в миры чудес. Может быть, именно поэтому, меня это все так и манит, а?

zWS04GBZP7s (700x467, 95Kb)

Метки:   Комментарии (4)КомментироватьВ цитатник или сообщество
Clockwork_Cherry

о чем я люблю читать

Вторник, 19 Апреля 2016 г. 08:12 (ссылка)

Кстати, вот я тут подумала, а какие бы книги я назвала идеальным отражением того, о чем мне интересно читать? И, несмотря на обилие авторов, все равно выделяются несколько человек, кто отлично пишут о том, что мне приятно и интересно. Вообще, как я часто говорю, но мне всегда приятно читать про что-то хорошее: про хорошие отношения, про хорошие события, про хорошие приключения и так далее, то есть, про трагизьм и реализьм я, конечно же, прочту, но, скорее всего, книга меня не зацепит: ведь даже в "Убить пересмешника", несмотря на преступление, все равно главное - это добро, это отношения, это позитив. Или вот, вроде как более чем годный Перумов, но его мрачность и постоянный акцент на негативе почему-то не дают мне до конца согласиться с его творчеством и принять его, хотя считаю автора одним их любимых с детства.

Прежде всего, я хочу, конечно же, отметить Макса Фрая - его мир Ехо идеален для меня чуть более чем полностью: тотальный гедонизм, все легко и просто, даже какие-то серьезные темы всегда решаются или же почему-то остаются светлым впечатлением, а не несут в себе негатив и упадничество, все персонажи - даже самые негодяйские, - на деле нормальные люди, даже главгад многих книг оказывает ровным мужиком в итоге. Да и как такового "зла" или глобального негатива там нет, есть спорные моменты, которые оцениваешь по-разному, но и они не особо задевают, не заставляют переживать и мучиться. Если честно, я бы хотела "туда" попасть - этот мир, в отличие от всяких хоббитов и прочих товарищей именно что манит и является для меня неким идеалом, образцовым местом, эталоном.

Если брать не выдуманные миры, то мне очень нравятся такие авторы, как Харрис - ее "Ежевичное вино" для меня вообще является неким образцом позитива, - та же Гавальда с ее легкими прекрасными книгами про людей, Лу и его попытки заглянуть вглубь человека, но, при этом, не вдаваясь в психологизмы и прочий пафос. Авторов много - и все их книги заряжают меня чем-то особенным. "Случайная вакансия" - как я уже писала в комментарии, - оставляет надежду на исправление и долгое послевкусие отлично подсмотренной жизни небольшого городка. "Пощечина" - это просто невообразимый портрет столь разных людей, полный пусть и отчаяния, пусть и какой-то безвозвратно упущенной возможности, но яркий и мощный. В общем, даже книги про реальных людей, пусть не всегда столь гладкие, как истории про Ехо - это тоже тот вариант, который меня устраивает.

Если брать авторов более "серьезных", то тут даже Стейнбек, с его суровой реальностью тоже бывает прекрасен - даже "Гроздья гнева" по-своему хороши, а уж "Консервный ряд" - это вообще отличная тема про людей, про жизнь, про быт, про все то, что нас окружает и чем живет каждый человек, по сути. Главное - чтобы в этих книгах было именно описание людей, их жизни, мыслей, чувств, действий и поступков. Это как читать "Мартина Идена" и ярко представлять все то, что его окружает - вот какие книги мне интересны. Самое любопытное, но нередко я совершенно игнорирую какой-то авторский посыл, мораль и так далее, если сами герои книги и описания в ней хороши настолько, что получается действительно не замечать все остальное. Если же я начинаю задумываться о многих вещах - значит, книга не зашла. Это парадокс.

В общем, картина, на мой взгляд, вырисовывается более чем понятная: акцент на людях, на том, чем они живут, что делают и так далее. Кстати, я вспомнила забавный момент. Еще в детстве мне нравилось изучать картинки или фотографии в книгах, представляя, что чувствуют люди, которые там изображены, о чем думают, чем живут. Я придумывала свои истории. И, конечно же, я обожала и обожаю заглядывать в окна по вечерам, приходя в восторг от стольких вариантов, стольких возможностей, стольких людей вокруг. Самое интересное, что очень многих людей такое напрягает, раздражает, им скучно, непонятно и так далее, равно как и мне непонятно, что они находят в научных темах, в детективах или боевиках. Иногда, когда я пристальней вглядываюсь в людей вокруг, я понимаю, что мы еще не так уж потеряны, главное - всегда помнить об этом и не терять это из виду.

Метки:   Комментарии (1)КомментироватьВ цитатник или сообщество

Следующие 30  »

<рефлексия - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda