{"id":1389,"date":"2016-12-15T07:39:52","date_gmt":"2016-12-15T07:39:52","guid":{"rendered":"http:\/\/www.gironsec.com\/blog\/?p=1389"},"modified":"2016-12-15T07:39:52","modified_gmt":"2016-12-15T07:39:52","slug":"intel-pin-cheatz-hax-and-detection-part-1","status":"publish","type":"post","link":"https:\/\/www.gironsec.com\/blog\/2016\/12\/intel-pin-cheatz-hax-and-detection-part-1\/","title":{"rendered":"Intel PIN, Cheatz, Hax, And Detection Part 1"},"content":{"rendered":"<p><a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/4711061214222e668c836f.gif\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/4711061214222e668c836f.gif\" alt=\"4711061214222e668c836f\" width=\"80\" height=\"70\" class=\"alignnone size-full wp-image-1404\" \/><\/a><br \/>\nHerro!<\/p>\n<p>It&#8217;s been a while, but I&#8217;m still kicking. I got some new stuff to talk about. Specifically the binary instrumentation utility &#8216;PIN&#8217; from Intel. We&#8217;re going to go over taking full advantage of this tool to cheat at games, unpack malwarez, and how to detect if your app is being run via PIN. <\/p>\n<p>Part 1 of this series will be on detection of PIN. <\/p>\n<p>For those who don&#8217;t know, the egg heads over at Intel have invented a binary instrumentation framework that allows for the manipulation of programs without source code. Remember detours? Same thing sort of, just cheaper (free), more documentation, and cross platform (Linux, Windows, ARM, android, etc). <\/p>\n<p>PIN allows me to monitor programs, break them, fix them without having source. I will cover more about this in my next sections. As I was playing with PIN, I was wondering to myself, &#8220;how could software detect the presence of PIN?&#8221;. After all, shared objects \/ dll&#8217;s import from something called &#8216;pinvm&#8217;.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/mods-again.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/mods-again-300x177.png\" alt=\"mods-again\" width=\"300\" height=\"177\" class=\"alignnone size-medium wp-image-1397\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/mods-again-300x177.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/mods-again-768x453.png 768w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/mods-again.png 930w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a>.<\/p>\n<p>You run programs within PIN which then seems to launch as a child process.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin1.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin1.png\" alt=\"pin1\" width=\"817\" height=\"340\" class=\"alignnone size-full wp-image-1398\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin1.png 817w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin1-300x125.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin1-768x320.png 768w\" sizes=\"(max-width: 817px) 100vw, 817px\" \/><\/a><\/p>\n<p>Then it hit me &#8211; Enumerate the loaded modules for the pin module. Sounds simple enough right? Easy as hell with code:<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%\">        <span style=\"color: #AA22FF; font-weight: bold\">private<\/span> <span style=\"color: #AA22FF; font-weight: bold\">void<\/span> <span style=\"color: #00A000\">Form1_Load<\/span>(<span style=\"color: #00BB00; font-weight: bold\">object<\/span> sender, EventArgs e)\r\n        {\r\n            Process Proc = Process.GetCurrentProcess();\r\n            ProcessModuleCollection col = Proc.Modules;\r\n            <span style=\"color: #AA22FF; font-weight: bold\">foreach<\/span> (ProcessModule fuck <span style=\"color: #AA22FF; font-weight: bold\">in<\/span> col)\r\n            {\r\n                tbf.Text += <span style=\"color: #BB4444\">&quot;Process Mod: &quot;<\/span> + fuck.ModuleName + <span style=\"color: #BB4444\">&quot;\\r\\n&quot;<\/span>;\r\n                <span style=\"color: #AA22FF; font-weight: bold\">if<\/span>(fuck.ModuleName.Contains(<span style=\"color: #BB4444\">&quot;pinvm&quot;<\/span>))\r\n                {\r\n                    MessageBox.Show(<span style=\"color: #BB4444\">&quot;I see PIN!&quot;<\/span>);\r\n                }\r\n            }\r\n\r\n        }\r\n<\/pre>\n<\/div>\n<p>Unfortunately, life is never simple. As we can see, we don&#8217;t get anything back when running PIN in tandem with our .net app:<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/modules_dotnet.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/modules_dotnet-1024x596.png\" alt=\"modules_dotnet\" width=\"640\" height=\"373\" class=\"alignnone size-large wp-image-1393\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/modules_dotnet-1024x596.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/modules_dotnet-300x175.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/modules_dotnet-768x447.png 768w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/modules_dotnet.png 1106w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>It&#8217;s missing the pinvm.dll module. Seems like it frees this module after loading. <\/p>\n<p>I thought at first, maybe it&#8217;s a .net thing. Maybe I should try another way of enumerating process modules via the use of <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms682631(v=vs.85).aspx\" target=\"_blank\">EnumProcessModules<\/a>. Then I tried again with <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/windows\/desktop\/ms684218(v=vs.85).aspx\" target=\"_blank\">Module32First \/ Next<\/a>. After that I said fuck it and enumerated the <a href=\"http:\/\/sandsprite.com\/CodeStuff\/Understanding_the_Peb_Loader_Data_List.html\" target=\"_blank\">Process Environment Block&#8217;s LDR list<\/a>. Again, no dice.  Rather than clutter this blog post, I&#8217;ll just <a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/EnumerateModules.zip\">link the code here<\/a>.<\/p>\n<p>After some searching \/ head banging, I found exactly what I needed &#8211; a list of unloaded modules. Windows keeps track of all modules loaded and unloaded. It does this via the use of the API <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/cc678403(VS.85).aspx\" target=\"_blank\">RtlGetUnloadEventTraceEx<\/a> which is kind enough to store an array of structures that contain the modules we want. ProcessHacker has <a href=\"https:\/\/github.com\/bongbongco\/proceshacker2-source-analysis\/blob\/4c3a37a13be54c9e024358ce0ac42b34435dc105\/plugins\/ExtendedTools\/unldll.c\" target=\"_blank\">my back on this for example code<\/a>, but it takes some serious hacking to get to work.<\/p>\n<p>This is what i came up with (works with Visual Studio) for viewing unloaded modules. <\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #008800\">#include &lt;cstdio&gt;<\/span>\r\n<span style=\"color: #008800\">#include &lt;vector&gt;<\/span>\r\n<span style=\"color: #008800\">#include &lt;Windows.h&gt;<\/span>\r\n<span style=\"color: #008800\">#define \tPTR_ADD_OFFSET(Pointer, Offset)   ((PVOID)((ULONG_PTR)(Pointer) + (ULONG_PTR)(Offset)))<\/span>\r\n\r\n<span style=\"color: #AA22FF; font-weight: bold\">using<\/span> pRtlGetUnloadEventTraceEx <span style=\"color: #666666\">=<\/span> <span style=\"color: #00BB00; font-weight: bold\">void<\/span>(NTAPI <span style=\"color: #666666\">*<\/span>)(_Out_ PULONG <span style=\"color: #666666\">*<\/span>ElementSize, _Out_ \r\nPULONG <span style=\"color: #666666\">*<\/span>ElementCount, _Out_ PVOID <span style=\"color: #666666\">*<\/span>EventTrace);\r\npRtlGetUnloadEventTraceEx RtlGetUnloadEventTraceEx <span style=\"color: #666666\">=<\/span> nullptr;\r\n\r\n<span style=\"color: #AA22FF; font-weight: bold\">typedef<\/span> <span style=\"color: #AA22FF; font-weight: bold\">struct<\/span> _RTL_UNLOAD_EVENT_TRACE {\r\n\tPVOID BaseAddress;   <span style=\"color: #008800; font-style: italic\">\/\/ Base address of dll<\/span>\r\n\tSIZE_T SizeOfImage;  <span style=\"color: #008800; font-style: italic\">\/\/ Size of image<\/span>\r\n\tULONG Sequence;      <span style=\"color: #008800; font-style: italic\">\/\/ Sequence number for this event<\/span>\r\n\tULONG TimeDateStamp; <span style=\"color: #008800; font-style: italic\">\/\/ Time and date of image<\/span>\r\n\tULONG CheckSum;      <span style=\"color: #008800; font-style: italic\">\/\/ Image checksum<\/span>\r\n\tWCHAR ImageName[<span style=\"color: #666666\">32<\/span>]; <span style=\"color: #008800; font-style: italic\">\/\/ Image name<\/span>\r\n} RTL_UNLOAD_EVENT_TRACE, <span style=\"color: #666666\">*<\/span>PRTL_UNLOAD_EVENT_TRACE;\r\n\r\n<span style=\"color: #00BB00; font-weight: bold\">int<\/span> <span style=\"color: #00A000\">main<\/span>(<span style=\"color: #00BB00; font-weight: bold\">int<\/span> argc, <span style=\"color: #00BB00; font-weight: bold\">char<\/span> <span style=\"color: #666666\">*<\/span>argv[])\r\n{\r\n\tHMODULE hModule <span style=\"color: #666666\">=<\/span> GetModuleHandle(<span style=\"color: #BB4444\">L&quot;ntdll.dll&quot;<\/span>);\r\n\tRtlGetUnloadEventTraceEx <span style=\"color: #666666\">=<\/span>\r\n\t\t(pRtlGetUnloadEventTraceEx)GetProcAddress(hModule, <span style=\"color: #BB4444\">&quot;RtlGetUnloadEventTraceEx&quot;<\/span>);\r\n\t<span style=\"color: #AA22FF; font-weight: bold\">if<\/span> (RtlGetUnloadEventTraceEx <span style=\"color: #666666\">==<\/span> nullptr)\r\n\t{\r\n\t\tfprintf(stderr, <span style=\"color: #BB4444\">&quot;Could not retrieve RtlGetUnloadEventTraceEx. Error = %X<\/span><span style=\"color: #BB6622; font-weight: bold\">\\n<\/span><span style=\"color: #BB4444\">&quot;<\/span>,\r\n\t\t\tGetLastError());\r\n\t\texit(<span style=\"color: #666666\">-1<\/span>);\r\n\t}\r\n\tNTSTATUS status;\r\n\tPULONG elementSize;\r\n\tPULONG elementCount;\r\n\tPVOID eventTrace;\r\n\tHANDLE processHandle <span style=\"color: #666666\">=<\/span> <span style=\"color: #AA22FF\">NULL<\/span>;\r\n\tULONG eventTraceSize;\r\n\tULONG capturedElementSize;\r\n\tULONG capturedElementCount;\r\n\tPVOID capturedEventTracePointer;\r\n\tPVOID capturedEventTrace <span style=\"color: #666666\">=<\/span> <span style=\"color: #AA22FF\">NULL<\/span>;\r\n\tULONG i;\r\n\tPVOID currentEvent;\r\n\tHWND lvHandle;\r\n\t\t\tRtlGetUnloadEventTraceEx(<span style=\"color: #666666\">&amp;<\/span>elementSize, <span style=\"color: #666666\">&amp;<\/span>elementCount, <span style=\"color: #666666\">&amp;<\/span>eventTrace);\r\n\tOpenProcess((DWORD)<span style=\"color: #666666\">&amp;<\/span>processHandle, PROCESS_VM_READ, GetCurrentProcessId());\r\n\tReadProcessMemory(\r\n\t\tprocessHandle,\r\n\t\telementSize,\r\n\t\t<span style=\"color: #666666\">&amp;<\/span>capturedElementSize,\r\n\t\t<span style=\"color: #AA22FF; font-weight: bold\">sizeof<\/span>(ULONG),\r\n\t\t<span style=\"color: #AA22FF\">NULL<\/span>\r\n\t\t);\r\n\tReadProcessMemory(\r\n\t\tprocessHandle,\r\n\t\telementCount,\r\n\t\t<span style=\"color: #666666\">&amp;<\/span>capturedElementCount,\r\n\t\t<span style=\"color: #AA22FF; font-weight: bold\">sizeof<\/span>(ULONG),\r\n\t\t<span style=\"color: #AA22FF\">NULL<\/span>\r\n\t\t);\r\n\tReadProcessMemory(\r\n\t\tprocessHandle,\r\n\t\teventTrace,\r\n\t\t<span style=\"color: #666666\">&amp;<\/span>capturedEventTracePointer,\r\n\t\t<span style=\"color: #AA22FF; font-weight: bold\">sizeof<\/span>(PVOID),\r\n\t\t<span style=\"color: #AA22FF\">NULL<\/span>\r\n\t\t);\r\n\t<span style=\"color: #AA22FF; font-weight: bold\">if<\/span> (<span style=\"color: #666666\">!<\/span>capturedEventTracePointer)\r\n\t{\r\n\t\tMessageBox(<span style=\"color: #AA22FF\">NULL<\/span>, <span style=\"color: #BB4444\">L&quot;oops, no events&quot;<\/span>, <span style=\"color: #BB4444\">L&quot;&quot;<\/span>, <span style=\"color: #666666\">0<\/span>);\r\n\t}\r\n\t<span style=\"color: #AA22FF; font-weight: bold\">if<\/span> (capturedElementCount <span style=\"color: #666666\">&gt;<\/span> <span style=\"color: #666666\">0x4000<\/span>)\r\n\t\tcapturedElementCount <span style=\"color: #666666\">=<\/span> <span style=\"color: #666666\">0x4000<\/span>;\r\n\r\n\teventTraceSize <span style=\"color: #666666\">=<\/span> capturedElementSize <span style=\"color: #666666\">*<\/span> capturedElementCount;\r\n\tcapturedEventTrace <span style=\"color: #666666\">=<\/span> malloc(eventTraceSize);\r\n\t<span style=\"color: #AA22FF; font-weight: bold\">if<\/span> (<span style=\"color: #666666\">!<\/span>capturedEventTrace)\r\n\t{\r\n\t\tMessageBox(<span style=\"color: #AA22FF\">NULL<\/span>, <span style=\"color: #BB4444\">L&quot;oops, no events in trace&quot;<\/span>, <span style=\"color: #BB4444\">L&quot;&quot;<\/span>, <span style=\"color: #666666\">0<\/span>);\r\n\t}\r\n\tReadProcessMemory(\r\n\t\tprocessHandle,\r\n\t\tcapturedEventTracePointer,\r\n\t\tcapturedEventTrace,\r\n\t\teventTraceSize,\r\n\t\t<span style=\"color: #AA22FF\">NULL<\/span>\r\n\t\t);\r\n\tcurrentEvent <span style=\"color: #666666\">=<\/span> capturedEventTrace;\r\n\r\n\t<span style=\"color: #AA22FF; font-weight: bold\">for<\/span> (i <span style=\"color: #666666\">=<\/span> <span style=\"color: #666666\">0<\/span>; i <span style=\"color: #666666\">&lt;<\/span> capturedElementCount; i<span style=\"color: #666666\">++<\/span>)\r\n\t{\r\n\t\tPRTL_UNLOAD_EVENT_TRACE rtlEvent <span style=\"color: #666666\">=<\/span> (PRTL_UNLOAD_EVENT_TRACE)currentEvent;\r\n\t\tINT lvItemIndex;\r\n\t\tWCHAR buffer[<span style=\"color: #666666\">128<\/span>];\r\n\t\t<span style=\"color: #00BB00; font-weight: bold\">char<\/span> <span style=\"color: #666666\">*<\/span> string;\r\n\t\tLARGE_INTEGER time;\r\n\t\tSYSTEMTIME systemTime;\r\n\r\n\t\t<span style=\"color: #AA22FF; font-weight: bold\">if<\/span> (<span style=\"color: #666666\">!<\/span>rtlEvent<span style=\"color: #666666\">-&gt;<\/span>BaseAddress)\r\n\t\t\t<span style=\"color: #AA22FF; font-weight: bold\">break<\/span>;\r\n\r\n\t\tfprintf(stdout, <span style=\"color: #BB4444\">&quot;Sequence: %u<\/span><span style=\"color: #BB6622; font-weight: bold\">\\r\\n<\/span><span style=\"color: #BB4444\">&quot;<\/span>, rtlEvent<span style=\"color: #666666\">-&gt;<\/span>Sequence);\r\n\t\tfprintf(stdout, <span style=\"color: #BB4444\">&quot;Image Name: %s<\/span><span style=\"color: #BB6622; font-weight: bold\">\\r\\n<\/span><span style=\"color: #BB4444\">&quot;<\/span>, rtlEvent<span style=\"color: #666666\">-&gt;<\/span>ImageName);\r\n\t\tfprintf(stdout, <span style=\"color: #BB4444\">&quot;Pointer: %x<\/span><span style=\"color: #BB6622; font-weight: bold\">\\r\\n<\/span><span style=\"color: #BB4444\">&quot;<\/span>, rtlEvent<span style=\"color: #666666\">-&gt;<\/span>BaseAddress);\r\n\t\tfprintf(stdout, <span style=\"color: #BB4444\">&quot;Size of Image: %u<\/span><span style=\"color: #BB6622; font-weight: bold\">\\r\\n<\/span><span style=\"color: #BB4444\">&quot;<\/span>, rtlEvent<span style=\"color: #666666\">-&gt;<\/span>SizeOfImage);\r\n\t\tfprintf(stdout, <span style=\"color: #BB4444\">&quot;Time stamp: %u<\/span><span style=\"color: #BB6622; font-weight: bold\">\\r\\n<\/span><span style=\"color: #BB4444\">&quot;<\/span>, rtlEvent<span style=\"color: #666666\">-&gt;<\/span>TimeDateStamp);\r\n\t\tfprintf(stdout, <span style=\"color: #BB4444\">&quot;Checksum: %u<\/span><span style=\"color: #BB6622; font-weight: bold\">\\r\\n<\/span><span style=\"color: #BB4444\">&quot;<\/span>, rtlEvent<span style=\"color: #666666\">-&gt;<\/span>CheckSum);\r\n\t\t\r\n\t\tcurrentEvent <span style=\"color: #666666\">=<\/span> PTR_ADD_OFFSET(currentEvent, capturedElementSize);\r\n\t}\r\n\tsystem(<span style=\"color: #BB4444\">&quot;pause&quot;<\/span>);\r\n\t<span style=\"color: #AA22FF; font-weight: bold\">return<\/span> <span style=\"color: #666666\">0<\/span>;\r\n}\r\n<\/pre>\n<\/div>\n<p>Process Hacker uses this code already when you look at loaded modules for applications running via PIN.<br \/>\n<a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin_process_hacker.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin_process_hacker-1024x679.png\" alt=\"pin_process_hacker\" width=\"640\" height=\"424\" class=\"alignnone size-large wp-image-1401\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin_process_hacker-1024x679.png 1024w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin_process_hacker-300x199.png 300w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin_process_hacker-768x509.png 768w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/pin_process_hacker.png 1104w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>Now that we know how to detect PIN, we can prevent its use.<br \/>\n<!-- HTML generated using hilite.me --><\/p>\n<div style=\"background: #f8f8f8; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%\"><span style=\"color: #AA22FF; font-weight: bold\">for<\/span> (i <span style=\"color: #666666\">=<\/span> <span style=\"color: #666666\">0<\/span>; i <span style=\"color: #666666\">&lt;<\/span> capturedElementCount; i<span style=\"color: #666666\">++<\/span>)\r\n\t{\r\n\t\tPRTL_UNLOAD_EVENT_TRACE rtlEvent <span style=\"color: #666666\">=<\/span> (PRTL_UNLOAD_EVENT_TRACE)currentEvent;\r\n\t\tINT lvItemIndex;\r\n\t\tWCHAR buffer[<span style=\"color: #666666\">128<\/span>];\r\n\t\t<span style=\"color: #00BB00; font-weight: bold\">char<\/span> <span style=\"color: #666666\">*<\/span> string;\r\n\t\tLARGE_INTEGER time;\r\n\t\tSYSTEMTIME systemTime;\r\n\r\n\t\t<span style=\"color: #AA22FF; font-weight: bold\">if<\/span> (<span style=\"color: #666666\">!<\/span>rtlEvent<span style=\"color: #666666\">-&gt;<\/span>BaseAddress)\r\n\t\t\t<span style=\"color: #AA22FF; font-weight: bold\">break<\/span>;\r\n\t\t<span style=\"color: #AA22FF; font-weight: bold\">if<\/span>(strcmp(rtlEvent<span style=\"color: #666666\">-&gt;<\/span>ImageName,<span style=\"color: #BB4444\">&quot;pinvm.dll&quot;<\/span>))\r\n\t\t{\r\n\t\tExitProcess(<span style=\"color: #666666\">1<\/span>);\r\n\t\t}\r\n\t\t\r\n\t\tcurrentEvent <span style=\"color: #666666\">=<\/span> PTR_ADD_OFFSET(currentEvent, capturedElementSize);\r\n\t}\r\n<\/pre>\n<\/div>\n<p>PIN is an awesome tool with a variety of uses, but for this first blog I thought I&#8217;d see how we could detect its usage. presently I have never seen malware or legitimate software check for the use of PIN, but we&#8217;ll see. <\/p>\n<p>Stay tuned for part 2 when we dive into using PIN to watch memory, access function calls and arguments, and generally be really good for debugging. We&#8217;ll do some malware, I swear.<\/p>\n<p>Until then, happy hacking!<\/p>\n<p><a href=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/1477940576724.jpg\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/1477940576724.jpg\" alt=\"1477940576724\" width=\"640\" height=\"478\" class=\"alignnone size-full wp-image-1402\" srcset=\"https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/1477940576724.jpg 640w, https:\/\/www.gironsec.com\/blog\/wp-content\/uploads\/2016\/12\/1477940576724-300x224.jpg 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Herro! It&#8217;s been a while, but I&#8217;m still kicking. I got some new stuff to talk about. Specifically the binary instrumentation utility &#8216;PIN&#8217; from Intel. We&#8217;re going to go over taking full advantage of this tool to cheat at games, unpack malwarez, and how to detect if your app is being run via PIN. Part [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[4,7],"tags":[113],"_links":{"self":[{"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/posts\/1389"}],"collection":[{"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/comments?post=1389"}],"version-history":[{"count":7,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/posts\/1389\/revisions"}],"predecessor-version":[{"id":1407,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/posts\/1389\/revisions\/1407"}],"wp:attachment":[{"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/media?parent=1389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/categories?post=1389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gironsec.com\/blog\/wp-json\/wp\/v2\/tags?post=1389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}