{"componentChunkName":"component---src-templates-post-template-js","path":"/windows-windbg-009-base64-en","result":{"data":{"markdownRemark":{"id":"eae48e41-1f4f-56a2-a299-8ab4d83b4771","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/windows-windbg-009-base64\">original page</a>.</p>\n</blockquote>\n<p>This time I want to decompile a custom Base64 module with Ghidra and then trace through its execution with WinDbg.</p>\n<!-- omit in toc -->\n<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Table of Contents</h2>\n<ul>\n<li><a href=\"#building-and-compiling-the-base64-program\">Building and Compiling the Base64 Program</a></li>\n<li>\n<p><a href=\"#about-the-base64-implementation\">About the Base64 Implementation</a></p>\n<ul>\n<li><a href=\"#what-is-base64\">What Is Base64?</a></li>\n<li><a href=\"#base64-source-code\">Base64 Source Code</a></li>\n<li><a href=\"#base64-program-header-file\">Base64 Program Header File</a></li>\n</ul>\n</li>\n<li><a href=\"#capturing-a-time-travel-debugging-trace-with-windbg\">Capturing a Time Travel Debugging Trace with WinDbg</a></li>\n<li>\n<p><a href=\"#decompiling-the-base64-program-with-ghidra\">Decompiling the Base64 Program with Ghidra</a></p>\n<ul>\n<li><a href=\"#identifying-the-main-function-from-the-entry-point\">Identifying the main Function from the Entry Point</a></li>\n<li><a href=\"#reading-the-decompiled-base64encode-function\">Reading the Decompiled Base64Encode Function</a></li>\n<li><a href=\"#reading-the-decompiled-base64decode-function\">Reading the Decompiled Base64Decode Function</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#analyzing-the-ttd-trace\">Analyzing the TTD Trace</a></p>\n<ul>\n<li><a href=\"#loading-the-symbol-file\">Loading the Symbol File</a></li>\n<li><a href=\"#setting-breakpoints\">Setting Breakpoints</a></li>\n<li><a href=\"#aligning-the-image-base-between-windbg-and-ghidra\">Aligning the Image Base Between WinDbg and Ghidra</a></li>\n<li><a href=\"#setting-a-breakpoint-at-the-target-location\">Setting a Breakpoint at the Target Location</a></li>\n<li><a href=\"#reading-the-assembly\">Reading the Assembly</a></li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a></li>\n</ul>\n<h2 id=\"building-and-compiling-the-base64-program\" style=\"position:relative;\"><a href=\"#building-and-compiling-the-base64-program\" aria-label=\"building and compiling the base64 program permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Building and Compiling the Base64 Program</h2>\n<p>First, let me build the program that will be used for analysis.</p>\n<p>The source code is available in the following repository.</p>\n<p>Reference: <a href=\"https://github.com/kash1064/Try2WinDbg\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">kash1064/Try2WinDbg</a></p>\n<p>For the Base64 encode and decode program, I borrowed the implementation introduced in the article below, which is distributed under the <code class=\"language-text\">WTFPL v2</code> license.</p>\n<p>Reference: <a href=\"https://qiita.com/leak4mk0/items/6c7f708dd59d52e0bc5c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Functions for BASE64 Encoding and Decoding in C - Qiita</a></p>\n<p>Some parts have been customized, but the base is largely unchanged.</p>\n<p>The source code introduced in this article is also published under <code class=\"language-text\">WTFPL v2</code> in keeping with the original, so feel free to use it.</p>\n<p>Note: the correctness of the Base64 encoding and decoding results is not guaranteed.</p>\n<p>Build with the following commands.</p>\n<p>The developer command prompt must be configured in advance to enable cl.exe.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token function\">git</span> clone https://github.com/kash1064/Try2WinDbg\n<span class=\"token builtin class-name\">cd</span> Try2WinDbg\n\n<span class=\"token comment\"># cl.exeを利用できるように、事前に開発者用コマンドプロンプトを設定しておく</span>\ncl /c ./build/c/base64.c\n<span class=\"token function\">link</span> /DEBUG /PDB:./build/symbol/base64.pdb ./base64.obj /OUT:./build/bin/base64.exe</code></pre></div>\n<p>Even in environments where building is not possible, the TTD trace file inside <code class=\"language-text\">Try2WinDbg/trace/base64_trace.zip</code> can be used to perform TTD-based analysis.</p>\n<p>For information on loading TTD traces, refer to the following article.</p>\n<p>/Reference: <a href=\"/windows-windbg-008-time-travel-debugging-en\">WinDbg Preview: A New Debugging Approach with Time Travel Debugging</a></p>\n<h2 id=\"about-the-base64-implementation\" style=\"position:relative;\"><a href=\"#about-the-base64-implementation\" aria-label=\"about the base64 implementation permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>About the Base64 Implementation</h2>\n<h3 id=\"what-is-base64\" style=\"position:relative;\"><a href=\"#what-is-base64\" aria-label=\"what is base64 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What Is Base64?</h3>\n<p>Base64 is a data encoding method defined in <a href=\"https://datatracker.ietf.org/doc/html/rfc4648\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">RFC4648</a>.</p>\n<p>It converts arbitrary byte sequences into ASCII data, making it useful in many situations such as data storage and transfer.</p>\n<p>Base64 splits the binary data to be encoded into 24-bit chunks and then further into 6-bit groups, converting the data to a predefined set of 64 characters.</p>\n<p>When the binary data to be encoded is not a multiple of 24 bits in length, padding characters are appended.</p>\n<p>The padding character is defined in the RFC as <code class=\"language-text\">=</code>, while URL-safe Base64 encoding (also defined in the RFC) uses <code class=\"language-text\">_</code> instead.</p>\n<h3 id=\"base64-source-code\" style=\"position:relative;\"><a href=\"#base64-source-code\" aria-label=\"base64 source code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Base64 Source Code</h3>\n<p>The following is the source code for the Base64 program used in this article.</p>\n<p>It is fairly long, so detailed explanation is omitted.</p>\n<p>Running the compiled program executes the tests defined in the main function, but individual functions can also be called by linking the module from another program.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;assert.h></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;stdlib.h></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;stdio.h></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;string.h></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">\"base64.h\"</span></span>\n\n<span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token function\">base64Encode</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>data<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> <span class=\"token class-name\">size_t</span> size<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> BASE64_TYPE type<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    BASE64_SPEC base64_spec<span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">size_t</span> length<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>base64<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>cursor<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> lineLength<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> i<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> j<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// base64_specの初期化</span>\n    base64_spec <span class=\"token operator\">=</span> BASE64_SPECS<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>BASE64_SPECS_LENGTH<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>BASE64_SPECS<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>type <span class=\"token operator\">==</span> type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            base64_spec <span class=\"token operator\">=</span> BASE64_SPECS<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// エンコード後の文字列格納領域の確保</span>\n    length <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>size <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// mallocの戻り値は確保したメモリブロックを指すポインタ</span>\n    base64 <span class=\"token operator\">=</span> <span class=\"token function\">malloc</span><span class=\"token punctuation\">(</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>base64 <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    cursor <span class=\"token operator\">=</span> base64<span class=\"token punctuation\">;</span>\n    lineLength <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// 3文字単位でエンコードを行う(エンコード後は4文字になる)</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> j <span class=\"token operator\">=</span> size<span class=\"token punctuation\">;</span> j <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">+=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> j <span class=\"token operator\">-=</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x30</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>pad<span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>pad<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x30</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">>></span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x0f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3c</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>pad<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x30</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">>></span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x0f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3c</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">>></span> <span class=\"token number\">6</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x03</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span> base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">[</span>i <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">*</span>cursor <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> base64<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token function\">base64Decode</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>base64<span class=\"token punctuation\">,</span> <span class=\"token class-name\">size_t</span> <span class=\"token operator\">*</span>retSize<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> BASE64_TYPE type<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    BASE64_SPEC base64_spec<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">char</span> table<span class=\"token punctuation\">[</span><span class=\"token number\">0x80</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">size_t</span> length<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>data<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>cursor<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> i<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> j<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>base64 <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// base64_specの初期化</span>\n    base64_spec <span class=\"token operator\">=</span> BASE64_SPECS<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>BASE64_SPECS_LENGTH<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>BASE64_SPECS<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>type <span class=\"token operator\">==</span> type<span class=\"token punctuation\">)</span> \n        <span class=\"token punctuation\">{</span>\n            base64_spec <span class=\"token operator\">=</span> BASE64_SPECS<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// デコードするBase64文字列用のメモリ領域の確保</span>\n    length <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>base64<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    data <span class=\"token operator\">=</span> <span class=\"token function\">malloc</span><span class=\"token punctuation\">(</span>length <span class=\"token operator\">*</span> <span class=\"token number\">3</span> <span class=\"token operator\">/</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token function\">memset</span><span class=\"token punctuation\">(</span>table<span class=\"token punctuation\">,</span> <span class=\"token number\">0x80</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>table<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> BASE64_TABLE_LENGTH<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        table<span class=\"token punctuation\">[</span>base64_spec<span class=\"token punctuation\">.</span>table<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x7f</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> i<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    cursor <span class=\"token operator\">=</span> data<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">,</span> j <span class=\"token operator\">=</span> i <span class=\"token operator\">%</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">char</span> ch<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>base64<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> base64_spec<span class=\"token punctuation\">.</span>pad<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        ch <span class=\"token operator\">=</span> table<span class=\"token punctuation\">[</span>base64<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x7f</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>ch <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x80</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span>cursor <span class=\"token operator\">=</span> ch <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xfc</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|=</span> ch <span class=\"token operator\">>></span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x03</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span>cursor <span class=\"token operator\">=</span> ch <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xf0</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>j <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|=</span> ch <span class=\"token operator\">>></span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x0f</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span>cursor <span class=\"token operator\">=</span> ch <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">6</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xc0</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span><span class=\"token punctuation\">(</span>cursor<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|=</span> ch <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">*</span>cursor <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">*</span>retSize <span class=\"token operator\">=</span> cursor <span class=\"token operator\">-</span> data<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">int</span> i<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>BASE64_TESTS_LENGTH<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        BASE64_TEST test<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>data<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>base64<span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">size_t</span> size<span class=\"token punctuation\">;</span>\n\n        test <span class=\"token operator\">=</span> BASE64_TESTS<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n        base64 <span class=\"token operator\">=</span> <span class=\"token function\">base64Encode</span><span class=\"token punctuation\">(</span>test<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">,</span> test<span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">,</span> test<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"BASE64(\\\"%s\\\") = \\\"%s\\\"\\n\"</span><span class=\"token punctuation\">,</span> test<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">,</span> base64<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">assert</span><span class=\"token punctuation\">(</span><span class=\"token function\">strcmp</span><span class=\"token punctuation\">(</span>base64<span class=\"token punctuation\">,</span> test<span class=\"token punctuation\">.</span>base64<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        data <span class=\"token operator\">=</span> <span class=\"token function\">base64Decode</span><span class=\"token punctuation\">(</span>base64<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>size<span class=\"token punctuation\">,</span> test<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">printf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"DATA(\\\"%s\\\") = \\\"%s\\\"\\n\"</span><span class=\"token punctuation\">,</span> base64<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">assert</span><span class=\"token punctuation\">(</span>size <span class=\"token operator\">==</span> test<span class=\"token punctuation\">.</span>size<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">assert</span><span class=\"token punctuation\">(</span><span class=\"token function\">memcmp</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> test<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">,</span> size<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token function\">free</span><span class=\"token punctuation\">(</span>base64<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">free</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"base64-program-header-file\" style=\"position:relative;\"><a href=\"#base64-program-header-file\" aria-label=\"base64 program header file permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Base64 Program Header File</h3>\n<p>The following is the header file for the Base64 program.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">ifndef</span> <span class=\"token expression\">__BASE64_H__</span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">__BASE64_H__</span></span>\n\n<span class=\"token comment\">// Data</span>\n\n<span class=\"token comment\">// Base64 tables</span>\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> BASE64_TABLE<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> BASE64_TABLE_URL<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> BASE64_TABLE_CUSTOM1<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">const</span> <span class=\"token keyword\">int</span> BASE64_TABLE_LENGTH <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>BASE64_TABLE<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>BASE64_TABLE<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// enum型で使用するBase64Tableの種類を定義</span>\n<span class=\"token keyword\">typedef</span> <span class=\"token keyword\">enum</span> <span class=\"token class-name\">tagBASE64_TYPE</span>\n<span class=\"token punctuation\">{</span>\n    BASE64_TYPE_STANDARD<span class=\"token punctuation\">,</span>\n    BASE64_TYPE_URL<span class=\"token punctuation\">,</span>\n    BASE64_TYPE_CUSTOM1\n<span class=\"token punctuation\">}</span> BASE64_TYPE<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">typedef</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">tagBASE64_SPEC</span>\n<span class=\"token punctuation\">{</span>\n    BASE64_TYPE type<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>table<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">char</span> pad<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>lineSep<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">int</span> lineSepLength<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> BASE64_SPEC<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">const</span> BASE64_SPEC BASE64_SPECS<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">{</span>BASE64_TYPE_STANDARD<span class=\"token punctuation\">,</span> BASE64_TABLE<span class=\"token punctuation\">,</span> <span class=\"token char\">'='</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>BASE64_TYPE_URL<span class=\"token punctuation\">,</span> BASE64_TABLE_URL<span class=\"token punctuation\">,</span> <span class=\"token char\">'='</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>BASE64_TYPE_CUSTOM1<span class=\"token punctuation\">,</span> BASE64_TABLE_CUSTOM1<span class=\"token punctuation\">,</span> <span class=\"token char\">'='</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">const</span> <span class=\"token class-name\">size_t</span> BASE64_SPECS_LENGTH <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>BASE64_SPECS<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>BASE64_SPECS<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Export function</span>\n<span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token function\">base64Encode</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>data<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> <span class=\"token class-name\">size_t</span> size<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> BASE64_TYPE type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token function\">base64Decode</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>base64<span class=\"token punctuation\">,</span> <span class=\"token class-name\">size_t</span> <span class=\"token operator\">*</span>retSize<span class=\"token punctuation\">,</span> <span class=\"token keyword\">const</span> BASE64_TYPE type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Test data</span>\n<span class=\"token keyword\">typedef</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">tagBASE64_TEST</span> <span class=\"token punctuation\">{</span>\n    BASE64_TYPE type<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>data<span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">size_t</span> size<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>base64<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> BASE64_TEST<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">const</span> BASE64_TEST BASE64_TESTS<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">{</span>BASE64_TYPE_STANDARD<span class=\"token punctuation\">,</span> <span class=\"token string\">\"this is test\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"dGhpcyBpcyB0ZXN0\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>BASE64_TYPE_STANDARD<span class=\"token punctuation\">,</span> <span class=\"token string\">\"Hello\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"SGVsbG8=\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>BASE64_TYPE_STANDARD<span class=\"token punctuation\">,</span> <span class=\"token string\">\"Fan-Fan-Fun!!\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">13</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"RmFuLUZhbi1GdW4hIQ==\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>BASE64_TYPE_STANDARD<span class=\"token punctuation\">,</span> <span class=\"token string\">\"AAA\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"QUFB\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">const</span> <span class=\"token class-name\">size_t</span> BASE64_TESTS_LENGTH <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>BASE64_TESTS<span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>BASE64_TESTS<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">endif</span> <span class=\"token comment\">// !__BASE64_H__</span></span></code></pre></div>\n<h2 id=\"capturing-a-time-travel-debugging-trace-with-windbg\" style=\"position:relative;\"><a href=\"#capturing-a-time-travel-debugging-trace-with-windbg\" aria-label=\"capturing a time travel debugging trace with windbg permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Capturing a Time Travel Debugging Trace with WinDbg</h2>\n<p>After building, I captured a TTD trace to make analysis easier.</p>\n<p>For the TTD trace capture procedure, refer to the following article.</p>\n<p>/Reference: <a href=\"/windows-windbg-008-time-travel-debugging-en\">WinDbg Preview: A New Debugging Approach with Time Travel Debugging</a></p>\n<p>Note that even in environments where the program cannot be built, the TTD trace file inside <code class=\"language-text\">Try2WinDbg/trace/base64_trace.zip</code> can be used for TTD-based analysis.</p>\n<h2 id=\"decompiling-the-base64-program-with-ghidra\" style=\"position:relative;\"><a href=\"#decompiling-the-base64-program-with-ghidra\" aria-label=\"decompiling the base64 program with ghidra permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Decompiling the Base64 Program with Ghidra</h2>\n<p>Before analyzing the trace file, I first decompiled the Base64 program with Ghidra.</p>\n<h3 id=\"identifying-the-main-function-from-the-entry-point\" style=\"position:relative;\"><a href=\"#identifying-the-main-function-from-the-entry-point\" aria-label=\"identifying the main function from the entry point permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Identifying the main Function from the Entry Point</h3>\n<p>When executing a PE binary, the entry point runs initialization code before calling main, after which the exit process is called.</p>\n<p>Reference: <a href=\"https://www.bigmessowires.com/2015/10/02/what-happens-before-main/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">What Happens Before main() | Big Mess o’ Wires</a></p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">/* 中略 */</span>\nFID_conflict<span class=\"token operator\">:</span><span class=\"token function\">__get_initial_narrow_environment</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">thunk_FUN_0043c3a2</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">thunk_FUN_0043c39c</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nunaff_ESI <span class=\"token operator\">=</span> <span class=\"token function\">thunk_FUN_004078f0</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nuVar7 <span class=\"token operator\">=</span> <span class=\"token function\">___scrt_is_managed_app</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>uVar7 <span class=\"token operator\">!=</span> <span class=\"token char\">'\\0'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>bVar2<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    \t<span class=\"token function\">__cexit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token function\">___scrt_uninitialize_crt</span><span class=\"token punctuation\">(</span><span class=\"token char\">'\\x01'</span><span class=\"token punctuation\">,</span><span class=\"token char\">'\\0'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">*</span>in_FS_OFFSET <span class=\"token operator\">=</span> local_14<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> unaff_ESI<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token comment\">/* 中略 */</span></code></pre></div>\n<p>In other words, from the decompiled output above, <code class=\"language-text\">thunk_FUN_004078f0()</code> — called on the line immediately before <code class=\"language-text\">___scrt_is_managed_app()</code> — is the main function.</p>\n<h3 id=\"reading-the-decompiled-base64encode-function\" style=\"position:relative;\"><a href=\"#reading-the-decompiled-base64encode-function\" aria-label=\"reading the decompiled base64encode function permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reading the Decompiled Base64Encode Function</h3>\n<p>Next, I traced from the main function to the Base64Encode function and read its decompiled output.</p>\n<p>Naturally, the code looks quite different from the source and is harder to follow.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span> __cdecl <span class=\"token function\">base64_encode</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> param_1<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> param_2<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> param_3<span class=\"token punctuation\">)</span>\n\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>pcVar1<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>local_2c<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">char</span> local_28<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> local_10<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> local_c<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>local_8<span class=\"token punctuation\">;</span>\n  \n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    pcVar1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token number\">0x0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    local_2c <span class=\"token operator\">=</span> <span class=\"token string\">\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"</span><span class=\"token punctuation\">;</span>\n    local_28 <span class=\"token operator\">=</span> <span class=\"token char\">'='</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>local_c <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> local_c <span class=\"token operator\">&lt;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> local_c <span class=\"token operator\">=</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>DAT_00467f24<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>local_c <span class=\"token operator\">*</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> param_3<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        local_2c <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>PTR_s_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef_00467f28<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>local_c <span class=\"token operator\">*</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        local_28 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>DAT_00467f2c<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>local_c <span class=\"token operator\">*</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    pcVar1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token function\">thunk_FUN_0041973b</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_2 <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">3</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>pcVar1 <span class=\"token operator\">==</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token number\">0x0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      pcVar1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token number\">0x0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      local_c <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n      local_8 <span class=\"token operator\">=</span> pcVar1<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>local_10 <span class=\"token operator\">=</span> param_2<span class=\"token punctuation\">;</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;</span> local_10<span class=\"token punctuation\">;</span> local_10 <span class=\"token operator\">=</span> local_10 <span class=\"token operator\">+</span> <span class=\"token operator\">-</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>local_10 <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">*</span>local_8 <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">3U</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">0x10</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_28<span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_28<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>local_10 <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">*</span>local_8 <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">3U</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">|</span>\n                                <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xfU</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xfU</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_28<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token operator\">*</span>local_8 <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">3U</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span> <span class=\"token operator\">|</span>\n                                <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xfU</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xfU</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span> <span class=\"token operator\">|</span>\n                                <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">6</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">3U</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          local_8<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> local_2c<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">+</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        local_8 <span class=\"token operator\">=</span> local_8 <span class=\"token operator\">+</span> <span class=\"token number\">4</span><span class=\"token punctuation\">;</span>\n        local_c <span class=\"token operator\">=</span> local_c <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">*</span>local_8 <span class=\"token operator\">=</span> <span class=\"token char\">'\\0'</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> pcVar1<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>One thing that caught my attention is this section:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">pcVar1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token function\">thunk_FUN_0041973b</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>param_2 <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">3</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>pcVar1 <span class=\"token operator\">==</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token number\">0x0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\tpcVar1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token number\">0x0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The corresponding source code is:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// エンコード後の文字列格納領域の確保</span>\nlength <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>size <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// mallocの戻り値は確保したメモリブロックを指すポインタ</span>\nbase64 <span class=\"token operator\">=</span> <span class=\"token function\">malloc</span><span class=\"token punctuation\">(</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>base64 <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>First, I traced <code class=\"language-text\">thunk_FUN_0041973b</code> in Ghidra and found the following:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> <span class=\"token function\">FUN_0041973b</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">size_t</span> param_1<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token function\">__malloc_base</span><span class=\"token punctuation\">(</span>param_1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>From this, <code class=\"language-text\">thunk_FUN_0041973b</code> turned out to be the <code class=\"language-text\">malloc</code> function.</p>\n<p>Reference: <a href=\"https://strontic.github.io/xcyclopedia/library/ucrtbase.dll-34A153A39639A1DB64761AEDACDFA4AE.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ucrtbase.dll | Microsoft C Runtime Library | STRONTIC</a></p>\n<p>Therefore, <code class=\"language-text\">(uint)(param_2 &lt;&lt; 2) / 3 + 3</code> passed as the argument to <code class=\"language-text\">malloc</code> corresponds to the following line in the source code:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// エンコード後の文字列格納領域の確保</span>\nlength <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>size <span class=\"token operator\">*</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Interesting observations: the value that was originally stored in the variable <code class=\"language-text\">length</code> is passed directly to <code class=\"language-text\">malloc</code> in the decompiled output, and the <code class=\"language-text\">size * 4</code> multiplication has been replaced with a shift operation.</p>\n<p>When doing reverse engineering, it helps to understand these kinds of compiler transformations.</p>\n<h3 id=\"reading-the-decompiled-base64decode-function\" style=\"position:relative;\"><a href=\"#reading-the-decompiled-base64decode-function\" aria-label=\"reading the decompiled base64decode function permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reading the Decompiled Base64Decode Function</h3>\n<p>Next, let’s look at the decompiled output of the Decode function.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> __cdecl <span class=\"token function\">base64_decode</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>param_1<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> <span class=\"token operator\">*</span>param_2<span class=\"token punctuation\">,</span><span class=\"token keyword\">int</span> param_3<span class=\"token punctuation\">)</span>\n\n<span class=\"token punctuation\">{</span>\n  byte bVar1<span class=\"token punctuation\">;</span>\n  <span class=\"token class-name\">size_t</span> sVar2<span class=\"token punctuation\">;</span>\n  byte <span class=\"token operator\">*</span>pbVar3<span class=\"token punctuation\">;</span>\n  byte <span class=\"token operator\">*</span>in_EDX<span class=\"token punctuation\">;</span>\n  undefined8 uVar4<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>in_stack_ffffff50<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">char</span> local_ac<span class=\"token punctuation\">;</span>\n  uint local_98<span class=\"token punctuation\">;</span>\n  byte <span class=\"token operator\">*</span>local_94<span class=\"token punctuation\">;</span>\n  uint local_90<span class=\"token punctuation\">;</span>\n  byte local_88 <span class=\"token punctuation\">[</span><span class=\"token number\">128</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  uint local_8<span class=\"token punctuation\">;</span>\n  \n  local_8 <span class=\"token operator\">=</span> DAT_00474224 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">;</span>\n  local_94 <span class=\"token operator\">=</span> in_EDX<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>param_1 <span class=\"token operator\">!=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token number\">0x0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    in_stack_ffffff50 <span class=\"token operator\">=</span> <span class=\"token string\">\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"</span><span class=\"token punctuation\">;</span>\n    local_ac <span class=\"token operator\">=</span> <span class=\"token char\">'='</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>local_90 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_90 <span class=\"token operator\">&lt;</span> <span class=\"token number\">3</span><span class=\"token punctuation\">;</span> local_90 <span class=\"token operator\">=</span> local_90 <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>DAT_00467f24<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>local_90 <span class=\"token operator\">*</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> param_3<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        in_stack_ffffff50 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>PTR_s_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef_00467f28<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>local_90 <span class=\"token operator\">*</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        local_ac <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>DAT_00467f2c<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>local_90 <span class=\"token operator\">*</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    sVar2 <span class=\"token operator\">=</span> <span class=\"token function\">_strlen</span><span class=\"token punctuation\">(</span>param_1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    uVar4 <span class=\"token operator\">=</span> <span class=\"token function\">thunk_FUN_0041973b</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>sVar2 <span class=\"token operator\">*</span> <span class=\"token number\">3</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    local_94 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>ulonglong<span class=\"token punctuation\">)</span>uVar4 <span class=\"token operator\">>></span> <span class=\"token number\">0x20</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    pbVar3 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>uVar4<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>pbVar3 <span class=\"token operator\">!=</span> <span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token number\">0x0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">_memset</span><span class=\"token punctuation\">(</span>local_88<span class=\"token punctuation\">,</span><span class=\"token number\">0x80</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x80</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span>local_90 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_90 <span class=\"token operator\">&lt;</span> <span class=\"token number\">0x40</span><span class=\"token punctuation\">;</span> local_90 <span class=\"token operator\">=</span> local_90 <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        local_88<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>in_stack_ffffff50<span class=\"token punctuation\">[</span>local_90<span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x7f</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte<span class=\"token punctuation\">)</span>local_90<span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      local_90 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n      local_98 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n      local_94 <span class=\"token operator\">=</span> pbVar3<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_90 <span class=\"token operator\">&lt;</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>sVar2 <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>param_1<span class=\"token punctuation\">[</span>local_90<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> local_ac<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        bVar1 <span class=\"token operator\">=</span> local_88<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>param_1<span class=\"token punctuation\">[</span>local_90<span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x7f</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>bVar1 <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x80U</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>local_98 <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>bVar1 <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3fU</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n          <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>local_98 <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>bVar1 <span class=\"token operator\">>></span> <span class=\"token number\">4</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">3U</span><span class=\"token punctuation\">;</span>\n            local_94 <span class=\"token operator\">=</span> local_94 <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>bVar1 <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xfU</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n          <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>local_98 <span class=\"token operator\">==</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>bVar1 <span class=\"token operator\">>></span> <span class=\"token number\">2</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xfU</span><span class=\"token punctuation\">;</span>\n            local_94 <span class=\"token operator\">=</span> local_94 <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n            <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>bVar1 <span class=\"token operator\">&amp;</span> <span class=\"token number\">3U</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n          <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">=</span> <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">|</span> bVar1 <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x3f</span><span class=\"token punctuation\">;</span>\n            local_94 <span class=\"token operator\">=</span> local_94 <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n        local_90 <span class=\"token operator\">=</span> local_90 <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n        local_98 <span class=\"token operator\">=</span> local_90 <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x80000003</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_98 <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          local_98 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>local_98 <span class=\"token operator\">-</span> <span class=\"token number\">1</span> <span class=\"token operator\">|</span> <span class=\"token number\">0xfffffffc</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token operator\">*</span>local_94 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n      <span class=\"token operator\">*</span>param_2 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>local_94 <span class=\"token operator\">-</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>pbVar3<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">thunk_FUN_00407ca8</span><span class=\"token punctuation\">(</span>local_8 <span class=\"token operator\">^</span> <span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>stack0xfffffffc<span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>local_94<span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span>in_stack_ffffff50<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Nothing particularly notable, but there is one section of the decompiled output that I could not fully understand:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">sVar2 <span class=\"token operator\">=</span> <span class=\"token function\">_strlen</span><span class=\"token punctuation\">(</span>param_1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nuVar4 <span class=\"token operator\">=</span> <span class=\"token function\">thunk_FUN_0041973b</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>sVar2 <span class=\"token operator\">*</span> <span class=\"token number\">3</span> <span class=\"token operator\">>></span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nlocal_94 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>ulonglong<span class=\"token punctuation\">)</span>uVar4 <span class=\"token operator\">>></span> <span class=\"token number\">0x20</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\npbVar3 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>uVar4<span class=\"token punctuation\">;</span></code></pre></div>\n<p>This corresponds to the following source code:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// デコードするBase64文字列用のメモリ領域の確保</span>\nlength <span class=\"token operator\">=</span> <span class=\"token function\">strlen</span><span class=\"token punctuation\">(</span>base64<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ndata <span class=\"token operator\">=</span> <span class=\"token function\">malloc</span><span class=\"token punctuation\">(</span>length <span class=\"token operator\">*</span> <span class=\"token number\">3</span> <span class=\"token operator\">/</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Since <code class=\"language-text\">thunk_FUN_0041973b</code> is <code class=\"language-text\">malloc</code>, <code class=\"language-text\">uVar4</code> from <code class=\"language-text\">uVar4 = thunk_FUN_0041973b((sVar2 * 3 >> 2) + 3);</code> corresponds to <code class=\"language-text\">data</code> in the source code.</p>\n<p><code class=\"language-text\">malloc</code> stores the starting address of the allocated memory block in the return value, so <code class=\"language-text\">uVar4</code> holds an address.</p>\n<p>Right-shifting it by <code class=\"language-text\">0x20</code> shifts the address by 32 bits.</p>\n<p>I couldn’t figure out from the decompiled output why this shift is happening, so I planned to investigate further with WinDbg.</p>\n<h2 id=\"analyzing-the-ttd-trace\" style=\"position:relative;\"><a href=\"#analyzing-the-ttd-trace\" aria-label=\"analyzing the ttd trace permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Analyzing the TTD Trace</h2>\n<h3 id=\"loading-the-symbol-file\" style=\"position:relative;\"><a href=\"#loading-the-symbol-file\" aria-label=\"loading the symbol file permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Loading the Symbol File</h3>\n<p>After launching WinDbg and loading the TTD trace file, load the symbol file.</p>\n<div class=\"gatsby-highlight\" data-language=\"powershell\"><pre class=\"language-powershell\"><code class=\"language-powershell\"><span class=\"token punctuation\">.</span>sympath+ C:\\Try2WinDbg\\traces\\base64_trace\n<span class=\"token punctuation\">.</span>reload</code></pre></div>\n<p>Once the symbol file is loaded, functions can be searched by name.</p>\n<div class=\"gatsby-highlight\" data-language=\"powershell\"><pre class=\"language-powershell\"><code class=\"language-powershell\">>  x <span class=\"token operator\">/</span>D base64!base64*\n002372d0          base64!base64Encode <span class=\"token punctuation\">(</span>_base64Encode<span class=\"token punctuation\">)</span>\n002375a0          base64!base64Decode <span class=\"token punctuation\">(</span>_base64Decod</code></pre></div>\n<p>Using <code class=\"language-text\">x /D module!function-name</code>, the address of each function was found.</p>\n<h3 id=\"setting-breakpoints\" style=\"position:relative;\"><a href=\"#setting-breakpoints\" aria-label=\"setting breakpoints permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setting Breakpoints</h3>\n<p>Next, set breakpoints at the call address of each function.</p>\n<div class=\"gatsby-highlight\" data-language=\"powershell\"><pre class=\"language-powershell\"><code class=\"language-powershell\">> bu base64!base64Encode\n> bu base64!base64Decode\n> bl\n0 e Disable Clear  002372d0     0001 <span class=\"token punctuation\">(</span>0001<span class=\"token punctuation\">)</span>  0:<span class=\"token operator\">*</span><span class=\"token operator\">*</span><span class=\"token operator\">*</span><span class=\"token operator\">*</span> base64!base64Encode\n1 e Disable Clear  002375a0     0001 <span class=\"token punctuation\">(</span>0001<span class=\"token punctuation\">)</span>  0:<span class=\"token operator\">*</span><span class=\"token operator\">*</span><span class=\"token operator\">*</span><span class=\"token operator\">*</span> base64!base64Decode</code></pre></div>\n<p>Running the <code class=\"language-text\">g</code> command now will stop execution at the call site of the first <code class=\"language-text\">base64Encode</code> function.</p>\n<h3 id=\"aligning-the-image-base-between-windbg-and-ghidra\" style=\"position:relative;\"><a href=\"#aligning-the-image-base-between-windbg-and-ghidra\" aria-label=\"aligning the image base between windbg and ghidra permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Aligning the Image Base Between WinDbg and Ghidra</h3>\n<p>From the <code class=\"language-text\">lm</code> output, you can see that the Base64 program is loaded at <code class=\"language-text\">0x230000</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"powershell\"><pre class=\"language-powershell\"><code class=\"language-powershell\">> lm\n<span class=\"token function\">start</span>    <span class=\"token keyword\">end</span>        module name\n00230000 002ac000   base64_exe C <span class=\"token punctuation\">(</span>private pdb symbols<span class=\"token punctuation\">)</span>  C:\\ProgramData\\Dbg\\sym\\base64<span class=\"token punctuation\">.</span>pdb\\E82F6C1FD64A46D7AD5845CF4BD1BF431\\base64<span class=\"token punctuation\">.</span>pdb</code></pre></div>\n<p>To make it easier to cross-reference Ghidra’s decompiled output with WinDbg’s analysis, change Ghidra’s image base setting to <code class=\"language-text\">0x230000</code>.</p>\n<p>Ghidra’s base address can be changed during file import via [Options], or afterward by opening [Window] > [Memory Map] and clicking the [Set Image Base] button on the right.</p>\n<h3 id=\"setting-a-breakpoint-at-the-target-location\" style=\"position:relative;\"><a href=\"#setting-a-breakpoint-at-the-target-location\" aria-label=\"setting a breakpoint at the target location permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Setting a Breakpoint at the Target Location</h3>\n<p>Now that Ghidra’s addresses are aligned with WinDbg’s, setting breakpoints becomes straightforward.</p>\n<p>Let’s set a breakpoint at <code class=\"language-text\">local_94 = (byte *)((ulonglong)uVar4 >> 0x20);</code>, the line from the decompiled output whose behavior I could not determine.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/fd40540a66045f4e6161c4fcfc79b44c/0b533/image-68.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 42.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAARlAAAEZQAGA43XUAAAB50lEQVQozz2R627aQBCF/f4P0r5A+7OXpFWbtCiBcAsBG0oMiTEYr71re722vw7QZqSjkXZHM+fiXX/7zs+bWwaDKU/zFcFyzWb7QhhuWK0CwTNBsKQ/nPHu/YAPH4dcXc24u39m9vTCOowJd1vCbcRs7uMhZYwm3hXUNRRFjbW1vFm6roMTpEJ/ispyXGOwTcGlTv8N/6tpOjzXtJeFcYlSyDIni2uyTGGrEltYXG3ZLIYckwNaHUlUSmoMutSUtcy5Etc6tMx7JxY6z9hFGq0vDGtboY3CuZrWNbRyNFzNSdNMZvccs5hjfiQt9iSnrhOyKiXROV7lRM5rgr/OOOQQJRVxKoziir0wVmWHESvW0x5GGzlYkOYHlJA4iLJEZKlcUzhHXtqT5I4sN7xEJUkqDOVCUdYcZbAoS0xuqawlfOyR5ylOPCsrqIVIe3GR7p+HVqzyGpHzJlkY2kpCqaz4pc69qRvJpWEzH6L2a5T/iU1/yesoQAUBZh1Q7KLzwlqunFOuJNVUOWS3pHiB1hVt+xYgf7YhmTKkr+JZFBJHG3QSUUlIVithbDGiyPv85SvXP37x++6B216fXn/I3WDEaDw+YzyeMJk+ct8f8DCZMZkvGM4W0n2m/kLgs1gt8ZdLxqN7/gLkZKhOy9W53QAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/fd40540a66045f4e6161c4fcfc79b44c/8ac56/image-68.webp 240w,\n/static/fd40540a66045f4e6161c4fcfc79b44c/d3be9/image-68.webp 480w,\n/static/fd40540a66045f4e6161c4fcfc79b44c/b0a15/image-68.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/fd40540a66045f4e6161c4fcfc79b44c/8ff5a/image-68.png 240w,\n/static/fd40540a66045f4e6161c4fcfc79b44c/e85cb/image-68.png 480w,\n/static/fd40540a66045f4e6161c4fcfc79b44c/0b533/image-68.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/fd40540a66045f4e6161c4fcfc79b44c/0b533/image-68.png\"\n            alt=\"image-68.png\"\n            title=\"image-68.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Set a breakpoint at <code class=\"language-text\">0x00237696</code> with the following command:</p>\n<div class=\"gatsby-highlight\" data-language=\"powershell\"><pre class=\"language-powershell\"><code class=\"language-powershell\">> bu 0x00237696</code></pre></div>\n<p>Advancing execution with the <code class=\"language-text\">g</code> command, I reached the target address.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 637px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/f94eefe8d82d62321840849257a4c708/13a9a/image-69.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 80.83333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAADDElEQVQ4y3VUy47bRhDU//9FLgkQwIfYCAwYcJBL4EOCHFa7q+VSK0rim5wnHxLflRpK2fiSARrdMxqWuqeqexMEJwTBGWlaQCkLrSuaXePvzZ0raSCFgVYutu/m9vp+ZyNKASkV8jxHluWomwZd12EcR/oBfT/i2ndo+xa60sjKFLJRkJWEshLd1OP7tQkOB7y+vuJAfw5DXC5Xggzrj1L0KGSPxU5oH1t0hx4X74L6sV59t+uAGFj2CxDRzws2/quHp+dn7Pd7RFGEZVne/02UPbJiQGdb2JOFCQ2apIE5GKhAAZogdsEiaXq5Ab4RyGOG5/MZp9MJQkjM8w1UMbs8H2ErhWN0gqkNbGMhrWD5Boax2wtdotQCA59pczwG2L+9rWCu9OPxiJLv6pbWA21CU1uE55Dn/LAokMmMT1GgqiqmiHdz1W2OwQGe5yEMzyzbhzEGdV3zxsy4h9Ij9wZJksBayzduuK+YncHl2t7R8C+iy5CZ+Y6QBKXQGIb/3lCrBUUJZlKjKBTcS8wzME13G7He7/uZqriz7O++Yvv3D9g//4zdw4/Iw18wNr/zy28Q8VcU0W8wxWf4u58gsk9Q+Sek8QfGH6HLX1HJz5CMG/0F6P9wLD/hcfsnfO+B/i8EhydEocf0a5JCvVHMtUoR7HYo4xNi38PhuIVIzuiUBMYr0F0Alr9MDXUYBCyZpJwjlkWmBqY/3cq2ZoamLKZqRr1vcYmoyYLJO+3lvJDSk7/F+Yx7yndl2fd9yuaE7cMDttst+mG4s9yT2XFl2aYWaHhIvlbNOf0ZWnP3zoaVZZehDwfseS8reFU3d1J6inuCudxa7dpdUXUVFvz/2hyowRfKJgiO7OUMhtKYHIVchpJJMwrbKMoqhFCC/aspm4ZZ16uMWva+1nqV2rysneKvgE6H3svLOiCEECw1p5g5XeSMiiAeyYiLBFoopBwQSimCNui7Hm3NPr92N2Encby2XRwn7JiArVau5KRpzljx39m7blzlHFtlRbloCHfOuJItFUCTHBiMrWnwD0r7ueWbwqv4AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/f94eefe8d82d62321840849257a4c708/8ac56/image-69.webp 240w,\n/static/f94eefe8d82d62321840849257a4c708/d3be9/image-69.webp 480w,\n/static/f94eefe8d82d62321840849257a4c708/63990/image-69.webp 637w\"\n              sizes=\"(max-width: 637px) 100vw, 637px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/f94eefe8d82d62321840849257a4c708/8ff5a/image-69.png 240w,\n/static/f94eefe8d82d62321840849257a4c708/e85cb/image-69.png 480w,\n/static/f94eefe8d82d62321840849257a4c708/13a9a/image-69.png 637w\"\n            sizes=\"(max-width: 637px) 100vw, 637px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/f94eefe8d82d62321840849257a4c708/13a9a/image-69.png\"\n            alt=\"image-69.png\"\n            title=\"image-69.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>From here, I traced the execution flow.</p>\n<h3 id=\"reading-the-assembly\" style=\"position:relative;\"><a href=\"#reading-the-assembly\" aria-label=\"reading the assembly permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reading the Assembly</h3>\n<p>I read the assembly at the breakpoint location.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token number\">00237691</span> e8 <span class=\"token number\">94</span> <span class=\"token number\">9</span>c        CALL       malloc                                           undefined <span class=\"token function\">malloc</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">size_t</span> param_1<span class=\"token punctuation\">)</span>\n        ff ff\n<span class=\"token number\">00237696</span> <span class=\"token number\">83</span> c4 <span class=\"token number\">04</span>        ADD        ESP<span class=\"token punctuation\">,</span><span class=\"token number\">0x4</span>\n<span class=\"token number\">00237699</span> <span class=\"token number\">89</span> <span class=\"token number\">85</span> <span class=\"token number\">68</span>        MOV        dword ptr <span class=\"token punctuation\">[</span>EBP <span class=\"token operator\">+</span> local_9c<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>EAX\n        ff ff ff\n<span class=\"token number\">0023769f</span> <span class=\"token number\">83</span> bd <span class=\"token number\">68</span>        CMP        dword ptr <span class=\"token punctuation\">[</span>EBP <span class=\"token operator\">+</span> local_9c<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span><span class=\"token number\">0x0</span>\n        ff ff ff <span class=\"token number\">00</span>\n<span class=\"token number\">002376</span>a6 <span class=\"token number\">75</span> <span class=\"token number\">07</span>           JNZ        LAB_002376af</code></pre></div>\n<p><code class=\"language-text\">EAX</code> contains the address returned by <code class=\"language-text\">malloc</code>.</p>\n<p>This address is stored in <code class=\"language-text\">[EBP + local_9c]</code> and compared against 0.</p>\n<p>This corresponds to the following source code:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">data <span class=\"token operator\">=</span> <span class=\"token function\">malloc</span><span class=\"token punctuation\">(</span>length <span class=\"token operator\">*</span> <span class=\"token number\">3</span> <span class=\"token operator\">/</span> <span class=\"token number\">4</span> <span class=\"token operator\">+</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data <span class=\"token operator\">==</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token constant\">NULL</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Unfortunately, I could not find the <code class=\"language-text\">local_94 = (byte *)((ulonglong)uVar4 >> 0x20);</code> operation from the Ghidra decompiled output in the actual assembly.</p>\n<p>I also inspected the memory address contents, but <code class=\"language-text\">malloc</code>’s return value was simply stored as-is.</p>\n<div class=\"gatsby-highlight\" data-language=\"powershell\"><pre class=\"language-powershell\"><code class=\"language-powershell\">> dyd <span class=\"token namespace\">[ebp-0x98]</span>\n           3          2          1          0\n          <span class=\"token operator\">--</span><span class=\"token operator\">--</span><span class=\"token operator\">--</span><span class=\"token operator\">--</span> <span class=\"token operator\">--</span><span class=\"token operator\">--</span><span class=\"token operator\">--</span><span class=\"token operator\">--</span> <span class=\"token operator\">--</span><span class=\"token operator\">--</span><span class=\"token operator\">--</span><span class=\"token operator\">--</span> <span class=\"token operator\">--</span><span class=\"token operator\">--</span><span class=\"token operator\">--</span><span class=\"token operator\">--</span>\n0059f800  00000000 11100000 00010110 01101000  00e01668</code></pre></div>\n<p>It’s probably a quirk of Ghidra’s decompiler, but I’m still puzzled about what led it to generate that shift operation.</p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>I had originally planned to trace through the Base64 processing in the debugger step by step, but since there weren’t many interesting findings, I skipped that part.</p>\n<p>Next I want to implement and debug something like RC4 or ROT13 encryption.</p>","fields":{"slug":"/windows-windbg-009-base64-en","tagSlugs":["/tag/win-dbg-en/","/tag/kernel-en/","/tag/reversing-en/","/tag/c-c-en/","/tag/english/"]},"frontmatter":{"date":"2021-12-30","description":"","tags":["WinDbg (en)","Kernel (en)","Reversing (en)","C/C++ (en)","English"],"title":"Analyzing a Base64 Program Implemented in C with WinDbg Time Travel Debugging","socialImage":{"publicURL":"/static/47f40429328e471f653727539dc8c88e/windows-windbg-009-base64.png"}}}},"pageContext":{"slug":"/windows-windbg-009-base64-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}