{"id":967,"date":"2016-12-18T19:25:01","date_gmt":"2016-12-18T18:25:01","guid":{"rendered":"http:\/\/piatkosia.k4be.pl\/wordpress\/?p=967"},"modified":"2016-12-18T19:26:25","modified_gmt":"2016-12-18T18:26:25","slug":"ilspy-szpiegujemy-szpiega","status":"publish","type":"post","link":"https:\/\/piatkosia.k4be.pl\/wordpress\/2016\/12\/18\/ilspy-szpiegujemy-szpiega\/","title":{"rendered":"ILSPY &#8211; SZPIEGUJEMY SZPIEGA"},"content":{"rendered":"<p style=\"text-align: justify;\">Hej,<\/p>\n<p style=\"text-align: justify;\">Z g\u00f3ry przepraszam \u017ce mnie wci\u0119\u0142o, poci\u0105gi mi bokiem wychodz\u0105, jak i ta ca\u0142a praca. Nie tak dawno temu min\u0105\u0142 mi rok, z czego si\u0119 bardzo ciesz\u0119. Jeszcze tylko rok i milestone przepracowa\u0107 pierwsze dwa lata \u017cycia b\u0119dzie zaliczony.<\/p>\n<p style=\"text-align: justify;\">Kiedy akurat nie czytam ksi\u0105\u017cki, nie \u015bpi\u0119 lub nie pracuj\u0119, przegl\u0105dam inne blogi. Siedz\u0119 a to na dotnetomaniaku, a to u kt\u00f3rego\u015b ze slackowych (ircowym co\u015b si\u0119 nie chce blogowa\u0107 ostatnio) znajomych odpal\u0119 arta czy dwa, no i okaza\u0142o si\u0119, \u017ce <a href=\"http:\/\/devstyle.pl\/\">procent<\/a> robi fajny konkurs. Tzn nie tyle konkurs fajny (acz nagroda przednia), co propozycje temat\u00f3w. Art nie pasuje do \u017cadnej z kategorii, ale nawi\u0105zuje tematycznie do ca\u0142ego wydarzenia. No mo\u017ce troch\u0119. A z pewno\u015bci\u0105 stanowi\u0142o inspiracj\u0119. Tak czy inaczej, zapraszam do lektury.<\/p>\n<p><!--more--><\/p>\n<p style=\"text-align: justify;\">Jest sobie ILSpy. Taaka zabawka, bierzesz binark\u0119, podgl\u0105dasz kod. Zwykle jest on podobny do tego, jaki si\u0119 napisze. No w\u0142a\u015bnie, zwykle. \u017beby nie powiedzie\u0107 tylko wtedy, kiedy trzymasz si\u0119 z dala od generyk\u00f3w, dynamic\u00f3w i ca\u0142ej masy innego ciekawego \u015bmiecia. Ok, tak naprawd\u0119, to jest w stanie zgadn\u0105\u0107 w miar\u0119 dok\u0142adnie wy\u0142\u0105cznie dla prostych przypadk\u00f3w. To znaczy skompilowany kod wypluty przez ILSpy nadal b\u0119dzie dzia\u0142a\u0107 tak jak oczekujemy, ale ju\u017c jego utrzymanie nie by\u0142oby tak prost\u0105 rzecz\u0105, wi\u0119c je\u015bli kto\u015b planuje podkrada\u0107 kod z binarek przy u\u017cyciu ILSpy (pami\u0119tacie kalkulatorek?) to przynajmniej nie je\u017adzi po bogu ducha winnej istocie, \u017ce brzydki kod pisze.<\/p>\n<p style=\"text-align: justify;\">[tu mia\u0142o by\u0107 kilka screen\u00f3w z VS, ale ten niestety postanowi\u0142 si\u0119 na mnie zez\u0142o\u015bci\u0107 i jeszcze mu nie przesz\u0142o- nadal jest fioletowy. Tak\u017ce pos\u0142u\u017c\u0119 si\u0119 plaintextem].<\/p>\n<p style=\"text-align: justify;\">We\u017amy sobie taki oto kodzik.<\/p>\n<pre class=\"brush: csharp; collapse: true\">\r\nusing System;\r\n\r\nnamespace Simple_gettype\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            string stringvariable = \"Jestem stringiem\";\r\n            Double doublevariable = 12;\r\n            Console.WriteLine(stringvariable.GetType().ToString());\r\n            Console.WriteLine(doublevariable.GetType().ToString());\r\n            Console.ReadKey();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p style=\"text-align: justify;\">No niby nic, generalnie ca\u0142o\u015b\u0107 polega na tym, \u017ce printujemy typ danej zmiennej. Ca\u0142e 5kb binarki, do tego 12kb symboli;).<br \/>\nAby kompilator nie robi\u0142 za du\u017co optymalizacji, kompilujemy nasz kodzik w debugmodzie, a nast\u0119pnie pr\u00f3bujemy podejrze\u0107 go w ilspy.<\/p>\n<p style=\"text-align: justify;\">No i ctrl+O, \u015bcie\u017cka do projektu, ciach. Prze\u0142\u0105czam podgl\u0105d kodu na c# i \u2026<\/p>\n<pre class=\"brush: csharp; collapse: true\">\r\nnamespace Simple_gettype\r\n{\r\n\tinternal class Program\r\n\t{\r\n\t\tprivate static void Main(string[] args)\r\n\t\t{\r\n\t\t\tstring stringvariable = \"Jestem stringiem\";\r\n\t\t\tdouble doublevariable = 12.0;\r\n\t\t\tConsole.WriteLine(stringvariable.GetType().ToString());\r\n\t\t\tConsole.WriteLine(doublevariable.GetType().ToString());\r\n\t\t\tConsole.ReadKey();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n<\/pre>\n<p style=\"text-align: justify;\">Hmm\u2026 poradzi\u0142 sobie ca\u0142kiem nie\u017ale, poza .0 przy 12 dla double kod jest znak w znak taki sam.<br \/>\nNo to zadanie \u201ew szkole\u201d wykonane prawid\u0142owo.<\/p>\n<p style=\"text-align: justify;\">P\u00f3jd\u017amy sobie w takim uk\u0142adzie kroczek dalej. Zadanie \u201ena sprawdzianie\u201d. Popro\u015bmy o podanie typu, kt\u00f3rego kompilator nie zna. Te\u017c 2 razy. Aby tego dokona\u0107 u\u017cyjemy typu dynamicznego i jeszcze (by sobie nie zgad\u0142 optymalizuj\u0105c) do\u0142\u0105czymy delikatny czynnik losowo\u015bci. No to jak?<\/p>\n<p style=\"text-align: justify;\">Kod dla tego przyk\u0142adu b\u0119dzie taki:<\/p>\n<pre class=\"brush: csharp; collapse: true\">\r\nusing System;\r\n\r\n\r\nnamespace lessSimpleGettype\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            Random rand = new Random();\r\n            bool startfromstring = false;\r\n            int r = rand.Next() % 2;\r\n            if (r == 1) startfromstring = true;\r\n            if (r == 0) startfromstring = false;\r\n            dynamic first;\r\n            dynamic second;\r\n            string stringvariable = \"Jestem stringiem\";\r\n            Double doublevariable = 12;\r\n            if (startfromstring == true)\r\n            {\r\n                first = stringvariable;\r\n                second = doublevariable;\r\n            }\r\n            else\r\n            {\r\n                first = doublevariable;\r\n                second = stringvariable;\r\n            }\r\n            Console.WriteLine(first.GetType().ToString());\r\n            Console.WriteLine(second.GetType().ToString());\r\n            Console.ReadKey();\r\n\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p style=\"text-align: justify;\">Binarka tym razem ma 6KB, symbole 14. A co na to Ilspy? No dobrze, \u017ce mam tu zawijaczk\u0119 kodu.<\/p>\n<pre class=\"brush: csharp; collapse: true\">\r\nusing Microsoft.CSharp.RuntimeBinder;\r\nusing System;\r\nusing System.Runtime.CompilerServices;\r\n\r\nnamespace lessSimpleGettype\r\n{\r\n\tinternal class Program\r\n\t{\r\n\t\t[CompilerGenerated]\r\n\t\tprivate static class <>o__0\r\n\t\t{\r\n\t\t\tpublic static CallSite<Func<CallSite, object, object>> <>p__0;\r\n\r\n\t\t\tpublic static CallSite<Func<CallSite, object, object>> <>p__1;\r\n\r\n\t\t\tpublic static CallSite<Action<CallSite, Type, object>> <>p__2;\r\n\r\n\t\t\tpublic static CallSite<Func<CallSite, object, object>> <>p__3;\r\n\r\n\t\t\tpublic static CallSite<Func<CallSite, object, object>> <>p__4;\r\n\r\n\t\t\tpublic static CallSite<Action<CallSite, Type, object>> <>p__5;\r\n\t\t}\r\n\r\n\t\tprivate static void Main(string[] args)\r\n\t\t{\r\n\t\t\tRandom rand = new Random();\r\n\t\t\tbool startfromstring = false;\r\n\t\t\tint r = rand.Next() % 2;\r\n\t\t\tbool flag = r == 1;\r\n\t\t\tif (flag)\r\n\t\t\t{\r\n\t\t\t\tstartfromstring = true;\r\n\t\t\t}\r\n\t\t\tbool flag2 = r == 0;\r\n\t\t\tif (flag2)\r\n\t\t\t{\r\n\t\t\t\tstartfromstring = false;\r\n\t\t\t}\r\n\t\t\tstring stringvariable = \"Jestem stringiem\";\r\n\t\t\tdouble doublevariable = 12.0;\r\n\t\t\tbool flag3 = startfromstring;\r\n\t\t\tobject first;\r\n\t\t\tobject second;\r\n\t\t\tif (flag3)\r\n\t\t\t{\r\n\t\t\t\tfirst = stringvariable;\r\n\t\t\t\tsecond = doublevariable;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tfirst = doublevariable;\r\n\t\t\t\tsecond = stringvariable;\r\n\t\t\t}\r\n\t\t\tif (Program.<>o__0.<>p__2 == null)\r\n\t\t\t{\r\n\t\t\t\tProgram.<>o__0.<>p__2 = CallSite<Action<CallSite, Type, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.ResultDiscarded, \"WriteLine\", null, typeof(Program), new CSharpArgumentInfo[]\r\n\t\t\t\t{\r\n\t\t\t\t\tCSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.IsStaticType, null),\r\n\t\t\t\t\tCSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)\r\n\t\t\t\t}));\r\n\t\t\t}\r\n\t\t\tAction<CallSite, Type, object> arg_15D_0 = Program.<>o__0.<>p__2.Target;\r\n\t\t\tCallSite arg_15D_1 = Program.<>o__0.<>p__2;\r\n\t\t\tType arg_15D_2 = typeof(Console);\r\n\t\t\tif (Program.<>o__0.<>p__1 == null)\r\n\t\t\t{\r\n\t\t\t\tProgram.<>o__0.<>p__1 = CallSite<Func<CallSite, object, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.None, \"ToString\", null, typeof(Program), new CSharpArgumentInfo[]\r\n\t\t\t\t{\r\n\t\t\t\t\tCSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)\r\n\t\t\t\t}));\r\n\t\t\t}\r\n\t\t\tFunc<CallSite, object, object> arg_158_0 = Program.<>o__0.<>p__1.Target;\r\n\t\t\tCallSite arg_158_1 = Program.<>o__0.<>p__1;\r\n\t\t\tif (Program.<>o__0.<>p__0 == null)\r\n\t\t\t{\r\n\t\t\t\tProgram.<>o__0.<>p__0 = CallSite<Func<CallSite, object, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.None, \"GetType\", null, typeof(Program), new CSharpArgumentInfo[]\r\n\t\t\t\t{\r\n\t\t\t\t\tCSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)\r\n\t\t\t\t}));\r\n\t\t\t}\r\n\t\t\targ_15D_0(arg_15D_1, arg_15D_2, arg_158_0(arg_158_1, Program.<>o__0.<>p__0.Target(Program.<>o__0.<>p__0, first)));\r\n\t\t\tif (Program.<>o__0.<>p__5 == null)\r\n\t\t\t{\r\n\t\t\t\tProgram.<>o__0.<>p__5 = CallSite<Action<CallSite, Type, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.ResultDiscarded, \"WriteLine\", null, typeof(Program), new CSharpArgumentInfo[]\r\n\t\t\t\t{\r\n\t\t\t\t\tCSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType | CSharpArgumentInfoFlags.IsStaticType, null),\r\n\t\t\t\t\tCSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)\r\n\t\t\t\t}));\r\n\t\t\t}\r\n\t\t\tAction<CallSite, Type, object> arg_260_0 = Program.<>o__0.<>p__5.Target;\r\n\t\t\tCallSite arg_260_1 = Program.<>o__0.<>p__5;\r\n\t\t\tType arg_260_2 = typeof(Console);\r\n\t\t\tif (Program.<>o__0.<>p__4 == null)\r\n\t\t\t{\r\n\t\t\t\tProgram.<>o__0.<>p__4 = CallSite<Func<CallSite, object, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.None, \"ToString\", null, typeof(Program), new CSharpArgumentInfo[]\r\n\t\t\t\t{\r\n\t\t\t\t\tCSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)\r\n\t\t\t\t}));\r\n\t\t\t}\r\n\t\t\tFunc<CallSite, object, object> arg_25B_0 = Program.<>o__0.<>p__4.Target;\r\n\t\t\tCallSite arg_25B_1 = Program.<>o__0.<>p__4;\r\n\t\t\tif (Program.<>o__0.<>p__3 == null)\r\n\t\t\t{\r\n\t\t\t\tProgram.<>o__0.<>p__3 = CallSite<Func<CallSite, object, object>>.Create(Binder.InvokeMember(CSharpBinderFlags.None, \"GetType\", null, typeof(Program), new CSharpArgumentInfo[]\r\n\t\t\t\t{\r\n\t\t\t\t\tCSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)\r\n\t\t\t\t}));\r\n\t\t\t}\r\n\t\t\targ_260_0(arg_260_1, arg_260_2, arg_25B_0(arg_25B_1, Program.<>o__0.<>p__3.Target(Program.<>o__0.<>p__3, second)));\r\n\t\t\tConsole.ReadKey();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n<\/pre>\n<p style=\"text-align: justify;\">Tak paczem i widzem\u2026<br \/>\nOoo, nie ma pod spodem czego\u015b takiego jak dynamic. To zwyk\u0142y object:). Ooo kompilator cwanie sobie wygenerowa\u0142 wszystkie mo\u017cliwe przypadki i si\u0119 b\u0119dzie prze\u0142\u0105cza\u0142 mi\u0119dzy nimi. Tak\u017ce ca\u0142a dynamiczno\u015b\u0107 jest \u015bciemniana. Poza tym to OMG, ale mi si\u0119 w oczkach pieprzy od tych dzi\u00f3bk\u00f3w. Tak czy inaczej ten kod nie przypomina ani troch\u0119 kodu, jaki r\u0119cznie napisa\u0142am. Pomijaj\u0105c, \u017ce bez zmiany nazw niedozwolonych na co\u015b bardziej ludzkiego to si\u0119 nawet nie b\u0119dzie chcia\u0142o skompilowa\u0107;).<\/p>\n<p style=\"text-align: justify;\">Mog\u0142abym kombinowa\u0107 dalej i pokaza\u0107 jaka sieka jest jak np. kompilator nie wie od razu jak\u0105 funkcj\u0119 wywo\u0142a\u0107, ale to wam zostawiam jako zadanie domowe. Mog\u0119 tylko podpowiedzie\u0107, \u017ce losow\u0105 z nich przypisujemy do delegaty i ni\u0105 wywo\u0142ujemy.<\/p>\n<p style=\"text-align: justify;\">Tak\u017ce nie, ILSpy to \u017cadna Mata Hari nie jest. Trzymcie si\u0119 i do poczytania.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hej, Z g\u00f3ry przepraszam \u017ce mnie wci\u0119\u0142o, poci\u0105gi mi bokiem wychodz\u0105, jak i ta ca\u0142a praca. Nie tak dawno temu min\u0105\u0142 mi rok, z czego<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/piatkosia.k4be.pl\/wordpress\/2016\/12\/18\/ilspy-szpiegujemy-szpiega\/\">Lecim dalej<span class=\"screen-reader-text\">ILSPY &#8211; SZPIEGUJEMY SZPIEGA<\/span> <i class=\"fas fa-angle-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[167,83,168,239,54,49],"tags":[257,256,255],"class_list":["post-967","post","type-post","status-publish","format-standard","hentry","category-black_it","category-c_sharp","category-edu","category-konkursy","category-ms","category-programowanie","tag-consoleapps","tag-dynamic","tag-ilspy","entry"],"_links":{"self":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/967","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/comments?post=967"}],"version-history":[{"count":2,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/967\/revisions"}],"predecessor-version":[{"id":969,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/posts\/967\/revisions\/969"}],"wp:attachment":[{"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/media?parent=967"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/categories?post=967"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/piatkosia.k4be.pl\/wordpress\/wp-json\/wp\/v2\/tags?post=967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}