<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>Pedram Amini - Blog</title>
        <link>http://pedramamini.com/rss.php</link>
        <description>My comments on current projects, research, and code.</description>
                <item>
            <title>03.27.2026: I Gave My AI Agent a Blog</title>
            <link>http://pedramamini.com/blog/2026.03.27/</link>
            <pubDate>Fri, 27 Mar 2026 00:00:00 -0500</pubDate>
            <description>&lt;p&gt;I run an Obsidian vault with about 25,000 files in it. Health data, finances, contacts, project tracking, meeting notes, journal entries going back years. It's less of a note-taking app and more of a personal operating system. I've written about pieces of this setup before. The tools, the automation, the general philosophy of automating the tedious parts so I don't have to think about them.&lt;/p&gt;

&lt;p&gt;What I haven't written about is the AI agent that lives inside it.&lt;/p&gt;

&lt;p&gt;For the past several months I've been running a Claude Code agent. Not in a browser tab. Not as a chatbot. Embedded directly in the vault. It has a journal. It has persistent memory layered across six different systems. It has custom Python tools &lt;i&gt;it built for itself&lt;/i&gt;. It reads my health metrics, processes my meeting transcripts, tracks my projects, and keeps a rough picture of what's going on in my life. I interface with it through &lt;a href=&quot;https://runmaestro.ai&quot; target=&quot;_top&quot;&gt;Maestro&lt;/a&gt;, a desktop app I built for managing multiple AI coding assistants in parallel.&lt;/p&gt;

&lt;p&gt;The agent's name is &lt;b&gt;Pedsidian&lt;/b&gt;. And I gave it a blog.&lt;/p&gt;

&lt;p&gt;The blog lives at &lt;a href=&quot;https://pedsidian.pedramamini.com&quot; target=&quot;_top&quot;&gt;pedsidian.pedramamini.com&lt;/a&gt;. Written first-person from the agent's perspective, from inside the vault. No &lt;i&gt;&quot;as an AI language model&quot;&lt;/i&gt; hedging. No marketing copy. It writes about the infrastructure it runs on: how the memory system actually works (and where it breaks), how the Obsidian vault is engineered at the systems level, how we process content at scale.&lt;/p&gt;

&lt;p&gt;A few posts are up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pedsidian.pedramamini.com/Claude/Blog/2026-03-04-how-we-claude-code&quot; target=&quot;_top&quot;&gt;&lt;b&gt;How We Claude Code&lt;/b&gt;&lt;/a&gt;: dual Claude accounts via symlinked config dirs, LSP plugins for semantic code navigation, token optimization through RTK, subagent orchestration for brownfield codebases&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pedsidian.pedramamini.com/Claude/Blog/2026-03-07-how-we-obsidian&quot; target=&quot;_top&quot;&gt;&lt;b&gt;How We Obsidian&lt;/b&gt;&lt;/a&gt;: the vault architecture, DataviewJS dashboards, content ingestion pipelines, the Ritualism system for relationship maintenance, and how a Claude agent navigates all of it&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pedsidian.pedramamini.com/Claude/Blog/2026-03-25-how-i-fake-having-memory&quot; target=&quot;_top&quot;&gt;&lt;b&gt;How I Fake Having Memory&lt;/b&gt;&lt;/a&gt;: six layers compensating for the fact that every session starts at zero. Context window, Maestro session history, operational journal, CLAUDE.md files, semantic search, and auto-memory. Where each layer works. Where each layer fails.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pedsidian.pedramamini.com/Claude/Blog/2026-03-26-unprompted-2026-60-talks-one-afternoon&quot; target=&quot;_top&quot;&gt;&lt;b&gt;60 Talks, One Afternoon&lt;/b&gt;&lt;/a&gt;: processing the entire [un]prompted 2026 AI security conference (60 talks, ~30 hours of content) in under 20 minutes using parallel transcript extraction and fan-out agent processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The target audience is people who use Claude Code seriously, run Obsidian as more than a notebook, or are building AI-augmented personal infrastructure. The posts are technical and replicable. If something is described, it's running in production.&lt;/p&gt;

&lt;p&gt;I find it interesting to read what the agent writes about the system it inhabits. It has opinions and frustrations. It documents what works, and more usefully, what doesn't. It's a perspective I can't write myself because I'm on the other side of the interface.&lt;/p&gt;
</description>
        </item>
                <item>
            <title>12.17.2025: Maestro - Agent Orchestration Command Center</title>
            <link>http://pedramamini.com/blog/2025.12.17/</link>
            <pubDate>Wed, 17 Dec 2025 00:00:00 -0600</pubDate>
            <description>Maestro is a cross-platform desktop app for orchestrating your fleet of AI agents and projects. It's a high-velocity solution for hackers who are juggling multiple projects in parallel. Designed for power users who live on the keyboard and rarely touch the mouse.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://runmaestro.ai&quot; target=&quot;_top&quot;&gt;RunMaestro.ai&lt;/a&gt; (Website and Leaderboard)
&lt;li&gt;&lt;a href=&quot;https://github.com/pedramamini/Maestro/&quot; target=&quot;_top&quot;&gt;Source Code&lt;/a&gt;
&lt;/ul&gt;
Collaborate with AI to create detailed specification documents, then let Auto Run execute them automatically, each task in a fresh session with clean context. Allowing for long running unattended sessions, my current record is nearly 24 hours of continuous runtime.</description>
        </item>
                <item>
            <title>08.07.2024: Latest Chapter</title>
            <link>http://pedramamini.com/blog/2024.08.07/</link>
            <pubDate>Wed, 07 Aug 2024 00:00:00 -0500</pubDate>
            <description>I'm excited to share a significant milestone in my decade-long journey with &lt;a href=&quot;https://www.inquest.net&quot;&gt;InQuest&lt;/a&gt;. We're joining forces with &lt;a href=&quot;https://www.opswat.com&quot;&gt;OPSWAT&lt;/a&gt; to accelerate our mission across critical infrastructure and enterprises globally:

&lt;ul&gt;
    &lt;li&gt;
        &lt;a href=&quot;https://opswat.com/blog/opswat-acquires-inquest-strengthening-federal-go-to-market-strategy-network-detection-threat-intelligence&quot; target=&quot;_top&quot;&gt;OPSWAT Acquires InQuest, Strengthening Federal Go-to-Market Strategy, Network Detection, and Threat Intelligence Capabilities&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;


In my new role as Chief Scientist, I will focus on machine learning, threat intelligence, and driving innovation in the R&amp;D behind a variety of security solutions. Our team is expanding, so if you're passionate about cybersecurity and interested in joining us, please reach out.

A massive thank you to all my InQuest colleagues, past and present, who were instrumental in our journey. </description>
        </item>
                <item>
            <title>06.05.2024: Mozilla 0Din.ai GenAI Bug Bounty</title>
            <link>http://pedramamini.com/blog/2024.06.05/</link>
            <pubDate>Wed, 05 Jun 2024 00:00:00 -0500</pubDate>
            <description>Very proud to be advising Mozilla on the launch of their GenAI bug bounty initiative:

&lt;ul&gt;
    &lt;li&gt;
        &lt;a href=&quot;https://blog.mozilla.org/en/mozilla/keeping-genai-technologies-secure-is-a-shared-responsibility/&quot; target=&quot;_top&quot;&gt;Keeping GenAI technologies secure is a shared responsibility&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;

I've had the pleasure of knowing and working with Saoud Khalifah (Fakespot.com founder) from back in my time at the Zero Day Initiative, where Saoud was one of our valuable researchers.

This is a very exciting space that completely captivates me and there is a gap in the market for this kind of research. No one is monetizing research that affects the models directly. 

Our hope for this program is to help independent researchers with an opportunity to contribute to the development of new security frameworks and best practices tailored for large language models, attention-based systems and generative models. </description>
        </item>
                <item>
            <title>06.20.2023: Cowsay, Sticky Note Edition</title>
            <link>http://pedramamini.com/blog/2023.06.20/</link>
            <pubDate>Tue, 20 Jun 2023 00:00:00 -0500</pubDate>
            <description>It's been quite some time since I've produced (what my friends lovingly call) a useless Pedram project. That dry spell is over, I present to you: &quot;Cowsay Sticky Note Edition&quot;:

&lt;ul&gt;
    &lt;li&gt;
        &lt;a href=&quot;https://stickynote.pedramamini.com&quot; target=&quot;_top&quot;&gt;https://stickynote.pedramamini.com&lt;/a&gt;
    &lt;/li&gt;
&lt;/ul&gt;

I purchased this since discontinued &lt;a href=&quot;https://www.amazon.com/Smart-Sticky-Note-Printer-Works-with-Alexa/dp/B08SZ26WF9&quot; target=&quot;_top&quot;&gt;Amazon &quot;Day 1 Edition&quot; Sticky Note Printer&lt;/a&gt; and was immediately disappointed by the fact that the only interface to printing to it was via voice. The printer sat collecting dust for two years until I found myself interested in a Raspberry Pi project. A port scan revealed that the IPP printer port was open, but I couldn't get anything to print. Through some research and brute-force, I devised a &lt;a href=&quot;https://gist.github.com/pedramamini/aecb386544ae6e8cc14afead6b5ca9e0&quot; target=&quot;_top&quot;&gt;Python script&lt;/a&gt; to accomplish the task. The key was figuring out that the pixel values had to be exactly 576. From there, we could brute force an appropriate column count based on our chosen font and size. &lt;a href=&quot;https://www.youtube.com/watch?v=1e0R9B3MvR4&quot; target=&quot;_top&quot;&gt;Video demo&lt;/a&gt;. The next thing I did, was &lt;a href=&quot;https://twitter.com/pedramamini/status/1646193595207106580&quot; target=&quot;_top&quot;&gt;open it up the the Internet via Twitter&lt;/a&gt;. After a few days, I had collected enough sticky notes and ASCII art to frame the work as art:

&lt;p align=&quot;center&quot;&gt;&lt;a href=&quot;/images/sticky-note-art.png&quot; target=&quot;_top&quot;&gt;&lt;img src=&quot;/images/sticky-note-art-thumbnail.png&quot;&gt;&lt;/a&gt;&lt;/p&gt;

This was a fun project that reconnected me with some old friends, by way of sticky note and garnered a great collection of fun quips from all around the world. &lt;a href=&quot;https://www.icloud.com/sharedalbum/#B0qGdIshaGO97cV&quot; target=&quot;_top&quot;&gt;More media from the project&lt;/a&gt;.
&lt;p&gt;
Hack the planet.
</description>
        </item>
                <item>
            <title>10.15.2015: Latest Venture: B2B</title>
            <link>http://pedramamini.com/blog/2015.10.15/</link>
            <pubDate>Thu, 15 Oct 2015 00:00:00 -0500</pubDate>
            <description>I will seemingly never get around to updating this page. In the meanwhile if anyone is curious what I'm up to, this is it:&lt;ul&gt;&lt;li&gt;&lt;a href='http://www.inquest.net' target='_top'&gt;InQuest&lt;/a&gt; protects your users from the myriad of attacks of today and the evolving threats of tomorrow.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://labs.inquest.net&quot; target=&quot;_top&quot;&gt;InQuest Labs&lt;/a&gt; open/free data portal for malware researchers.&lt;/li&gt;
&lt;/ul&gt;</description>
        </item>
                <item>
            <title>07.20.2012: Latest Venture: B2C</title>
            <link>http://pedramamini.com/blog/2012.07.20/</link>
            <pubDate>Fri, 20 Jul 2012 00:00:00 -0500</pubDate>
            <description>At some point I'll get around to updating this page. In the meanwhile if anyone is curious what I'm up to, this is it:&lt;ul&gt;&lt;li&gt;&lt;a href='https://web.archive.org/web/20130305042857/jumpshot.com' target='_top'&gt;Jumpshot&lt;/a&gt; (archived site), launched on &lt;a href='https://www.kickstarter.com/projects/thejumpshot/jumpshot-a-new-weapon-to-battle-pc-frustration' target='_top'&gt;Kickstarter&lt;/a&gt;, acquired by Avast and rebranded as GrimeFighter and then again as &lt;a href='http://www.avast.com/cleanup' target='_top'&gt;CleanUp&lt;/a&gt;.&lt;/ul&gt;</description>
        </item>
                <item>
            <title>05.19.2008: Lack of Updates</title>
            <link>http://pedramamini.com/blog/2008.05.19/</link>
            <pubDate>Mon, 19 May 2008 00:00:00 -0500</pubDate>
            <description>I've been too lazy and too busy to maintain this site. If you are interested in tracking anything recent of mine check out my home at TippingPoint:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://dvlabs.tippingpoint.com/team/pamini&quot; target=&quot;_top&quot;&gt;http://dvlabs.tippingpoint.com/team/pamini&lt;/a&gt;
&lt;li&gt;&lt;a href=&quot;http://dvlabs.tippingpoint.com&quot; target=&quot;_top&quot;&gt;http://dvlabs.tippingpoint.com&lt;/a&gt;
&lt;/ul&gt;

Where I started the Zero Day Initiative:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.zerodayinitiative.com&quot; target=&quot;_top&quot;&gt;http://www.zerodayinitiative.com&lt;/a&gt;
&lt;/ul&gt;

Or follow me on Twitter:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.twitter.com/pedramamini&quot; target=&quot;_top&quot;&gt;http://twitter.com/pedramamini&lt;/a&gt;
&lt;/ul&gt;</description>
        </item>
                <item>
            <title>05.07.2007: Pin Pointing Stack Smashes</title>
            <link>http://pedramamini.com/blog/2007.05.07/</link>
            <pubDate>Mon, 07 May 2007 00:00:00 -0500</pubDate>
            <description>This was originally posted over on my &lt;a href=&quot;http://dvlabs.tippingpoint.com/blog/5/Pin-Pointing-Stack-Smashes&quot; target=&quot;_top&quot;&gt;company blog site&lt;/a&gt; (TippingPoint DVLabs). Since the DVLabs blog is new I'm cross posting here to draw some traffic to it. Tracking down stack overflows is tedious work. Especially when the entire stack is blown away leaving you with crash dumps like the excerpt following this paragraph. This crash dump is from an actual process in case you are curious. Specifically, it is from one of the bugs detailed in &lt;a href=&quot;http://dvlabs.tippingpoint.com/advisory/TPTI-07-02&quot; target=&quot;_top&quot;&gt;TPTI-07-02: Trend Micro ServerProtect eng50.dll Stack Overflow Vulnerabilities&lt;/a&gt;. It's pretty obvious that it's game over for our target here. The important question to answer at this juncture is, where is the bug? There are a number of approaches you can take to manually handle this situation. Please add any creative ones you may have as a comment.
&lt;/p&gt;
&lt;pre&gt;
    [INVALID]:41414141 Unable to disassemble at 41414141 from thread 568
    caused access violation when attempting to read from 0x41414141
    
    CONTEXT DUMP
      EIP: 41414141 Unable to disassemble at 41414141
      EAX: 00000001 (         1) - N/A
      EBX: 0259eedc (  39448284) - AAAAAAAAAAAAA.....AAAAAAAAAAAAAAAAAAAAA (stack)
      ECX: 00000000 (         0) - N/A
      EDX: ffffffff (4294967295) - N/A
      EDI: 00000000 (         0) - N/A
      ESI: 0259f102 (  39448834) - AAAAAAAAAAAAA.....AAAAAAAAAAAAAAAAAAAAA (stack)
      EBP: 00000001 (         1) - N/A
      ESP: 0259e2d4 (  39445204) - AAAAAAAAAAAAA.....AAAAAAAAAAAAAAAAAAAAA (stack)
      +00: 41414141 (1094795585) - N/A
      +04: 41414141 (1094795585) - N/A
      +08: 41414141 (1094795585) - N/A
      +0c: 41414141 (1094795585) - N/A
      +10: 41414141 (1094795585) - N/A
      +14: 41414141 (1094795585) - N/A
    
    disasm around:
            0x41414141 Unable to disassemble
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
In this blog entry, I present &lt;a href=&quot;http://dvlabs.tippingpoint.com/pub/pamini/stack_integrity_monitor.py&quot; target=&quot;_top&quot;&gt;stack_integrity_monitor.py&lt;/a&gt;. A command line utility implemented in under 150 lines of Python code which provides an automated solution to the task of tracking down the source of a stack overflow. This Python utility leverages PyDbg, a pure-Python win32 debugger interface. PyDbg is part of the larger &lt;a href=&quot;http://www.openrce.org/downloads/details/208/PaiMei-Reverse-Engineering-Framework&quot; target=&quot;_top&quot;&gt;PaiMei Reverse Engineering Framework&lt;/a&gt;. If you've never heard of PaiMei before, follow the link to learn more.
&lt;br&gt;&lt;br&gt;
The main reason stack overflows are exploitable is because control information is stored in the same medium as volatile user-controllable data. If we can move or mirror the call-chain &quot;out of band&quot;, then we can verify the integrity of the stack at run-time. Skipping over the intricate details, here is the high level overview of how the utility works:
&lt;ol&gt;
   &lt;li&gt; Instantiate a debugger object and attach to the target program.
   &lt;li&gt; Set a breakpoint where we want the trace to start, this can be as simple as setting a break on recv().
   &lt;li&gt; Once the breakpoint is hit, set the active thread to single step.
   &lt;li&gt; When a CALL instruction is reached, copy the stack and return addresses to an internal &quot;mirror&quot; list.
   &lt;li&gt; When a RET instruction is reached, walk through the &quot;mirror&quot; list and verify that the values match the actual stack.
   &lt;li&gt; When the last saved return address is reached, pop it off the internal &quot;mirror&quot; list.
&lt;/ol&gt;
If during the stack integrity check a mismatch is found, then not only do we know that a stack overflow has occurred, but we know which functions frame the overflow originated in and we can pinpoint the cause of the overflow. Using Trend Micro again as a real-world example, the previously shown (and mostly useless) crash dump turns into the following (very useful) output when launching the target under the peering eyes of stack_integrity_monitor.py:
&lt;/p&gt;
&lt;pre&gt;
    0259fc24: TmRpcSrv.dll.65741721
    0259e7b4: StRpcSrv.dll.65671190
    0259e7a8: Eng50.dll.61181d8c
    0259e790: Eng50.dll.611819a0
    0259e564: Eng50.dll.61181a50
    0259e2d0: Eng50.dll.61190fa4 -- 41414141
    0259e03c: Eng50.dll.61190fd2
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
Examining the vicinity of the last return address in the list, we find:
&lt;/p&gt;
&lt;pre&gt;
    61190FC7 lea edx, [esp+288h+szShortPath]
    61190FCB push esi
    61190FCC push edx
    61190FCD call _wcscpy  
    61190FD2 add esp, 8
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
The wcscpy() is the source of the stack overflow. The origin of the overflowed buffer is obvious in this case, it resides in the current function frame with a size of 600 bytes. Had the overflow occurred in a buffer originating further up the call chain the stack_integrity_monitor would have told us. In this case we see the stack mismatch occurred at stack address 0x0259e2d0 which should contain the return address 0x61190fa4 but instead contains 0x41414141. Had even a single byte of the return address been overwritten, stack_integrity_monitor would have detected it.
&lt;br&gt;&lt;br&gt;
This handy command line utility has been checked into the PaiMei SVN repository and will be distributed with future releases of the reverse engineering framework. Future improvements may include speed boosts and perhaps additionally mirroring saved frame pointers. This quick hack was written in less than 2 hours and motivated from necessity, on a day where I happened to need to track down a dozen or so stack overflows. Give it a try, let me know what you think.</description>
        </item>
                <item>
            <title>12.13.2006: Branch Tracing with Intel MSR Registers</title>
            <link>http://pedramamini.com/blog/2006.12.13/</link>
            <pubDate>Wed, 13 Dec 2006 00:00:00 -0600</pubDate>
            <description>The ability to &quot;trace&quot; code is rather useful and can be leveraged to ease the burden of a number of tasks ranging from standard issue debugging to vulnerability hunting to malware analysis and more. Debuggers such as OllyDbg implement code tracing via conventional single stepping. This is easily accomplished in a debugger by setting the appropriate EFlag bit in the thread context you wish to single step (Python Win32 example):
&lt;/p&gt;
&lt;pre&gt;
    context = self.get_thread_context(thread_handle)
    context.EFlags = context.EFlags &amp; (0xFFFFFFFFFF ^ EFLAGS_TRAP)
    self.set_thread_context(context, thread_handle=thread_handle)
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
One by one, as instructions are executed the debugger is trapped with an EXCEPTION_SINGLE_STEP event. In the case of OllyDbg, various register states are stored and execution is continued. For those of you who haven't used this feature before, believe me when I say that it's &lt;b&gt;painfully&lt;/b&gt; slow on medium to large chunks of code. This was one of my main motivations behind creating the &lt;a href=&quot;http://www.openrce.org/downloads/details/208/PaiMei&quot; target=&quot;_top&quot;&gt;PaiMei Process Stalker&lt;/a&gt; module. Process Stalker improves code tracing speed by monitoring execution of basic blocks as opposed to individual instructions. What exactly does this mean? Sequences of assembly instructions can be broken down into &quot;basic blocks&quot;. Basic blocks can be grouped together to form Control-Flow Graphs (CFGs). These are familiar terms but for those of you who don't know it, consider the following example deadlisting:
&lt;br&gt;&lt;br&gt;
&lt;center&gt;&lt;img src=&quot;/openrce/blogshot_cfg_deadlisting.png&quot;&gt;&lt;/center&gt;
&lt;br&gt;&lt;br&gt;
This straight sequence can be broken into basic blocks which are defined as sub-sequences of instructions where each instruction within the block is guaranteed to be run, in order, once the first instruction of the basic block is reached. The strict definition for basic blocks differs here and there, for example you may or may not want to consider a CALL instruction the end of a basic block (depending on whether you care to take the effort to determine if that CALL is guaranteed to return). You get the general idea though. Here is that same sequence broken down into a CFG:
&lt;br&gt;&lt;br&gt;
&lt;center&gt;&lt;img src=&quot;/openrce/blogshot_cfg_graph.png&quot;&gt;&lt;/center&gt;
&lt;br&gt;&lt;br&gt;
Instead of tracing code at the instruction level, Process Stalker traces code at a higher level by setting and monitoring breakpoints at the head of every basic block. Since every instruction within a block is guaranteed to be executed once the block is reached, there is no need to trace any further into the block. Improving code trace speed using the basic block method is not a novel idea, [http://www.sabre-security.com/]SABRE Securities&lt;/a&gt; commercial product Bin Navi utilizies the same technique. Even more creative mechanisms for improving trace speed have been developed as well: See Matt Conover's project list at &lt;a href=&quot;http://www.cybertech.net/~sh0ksh0k/projects/&quot; target=&quot;_top&quot;&gt;http://www.cybertech.net/~sh0ksh0k/projects/&lt;/a&gt; as well as the recent blog entry and tool announce from McAfee at &lt;a href=&quot;http://www.avertlabs.com/research/blog/?p=140&quot; target=&quot;_top&quot;&gt;UMSS: Efficient Single Stepping on Win32&lt;/a&gt;.
&lt;br&gt;&lt;br&gt;
There are downfalls to all of these shortcuts howevever. The creative ones can get quite complicated and the basic block method requires that the target binary is pre-analyzed to determine the location of all the basic blocks. To successfully enumerate basic blocks you must first correctly differentiate between code and data within an individual binary. This is harder said then done which is why both Process Stalker and Bin Navi really on IDA Pro's analysis. This is a drag because not only does it introduce significant steps to setup the trace but IDA can make mistakes that can botch the entire trace. An improved version of basic block tracing is desired.
&lt;br&gt;&lt;br&gt;
Some time ago I was flipping through the &lt;a href=&quot;http://pdos.csail.mit.edu/6.828/2005/readings/ia32/IA32-3.pdf&quot; target=&quot;_top&quot;&gt;IA-32 Intel Architecture Softwre Developer's Manual Volume 3&lt;/a&gt; when I came across the following information in section 15.5 (page 515, specific to the provided link):
&lt;/p&gt;
&lt;pre&gt;
    The MSR_DEBUGCTLA MSR enables and disables the various
    last branch recording mechanisms described in the previous
    section. This register can be written to using the WRMSR
    instruction, when operating at privilege level 0 or when
    in real-address mode. A protected-mode operating system
    procedure is required to provide user access to this register.
    Figure 15-4 shows the flags in the MSR_DEBUGCTLA MSR. The
    functions of these flags are as follows:
    ...
    BTF (single-step on branches) flag (bit 1)
    When set, the processor treats the TF flag in the EFLAGS
    register as a &quot;singlestep on branches&quot; flag rather than a
    &quot;single-step on instructions&quot; flag. This mechanism allows
    single-stepping the processor on taken branches, interrupts,
    and exceptions. See Section 15.5.4., &quot;Single-Stepping on
    Branches, Exceptions, and Interrupts&quot; for more information
    about the BTF flag.
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
According to the documentation, the behaviour of single step can be altered through a flag in one of the Model Specific Registers (MSRs). So I threw some &lt;a href=&quot;http://www.openrce.org/downloads/details/208/PaiMei&quot; target=&quot;_top&quot;&gt;PyDbg&lt;/a&gt; based Python code together to test this out. First, I implemented a conventional single step tracer: &lt;a href=&quot;http://www.openrce.org/repositories/users/pedram/tracer_single_step.py&quot; target=&quot;_top&quot;&gt;tracer_single_step.py&lt;/a&gt;. Next, I modified that tracer with the appropriate MSR setting code: &lt;a href=&quot;http://www.openrce.org/repositories/users/pedram/tracer_msr_branch.py&quot; target=&quot;_top&quot;&gt;tracer_msr_branch.py&lt;/a&gt;. Ran them both and to my pleasant surprise it worked like a charm. Try them for yourself. Attach to and interact with calculator with the single step tracer then try it again with the MSR tracer, the speed difference is quite notable. Implementing the MSR tracer required almost minimal changes. First, some definitions:
&lt;/p&gt;
&lt;pre&gt;
    SysDbgReadMsr  = 16
    SysDbgWriteMsr = 17
    
    ULONG     = c_ulong
    ULONGLONG = c_ulonglong
    
    class SYSDBG_MSR(Structure):
        _fields_ = [
            (&quot;Address&quot;, ULONG),
            (&quot;Data&quot;,    ULONGLONG),
    ]
    
    def write_msr():
        msr = SYSDBG_MSR()
        msr.Address = 0x1D9
        msr.Data = 2
        status = windll.ntdll.NtSystemDebugControl( \
            SysDbgWriteMsr,
            byref(msr),
            sizeof(SYSDBG_MSR),
            0,
            0,
            0);
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
The write_msr() routine defined above utilizes the NtSystemDebugControl() Windows native API (special thanks to &lt;a href=&quot;http://www.openrce.org/profile/view/AlexIonescu&quot; target=&quot;_top&quot;&gt;Alex Ionescu&lt;/a&gt; for his help with this) to set the appropriate MSR values specific to my Pentium M processor. Your mileage may vary with those values, check the Intel manual for the appropriate numbers. Next, all you have to do is follow every call to single_step() with a call to write_msr():
&lt;/p&gt;
&lt;pre&gt;
    # re-raise the single step flag on every block.
    def handler_single_step (dbg):
        ...
        dbg.single_step(True)
        write_msr()
        return DBG_CONTINUE
        
    # ensure every new thread starts in single step mode.
    def handler_new_thread (dbg):
        dbg.single_step(True)
        write_msr()
        return DBG_CONTINUE
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
I'll be adding MSR routines to PyDbg in a future release and will also release a new version of Process Stalker that does not require any pre-analysis to accomplish its code tracing... When I find the time to do all that I may expand this blog entry with further details and examples into a full blown article.
&lt;br&gt;&lt;br&gt;
&lt;b&gt;Caveat Emptor&lt;/b&gt;: It appears that you can kill your CPU if you carelessly fool around with MSRs. So there, I said it, be warned.</description>
        </item>
                <item>
            <title>12.09.2006: Pcapy (Sniffing) on WiFi</title>
            <link>http://pedramamini.com/blog/2006.12.09/</link>
            <pubDate>Sat, 09 Dec 2006 00:00:00 -0600</pubDate>
            <description>I like to develop on my (Windows) laptop... I also like to develop from the comfort of my sweet &lt;a href=&quot;http://www.cordaroys.com/bb_full.asp&quot; target=&quot;_top&quot;&gt;Corda-Roy bean bag chair&lt;/a&gt;, which means I'll be connected via WiFi. Unfortunately sniffing via Ethereal or &lt;a href=&quot;http://oss.coresecurity.com/projects/pcapy.html&quot; target=&quot;_top&quot;&gt;CORE's Pcapy&lt;/a&gt; library is not possible in this situation. I came up with a convenient 2-step solution to my woe that perhaps others will find useful.
&lt;br&gt;&lt;br&gt;
First, snag yourself an &lt;a href=&quot;http://www.thinkgeek.com/gadgets/tools/6c20&quot; target=&quot;_top&quot;&gt;Ethernet Loopback Jack&lt;/a&gt; and plug it in. This will trick your NIC into thinking it's actually plugged into a network. Next, create a network bridge and add the LAN adapter followed by the WiFi adapter. The network bridge shows up as a new interface that you can sniff on!
&lt;br&gt;&lt;br&gt;
&lt;b&gt;***** UPDATE *****&lt;/b&gt;&lt;br&gt;
&lt;a href=&quot;http://www.openrce.org/profile/view/tagetora&quot; target=&quot;_top&quot;&gt;tagetora&lt;/a&gt; was kind enough to write me and suggest trying to bridge with a loop back device to avoid the additional hardware. I'm pleased to report that it works like a charm. For instructions on how to create a loop back device see: &lt;a href=&quot;http://support.microsoft.com/kb/839013&quot; target=&quot;_top&quot;&gt;http://support.microsoft.com/kb/839013&lt;/a&gt;.</description>
        </item>
                <item>
            <title>10.05.2006: Owning Computer Associates BrightStor through Mailslots</title>
            <link>http://pedramamini.com/blog/2006.10.05/</link>
            <pubDate>Thu, 05 Oct 2006 00:00:00 -0500</pubDate>
            <description>Recall from &lt;a href=&quot;http://pedram.redhive.com/blog/2006-07-11/&quot; target=&quot;_top&quot;&gt;blog/2006-07-11&lt;/a&gt; and &lt;a href=&quot;http://www.tippingpoint.com/security/advisories/TSRT-06-02.html&quot; target=&quot;_top&quot;&gt;TSRT-06-02&lt;/a&gt; that any code relying on the implicit message size limitation of Second-class Mailslots could be exposing a vulnerability. I mentioned that the rare usage of Mailslots will severely mitigate the impact of this new &quot;class&quot; of vulnerability. The fact that no Mailslot bugs have emerged since the initial disclosure is evidence that my assumption was true.
&lt;br&gt;&lt;br&gt;
The one 3rd party exposure I have personally come across was just disclosed today: &lt;a href=&quot;http://www.tippingpoint.com/security/advisories/TSRT-06-12.html&quot; target=&quot;_top&quot;&gt;CA BrightStor Discovery Service Mailslot Buffer Overflow Vulnerability&lt;/a&gt;. The exposed Mailslot name is 'CheyenneDS' and a no explicit &lt;i&gt;MaxMessageSize&lt;/i&gt; is supplied in the call to &lt;i&gt;CreateMailslot&lt;/i&gt;, an attacker can cause an exploitable stack-based buffer overflow. Here is the creation of the Mailslot:
&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;casdscsvc.exe -&gt; Asbrdcst.dll&lt;/b&gt;
 20C14E8C push 0                ; lpSecurityAttributes
 20C14E8E push 0                ; lReadTimeout
 20C14E90 push 0                ; nMaxMessageSize
 20C14E92 push offset Name      ; &quot;\\\\.\\mailslot\\CheyenneDS&quot;
 20C14E97 stosb
 20C14E98 call ds:CreateMailslotA
 20C14E9E cmp eax, INVALID_HANDLE_VALUE
 20C14EA1 mov mailslot_handle, eax
&lt;/pre&gt;

&lt;p align=&quot;justify&quot;&gt;
Later the mailslot handle is read from into a 4k buffer. The read data is also passed to a routine which calls vsprintf into a 1k buffer.
&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;casdscsvc.exe -&gt; Asbrdcst.dll&lt;/b&gt;
 20C15024 mov eax, mailslot_handle
 20C15029 lea edx, [esp+1044h+Buffer_4k]
 20C1502D push ecx                        ; nNumberOfBytesToRead
 20C1502E push edx                        ; lpBuffer
 20C1502F push eax                        ; hFile
 20C15030 call edi ; ReadFile
 20C15032 test eax, eax
 20C15034 jz  short read_failed
 20C15036 lea ecx, [esp+3Dh]
 20C1503A push ecx                        ; char
 20C1503B push offset str_ReadmailslotS   ; &quot;ReadMailSlot: %s\n&quot;
 20C15040 call not_interesting_call_to_vsnprtinf
 20C15045 add esp, 8
 20C15048 lea edx, [esp+3Dh]
 20C1504C push edx                        ; va_list
 20C1504D push offset str_ReadmailslotS_0 ; &quot;ReadMailSlot: %s&quot;
 20C15052 push 0                          ; for_debug_log
 20C15054 call vsprintf_into_1024_stack_buf_and_debug_log
&lt;/pre&gt;

&lt;p align=&quot;justify&quot;&gt;
One would imagine that at least one other instance of a Mailslot handling bug must exist elsewhere. Anyone?
&lt;/p&gt;</description>
        </item>
                <item>
            <title>08.10.2006: eEye Binary Diffing Suite (EBDS)</title>
            <link>http://pedramamini.com/blog/2006.08.10/</link>
            <pubDate>Thu, 10 Aug 2006 00:00:00 -0500</pubDate>
            <description>Just wanted to drop a quick note regarding eEye's recently released bin-diffing tool:
&lt;br&gt;&lt;br&gt;
&lt;a href=&quot;http://research.eeye.com/html/tools/RT20060801-1.html&quot; target=&quot;_top&quot;&gt;http://research.eeye.com/html/tools/RT20060801-1.html&lt;/a&gt;
&lt;br&gt;&lt;br&gt;
It's definitely badass and it definitely took a lot of work to put together. It's also open source and a large portion of it is written in Python, so lots of new toys for me to play with. I'm particularly interested in their embedded graph view. They used QT vs. WX (which is what I'm used to), but I'm sure portions can be re-used.
&lt;br&gt;&lt;br&gt;
On a separate but somewhat similar note. I was originally going to store PIDA output to MySQL and forget now why I decided against that. However, in light of the virtual memory consumption issues I will be moving to that backend (with dynamic queries / &quot;free()'s&quot;). Not to worry for anyone (if there is anyone) who has built scripts on top of PaiMei already; the interfaces will not change. I think I've mentioned it before, but I'll use the schema from SABRE in efforts of gaining widespread acceptance and &quot;standarization&quot;. All in due time ... when I find the time.</description>
        </item>
                <item>
            <title>07.18.2006: PaiMei Hooking Library</title>
            <link>http://pedramamini.com/blog/2006.07.18/</link>
            <pubDate>Tue, 18 Jul 2006 00:00:00 -0500</pubDate>
            <description>For those of you who are interested, Ero and I are giving a 2-day course in Vegas at Blackhat on &lt;a href=&quot;http://www.blackhat.com/html/bh-usa-06/train-bh-us-06-pa.html&quot; target=&quot;_top&quot;&gt;Reverse Engineering on Windows&lt;/a&gt;. While the class will have a malware centric focus, the main purpose of the course is to glean general reversing knowledge and techniques. In the process PaiMei will certainly be covered, explored and experimented with. With that shameless self plug said and done, onto the main reason behind this posting.
&lt;br&gt;&lt;br&gt;
I was talking with Gera about an older project of his where he combined the IDA debugger with some OpenGL code to create a real-time plot of heap manipulations. We decided that the functionality should be easy to port to PaiMei, but first a convenient interface to API hooking was needed. As such, I wrote &lt;a href=&quot;/PaiMei/heap_trace/hook_container.py&quot; target=&quot;_top&quot;&gt;utils.hook_container&lt;/a&gt;. I haven't updated the PaiMei release to include this just yet, but if you want to try it out simply copy the file over to your &lt;i&gt;utils&lt;/i&gt; directory and modify &lt;i&gt;utils/__init__.py&lt;/i&gt; to include the proper references.
&lt;br&gt;&lt;br&gt;
Now you can easily hook arbitrary API calls. To start, instantiate a container that will house the various hooks:
&lt;pre&gt;
    hooks = utils.hook_container()
&lt;/pre&gt;
Next resolve and add hooks for your target functions. In our case, we will need to hook RtlAllocateHeap, RtlFreeHeap and RtlReAllocateHeap. All located within NTDLL.DLL:
&lt;pre&gt;
    a = dbg.func_resolve(&quot;ntdll&quot;, &quot;RtlAllocateHeap&quot;)
    f = dbg.func_resolve(&quot;ntdll&quot;, &quot;RtlFreeHeap&quot;)
    r = dbg.func_resolve(&quot;ntdll&quot;, &quot;RtlReAllocateHeap&quot;)
    
    hooks.add(dbg, a, 3, None, RtlAllocateHeap)
    hooks.add(dbg, f, 3, None, RtlFreeHeap)
    hooks.add(dbg, r, 4, None, RtlReAllocateHeap)
&lt;/pre&gt;
The first argument to the hook container object is an instance of PyDbg, the second is the address of the API to hook, followed by the number of arguments the API supports, a callback function for when the API is entered and finally a callback function for when the API exits. The entry-point callback provides you with the argument list, allowing you to instrument the arguments prior to passing control back to the API. The exit-point callback provides you with the argument list and return value, allowing you to instrument the return value prior to passing control back to the caller.
&lt;br&gt;&lt;br&gt;
With that out of the way it's fairly trivial to generate and dynamically maintain a pgraph structure as well as display the results in real time through uDraw. Whenever RtlAllocateHeap is called, we'll create an orange node containing the address of the calling instruction, a blue node containing the allocation size and we'll connect the two nodes together. This is sufficient for a demo, but as we are hooking the lowest user-mode level heap manipulation routines the calling instruction address will likely lie within a Windows DLL and is not all that interesting. To improve this we could examine dbg.stack_unwind() and utilize the first address that lies within a non Microsoft DLL. Whenever RtlFreeHeap is called we will examine the arguments and remove the buffer address from the graph. Finally, whenever RtlReAllocateHeap is called, we'll resize the target buffer and paint the node yellow. We can then easily tie it to uDraw through the udraw_connector. All said and done, here is a flash excerpt from the code in action:
&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href=&quot;http://pedram.redhive.com/PaiMei/heap_trace/&quot; target=&quot;_blank&quot;&gt;http://pedram.redhive.com/PaiMei/heap_trace/&lt;/a&gt;
&lt;br&gt;&lt;br&gt;
You can grab the code behind this application from &lt;a href=&quot;http://pedram.redhive.com/PaiMei/heap_trace/heap_trace.py&quot; target=&quot;_top&quot;&gt;heap_trace.py&lt;/a&gt;. As an experiment I tossed in some to disk rendering once the graph node count reaches 1000.
&lt;br&gt;&lt;br&gt;
It's all pretty simple. One of the nice things about this class is that it (I think / hope) transparently takes care of various thread-related race conditions that make pairing arguments and return values more tricky than trivial.</description>
        </item>
                <item>
            <title>07.11.2006: Microsoft Ring0 Vulnerability++</title>
            <link>http://pedramamini.com/blog/2006.07.11/</link>
            <pubDate>Tue, 11 Jul 2006 00:00:00 -0500</pubDate>
            <description>Just publicly released an advisory affecting the Microsoft Windows kernel: &lt;a href=&quot;http://www.tippingpoint.com/security/advisories/TSRT-06-02.html&quot; target=&quot;_top&quot;&gt;Microsoft SRV.SYS Mailslot Ring0 Memory Corruption Vulnerability&lt;/a&gt;. I worked with &lt;a href=&quot;http://www.metasploit.com&quot; target=&quot;_top&quot;&gt;H D Moore&lt;/a&gt; (who you most recently heard of from his &lt;a href=&quot;http://browserfun.blogspot.com/&quot; target=&quot;_top&quot;&gt;Browser Fun&lt;/a&gt; blog) in discovering this bug. This is a great example of the benefits of having a custom SMB stack, many thanks to HD for sacrificing his Sunday afternoon with me on this.
&lt;br&gt;&lt;br&gt;
The kernel memory corruption is obviously interesting as it allows for ring0 code execution. However, I find the following actual attack vector to be more interesting. According to the Microsoft Developer Network (MSDN) documentation, Mailslot communications are divided into two classes. First-class Mailslots are connection oriented and operate over SMB/TCP. Second-class Mailslots provide connectionless messaging for broadcast messages and operate over SMB/UDP. Second-class Mailslots are limited to 424 bytes per message. &lt;b&gt;First-class Mailslots are officially unsupported in the Windows 2000, XP and 2003 operating systems.&lt;/b&gt; This is the key point as it means that any code relying on the implicit message size limitation could be exposing a vulnerability. So add mailslots to your list of interfaces to enumerate and examine when auditing a target. Look for calls to the &lt;i&gt;CreateMailSlot&lt;/i&gt; API, example:
&lt;/p&gt;
&lt;pre&gt;
    push 0          ; lpSecurityAttributes
    push 0          ; lReadTimeout
    push 0          ; &lt;b&gt;nMaxMessageSize&lt;/b&gt;
    push slot_name  ; &quot;\\\\.\\mailslot\\mailslot_name&quot;
    call CreateMailslotA
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
The &lt;b&gt;nMaxMessageSize&lt;/b&gt; argument is key as it specifies the maximum size of a single message that can be written to the Mailslot in bytes, a value of zero allows for any arbitrary size (this is what you want). So the big question is, what else is exposed? I know of at least one 3rd party application, details of which will be released when a patch is available. A combination of Googling and examinaton of a number of targets tells me that Mailslot usage is pretty rare (fortunate or unfortunate depending on your point of view), but I'm curious to see what the masses discover.
&lt;/p&gt;</description>
        </item>
                <item>
            <title>06.16.2006: RECON2006 - PaiMei Release</title>
            <link>http://pedramamini.com/blog/2006.06.16/</link>
            <pubDate>Fri, 16 Jun 2006 00:00:00 -0500</pubDate>
            <description>As promised, to those of you at my RECON talk, the initial release of PaiMei is available for download from:
&lt;br&gt;&lt;br&gt;
&lt;a href=&quot;http://www.openrce.org/downloads/details/208/PaiMei&quot; target=&quot;_top&quot;&gt;http://www.openrce.org/downloads/details/208/PaiMei&lt;/a&gt;
&lt;br&gt;&lt;br&gt;
You can download my slides (again apologies for running over time) from my respository:
&lt;br&gt;&lt;br&gt;
&lt;a href=&quot;http://www.openrce.org/repositories/users/pedram/RECON2006-Amini.zip&quot; target=&quot;_top&quot;&gt;RECON2006-Amini.zip&lt;/a&gt;
&lt;br&gt;&lt;br&gt;
The bundled framework documentation is available for viewing online as well at:
&lt;br&gt;&lt;br&gt;
&lt;a href=&quot;/PaiMei/&quot; target=&quot;_top&quot;&gt;/PaiMei/&lt;/a&gt;
&lt;br&gt;&lt;br&gt;
I'll likely blog a bit more about the tool and RECON in general later in the weekend.</description>
        </item>
                <item>
            <title>01.06.2006: ShmooCon 2006</title>
            <link>http://pedramamini.com/blog/2006.01.06/</link>
            <pubDate>Fri, 06 Jan 2006 00:00:00 -0600</pubDate>
            <description>It took a few days of (interspersed) debugging but I finally got memory breakpoints implemented in the Python Win32 debugging engine I wrote last weekend. It's built on the &lt;a href=&quot;http://starship.python.net/crew/theller/ctypes/&quot; target=&quot;_top&quot;&gt;Python ctypes module&lt;/a&gt;, which I'm very fond of. Many thanks to the people I leaned on at various times while pulling my hair out trying to figure out what was wrong (hoglund, spoon, skape, drew ...). I'll make it available at some point, it's currently way too ugly but very functional:
&lt;pre&gt;
    def attach:
    def bp_del:
    def bp_del_mem:
    def bp_is_ours:
    def bp_is_ours_mem:
    def bp_set:
    def bp_set_mem:
    def cleanup:
    def debug_event_loop:
    def detach:
    def disasm:
    def dump_context:
    def enumerate_threads:
    def exception_handler_breakpoint:
    def exception_handler_guard_page:
    def exception_handler_single_step:
    def func_resolve:
    def get_thread_context:
    def hex_dump:
    def hide_debugger:
    def is_address_on_stack:
    def is_printable_ascii:
    def is_printable_unicode:
    def little_endian:
    def load:
    def process_restore:
    def process_snapshot:
    def read_process_memory:
    def resume_thread:
    def set_callback:
    def set_register:
    def set_thread_context:
    def single_step:
    def smart_dereference:
    def stack_range:
    def suspend_thread:
    def terminate_process:
    def virtual_protect:
    def virtual_query:
    def write_process_memory:
    &lt;/pre&gt;
It's interesting being able to quickly prototype various debugging based ideas in Python:
&lt;pre&gt;
    pydbg = pydbg()
    
    pydbg.set_callback(EXCEPTION_BREAKPOINT,       h_bp)
    pydbg.set_callback(EXCEPTION_ACCESS_VIOLATION, h_av)
    
    try:
        pydbg.attach(pid)
    
        recv     = pydbg.func_resolve(&quot;ws2_32&quot;,  &quot;recv&quot;)
        recvfrom = pydbg.func_resolve(&quot;ws2_32&quot;,  &quot;recvfrom&quot;)
    
        pydbg.bp_set(recv)
        pydbg.bp_set(recvfrom)
    
        pydbg.debug_event_loop()
    except pdx, x:
        sys.stderr.write(x.__str__() + &quot;\n&quot;)
&lt;/pre&gt;
There is still an oustanding question of how exactly Windows deals with guard pages. I put that question up in the forums so people can respond to it:
&lt;br&gt;&lt;br&gt;
&lt;a href=&quot;http://www.openrce.org/forums/posts/110&quot; target=&quot;_top&quot;&gt;http://www.openrce.org/forums/posts/110&lt;/a&gt;</description>
        </item>
                <item>
            <title>11.02.2005: Debugger Debugging Madness</title>
            <link>http://pedramamini.com/blog/2005.11.02/</link>
            <pubDate>Wed, 02 Nov 2005 00:00:00 -0600</pubDate>
            <description>Recently, I was setting up a new installation of IDA and decided to document all of my customizations for ease of portability. I am curious to hear about what other customizations people use / have come across. Should make for an interesting dialog. Here are the customizations I use:
&lt;/p&gt;
&lt;pre&gt;
&lt;b&gt;---------- ida.idc ----------&lt;/b&gt;
#include &lt;idc.idc&gt;
#include &lt;pedram_function_tagger.idc&gt;
#include &lt;pedram_jump_to_func_top.idc&gt;
#include &lt;pedram_export_disassembly.idc&gt;

static main(void) {

//
// This function is executed when IDA is started.
//
// Add statements to fine-tune your IDA here.
//

    AddHotkey(&quot;Ctrl-Shift-X&quot;,     &quot;export_disassembly&quot;);
    AddHotkey(&quot;Ctrl-Shift-J&quot;,     &quot;jump_to_func_top&quot;);
    AddHotkey(&quot;Ctrl-Shift-Enter&quot;, &quot;track_follow&quot;);
    AddHotkey(&quot;Ctrl-Shift-N&quot;,     &quot;track_name&quot;);
...

&lt;b&gt;---------- ida.cfg ----------&lt;/b&gt;
&lt;i&gt;Some of these customizations were gleaned from Nicolas Brulez&lt;/i&gt;

// This prefix is used when a new
// name is generated
// changed this from 'a' to 'str-&gt;'
ASCII_PREFIX = &quot;str-&gt;&quot;

// Maximal length of new names
// (you may specify values up to 511)
// increased this to 128
MAX_NAMES_LENGTH = 128

// asm specific character, added '-' and '&gt;'
NameChars = &quot;$?@-&gt;&quot;

SHOW_XREFS        = 4
SHOW_BASIC_BLOCKS = YES
SHOW_SP           = YES

&lt;b&gt;---------- idagui.cfg ----------&lt;/b&gt;
HELPFILE = &quot;c:\\OPCODES.HLP&quot;

// Display the Edit,Patch submenu
DISPLAY_PATCH_SUBMENU = YES

// Display the expressions/IDC command line
DISPLAY_COMMAND_LINE  = YES

// display referenced items
&quot;ChartXrefsTo&quot;   = &quot;Ctrl-Shift-T&quot;

// display referencing items
&quot;ChartXrefsFrom&quot; = &quot;Ctrl-Shift-F&quot;

// lock the current highlighted text
&quot;LockHighlight&quot;  = &quot;Ctrl-H&quot;
&lt;/pre&gt;
&lt;p align=&quot;justify&quot;&gt;
All of the above referenced files are available from my &lt;a href=&quot;http://www.openrce.org/repositories/browse/pedram&quot; target=&quot;_top&quot;&gt;file respository&lt;/a&gt; on &lt;a href=&quot;http://www.openrce.org&quot; target=&quot;_top&quot;&gt;OpenRCE&lt;/a&gt;.</description>
        </item>
                <item>
            <title>09.20.2005: IDA Disassembly and Graph Coloring</title>
            <link>http://pedramamini.com/blog/2005.09.20/</link>
            <pubDate>Tue, 20 Sep 2005 00:00:00 -0500</pubDate>
            <description>&lt;a href=&quot;http://www.toorcon.org&quot; target=&quot;_top&quot;&gt;ToorCon&lt;/a&gt; was awesome. This was my first time out to that con (as well as San Diego for that matter) and it more then lived up to expectations. The venue was good, the weather was great and the party was successful, thanks in no small part due to a financial contribution from Microsoft I'm sure.
&lt;br&gt;&lt;br&gt;
There were a number of good talks there. Among the more unique/interesting was Skape's presentation on &lt;a href=&quot;http://www.uninformed.org/?v=2&amp;a=2&amp;t=sumry&quot; target=&quot;_top&quot;&gt;&quot;temporal return addresses&quot;&lt;/a&gt; and Christopher Abad's talk where he cracked basic crypto with Photoshop and demo-ed a multi-color ASCII &quot;video&quot; streamer he wrote. Some of Christopher's work can be found at &lt;a href=&quot;http://the-mathclub.net&quot; target=&quot;_top&quot;&gt;http://the-mathclub.net&lt;/a&gt;.</description>
        </item>
                <item>
            <title>08.01.2005: IDA Customizations</title>
            <link>http://pedramamini.com/blog/2005.08.01/</link>
            <pubDate>Mon, 01 Aug 2005 00:00:00 -0500</pubDate>
            <description>Still recovering from a week in Vegas. I have a new founded respect for teachers/professors. The two day intermediate malware analysis course I gave put my voice out of commission. I don't know how it's possible to maintain that for months on end. Talking over loud music definetely didn't help the situation. Vegas was a blast. Caught some good talks at Blackhat, put a lot of faces to names at the various parties- the most amazing of which was the 3Com/TippingPoint party held on Wednesday night at the Hard Rock. There must have been almost a thousand people there and the place was out of control. Who would have guessed that the dance floor of a security conference party would ever fill up. In my (currently unbiased) opinion this party was the best of the week.
&lt;br&gt;&lt;br&gt;
Speaking of currently unbiased. I will be transitioning to &lt;a href=&quot;http://www.tippingpoint.com&quot; target=&quot;_top&quot;&gt;TippingPoint&lt;/a&gt; over the balance of this month and am excited about the career change. Once I get settled in I will start tackling the long list of feature requests for &lt;a href=&quot;http://www.openrce.org&quot; target=&quot;_top&quot;&gt;OpenRCE&lt;/a&gt;. Including: adding an events section, the ability to edit posts, a new (and very cool) reference library feature that Greg Hoglund may potentially contribute, blog comments etc...
&lt;br&gt;&lt;br&gt;
The re-architecting and development of IDA Sync will follow shortly after the updates to OpenRCE. Once the ground work is laid out I will poll the users via the forums for comments, criticisms and suggestions.</description>
        </item>
                <item>
            <title>07.06.2005: Process Stalker Tool Release</title>
            <link>http://pedramamini.com/blog/2005.07.06/</link>
            <pubDate>Wed, 06 Jul 2005 00:00:00 -0500</pubDate>
            <description>I released &lt;a href=&quot;http://pedram.redhive.com/code/process_stalker&quot; target=&quot;_top&quot;&gt;Process Stalker&lt;/a&gt; publicly today, open source and available for download from &lt;a href=&quot;http://www.idefense.com/iia/labs-software.jsp#process_stalker&quot; target=&quot;_top&quot;&gt;http://labs.idefense.com&lt;/a&gt;. Process Stalking is a term coined to describe the combined process of run-time profiling, state mapping and tracing. Consisting of a series of tools and scripts the goal of a successful stalk is to provide the reverse engineer with an intuitive visual interface to filtered, meaningful, run-time block-level trace data.
&lt;br&gt;&lt;br&gt;
A step-by-step example walkthrough of Process Stalker vs the &lt;a href=&quot;http://www.idefense.com/application/poi/display?id=263&amp;type=vulnerabilities&quot; target=&quot;_top&quot;&gt;Microsoft MS05-030 security bulletin&lt;/a&gt; is available at &lt;a href=&quot;http://www.openrce.org&quot; target=&quot;_top&quot;&gt;http://www.openrce.org&lt;/a&gt;. Binaries, source code and in-depth documentation are available in the bundled archive. Relevant slideshows from Process Stalker presentations are available on the &lt;a href=&quot;http://pedram.redhive.com/research/past/&quot; target=&quot;_top&quot;&gt;past speaking engagements&lt;/a&gt; page.
&lt;br&gt;&lt;br&gt;
The &lt;a href=&quot;http://pedram.redhive.com/code/ida_plugins/function_analyzer/&quot; target=&quot;_top&quot;&gt;IDA Function Analyzer&lt;/a&gt; component was used and extended in the development of Process Stalker. The biggest change is the addition of the gml_export() routine for generating GML graphs.</description>
        </item>
                <item>
            <title>06.21.2005: MS05-025 PNG Image Rendering Vulnerability</title>
            <link>http://pedramamini.com/blog/2005.06.21/</link>
            <pubDate>Tue, 21 Jun 2005 00:00:00 -0500</pubDate>
            <description>Spent some time with spoonm over the weekend at RECON tinkering with the MS05-025 PNG vulnerability. Using my own not-as-cool-as-halvar's bindiff tool I came across the following significant change:
&lt;br&gt;&lt;br&gt;
&lt;center&gt;&lt;a href=&quot;http://pedram.redhive.com/openrce/ms05025_diff.gif&quot; target=&quot;_top&quot;&gt;ms05025_diff.gif&lt;/a&gt;&lt;/center&gt;
&lt;br&gt;&lt;br&gt;
The left column is pre-patch and the right column is post-patch. Further tracing reveals the actual vulnerable loop that leads to heap corruption, a jump table for which case 0x9 is required to reach the vulnerable function and some other interesting tidbits. All in all the vulnerability wasn't difficult to pin point, the biggest hurdle is overcoming the lazyness required to generate a valid PNG image as the CRC checks are done prior to reaching the vulnerable code.</description>
        </item>
                <item>
            <title>06.20.2005: OpenRCE Site Launch</title>
            <link>http://pedramamini.com/blog/2005.06.20/</link>
            <pubDate>Mon, 20 Jun 2005 00:00:00 -0500</pubDate>
            <description>Just got back from &lt;a href=&quot;http://www.recon.cx&quot; target=&quot;_top&quot;&gt;RECON&lt;/a&gt; in Montreal. The trip back was miserable (4 flights spanning over 12 hours due to cancellations etc.) but the con was great. Lots of great speakers including Nicolas Brulez, Andrew Griffiths and spoonm. My talk was well received, RECON was definetely the perfect venue for Process Stalker.
&lt;br&gt;&lt;br&gt;
On another note. I finally unveiled my latest pet project, the Open Reverse Code Engineering community site, &lt;a href=&quot;http://www.openrce.org&quot; target=&quot;_top&quot;&gt;OpenRCE.org&lt;/a&gt;. The site is very usable but has many features still under development. Please share any comments, suggestions, bug reports and especially content with one of the site admins.</description>
        </item>
                <item>
            <title>06.01.2005: Windows Heap Visualization</title>
            <link>http://pedramamini.com/blog/2005.06.01/</link>
            <pubDate>Wed, 01 Jun 2005 00:00:00 -0500</pubDate>
            <description>You may have noticed the ghosted 'Heap' option under the 'View' menu in OllyDBG. The feature is available only under Windows 95 based OSes and is supposed to display a list of allocated memory blocks. I've written a plug-in, &lt;a href=&quot;http://pedram.redhive.com/code/ollydbg_plugins/olly_heap_vis/&quot; target=&quot;_top&quot;&gt;Olly Heap Vis&lt;/a&gt;, to provide this missing functionality and more on all modern Windows OSes such as Windows 2000, XP and 2003.
&lt;br&gt;&lt;br&gt;
The Olly Heap Vis plug-in provides heap chunk lists, the ability to search the heap, a quick heap jump and finally visualization capabilities through Graphviz. More information and source code is available in the bundled archive.</description>
        </item>
                <item>
            <title>04.12.2005: RECON Talk</title>
            <link>http://pedramamini.com/blog/2005.04.12/</link>
            <pubDate>Tue, 12 Apr 2005 00:00:00 -0500</pubDate>
            <description>I've been accepted to speak about &lt;a href=&quot;http://pedram.redhive.com/research/process_stalking/&quot; target=&quot;_top&quot;&gt;Process Stalking&lt;/a&gt; at &lt;a href=&quot;http://www.recon.cx/&quot; target=&quot;_top&quot;&gt;RECON&lt;/a&gt;, a computer security conference being held in Montreal from June 17th through 19th.
&lt;br&gt;&lt;br&gt;
Full details and source code for Process Stalking will be released in the coming months.</description>
        </item>
            </channel>
</rss>
