{"id":601,"date":"2020-12-18T20:24:12","date_gmt":"2020-12-18T19:24:12","guid":{"rendered":"http:\/\/kronotai.com\/wordpress\/?page_id=601"},"modified":"2022-09-12T23:10:28","modified_gmt":"2022-09-12T21:10:28","slug":"example","status":"publish","type":"page","link":"https:\/\/kronotai.com\/wordpress\/example\/","title":{"rendered":"Example"},"content":{"rendered":"<p><!--[CDATA[\n<\/p--><\/p>\n\n\n<p>As an example I&#8217;m using the <a href=\"http:\/\/kronotai.com\/wordpress\/example-old\/hd\/\">hexdump executable<\/a> from the <a rel=\"noreferrer noopener\" href=\"http:\/\/www.backerstreet.com\/rec\/old_rec\/recdload.htm\" target=\"_blank\">REC<\/a> homepage. The program named hexdump reads the files from the command line and outputs the content in hex and ascii. A sample output looks like<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">00000000: 7F 45 4C 46 01 01 01 00 00 00 00 00 00 00 00 00.ELF............|<br>00000010: 02 00 03 00 01 00 00 00 A0 85 04 08 34 00 00 00............4...|<br>00000020: 40 23 00 00 00 00 00 00 34 00 20 00 05 00 28 00@#......4. ...(.|<br>00000030: 19 00 16 00 06 00 00 00 34 00 00 00 34 80 04 08........4...4...|<br>00000040: 34 80 04 08 A0 00 00 00 A0 00 00 00 05 00 00 004...............|<br>00000050: 04 00 00 00 03 00 00 00 D4 00 00 00 D4 80 04 08................|<br>...<\/pre>\n\n\n\n<p>The original source code is the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;sys\/stat.h&gt;\n\nvoid   dumpline(unsigned char *p, unsigned long offset, int cnt)\n{\n   char   buff[80];\n   int    c;\n   int    len;\n\n   sprintf(buff, \"%08lX:\", offset);\n   if(cnt &gt; 16)\n       cnt = 16;\n   for(c = 0; c &lt; cnt; ++c)\n       sprintf(buff + c * 3 + 9, \" %02lX\", p[c]);\n   while(c++ &lt; 16)\n       strcat(buff, \"   \");\n   len = strlen(buff);\n   strcpy(buff + len, \"  |\");\n   for(c = 0; c &lt; cnt; ++c)\n       buff[len + c] = (p[c] &gt;= ' ' &amp;&amp; p[c] &lt;= 0x7e) ? p[c] : '.';\n   while(c &lt; 16)\n       buff[len + c++] = ' ';\n   strcpy(buff + len + c, \"|\");\n   printf(\"%s\\n\", buff);\n}\n\nint    hexdump(char *fname)\n{\n   unsigned char  buff[16];\n   unsigned long  offset;\n   FILE      *fp;\n   struct stat    st;\n   int       cnt;\n\n   if(!stat(fname, &amp;st)) {\n       perror(fname);\n       return(1);\n   }\n   if(!(fp = fopen(fname, \"rb\"))) {\n       perror(fname);\n       return(1);\n   }\n   offset = 0;\n   while(offset &lt; st.st_size) {\n       cnt = fread(buff, 1, sizeof(buff), fp);\n       if(!cnt)\n      break;\n       dumpline(buff, offset, cnt);\n       offset += cnt;\n   }\n   fclose(fp);\n   return(0);\n   \n}\n\nint    main(int argc, char *argv[])\n{\n   int    i;\n   int    errs;\n\n   errs = 0;\n   for(i = 1; i &lt; argc; ++i)\n       errs += hexdump(argv[i]);\n   return(errs);\n}\n<\/code><\/pre>\n\n\n\n<p>As you can see three user functions and some library calls.&nbsp;<\/p>\n\n\n\n<p>Using the current version of holdec the decompiled output looks like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">\/\/ address: 08048660.0\n\/\/ full-signature: func(dumpline, return=[], parameter=[&lt;ptr(int(unsigned, 1)),p,unknown>, &lt;int(unsigned, 4),offset,unknown>, &lt;int(undef, 4),cnt,unknown>], varargs=false)\nvoid dumpline(u1* p, u4 offset, d4 cnt)\n{\n  (void) sprintf(&amp;buffer, \"%08lX:\", offset);\n  if(cnt > 16) {\n    (void) STORE(&amp;cnt, 16);\n  }\n  reg_var1 = 0;\n  while(reg_var1 &lt; cnt) {\n    (void) sprintf(&amp;buffer + reg_var1 * 3 + 9, \" %02lX\", UNSIGNED_EXTEND(LOAD(p + reg_var1)));\n    reg_var1++;\n  }\n  while(1) {\n    reg_var1++;\n    if(reg_var1 + -1 > 15) {\n      break;\n    }\n    (void) strcat(&amp;buffer, \"   \");\n  }\n  reg_f = strlen(&amp;buffer);\n  (void) strcpy(&amp;buffer + reg_f, \"  |\");\n  reg_var2 = 0;\n  while(reg_var2 &lt; cnt) {\n    reg_l = LOAD(p + reg_f + reg_var2) &lt; 32 || LOAD(p + reg_f + reg_var2) > 126 ? 46 : LOAD(p + reg_f + reg_var2);\n    (void) STORE(&amp;buffer + reg_f + reg_var2, reg_l);\n    reg_var2 += reg_f + 1;\n  }\n  for(...) {\n    \/\/ state = PASSIVE_USED_IN_MULTIPLE_JUMPS\n    while(reg_var2 &lt; 16) {\n      (void) STORE(&amp;buffer + reg_f + reg_var2, 32);\n      reg_var2++;\n    }\n  }\n  (void) strcpy(&amp;buffer + reg_f + reg_var2, \"|\");\n  (void) printf(\"%s\\n\", &amp;buffer);\n}\n\n\/\/ address: 080487f0.0\n\/\/ full-signature: func(hexdump, return=[&lt;int(undef, 4),null,unknown>], parameter=[&lt;ptr(int(undef, 1)),fname,unknown>], varargs=false)\nd4 hexdump(d1* fname)\n{\n  reg_a = stat(fname, &amp;stat_buffer);\n  if(reg_a == 0) {\n    (void) perror(fname);\n    reg_result = 1;\n  } else {\n    reg_c = fopen(fname, \"rb\");\n    if(reg_c == 0) {\n      (void) perror(fname);\n      reg_result = 1;\n    } else {\n      reg_var1 = 0;\n      while(reg_var1 &lt; LOAD(&amp;stat_buffer + 20)) {\n        reg_g = fread(&amp;read_buffer, 1, 16, reg_c);\n        if(reg_g == 0) {\n          break;\n        }\n        (void) dumpline(&amp;read_buffer, reg_var1, reg_g);\n        reg_var1 += reg_g;\n      }\n      (void) fclose(reg_c);\n      reg_result = 0;\n    }\n  }\n  return reg_result;\n}\n\n\/\/ address: 080488e0.0\n\/\/ full-signature: func(main, return=[&lt;int(undef, 4),null,unknown>], parameter=[&lt;int(undef, 4),argc,unknown>, &lt;ptr(ptr(int(undef, 1))),argv,unknown>], varargs=false)\nd4 main(d4 argc, d1** argv)\n{\n  reg_result = 0;\n  reg_var1 = 1;\n  while(reg_var1 &lt; argc) {\n    reg_e = hexdump(LOAD(argv + reg_var1 * 4));\n    reg_result += reg_e;\n    reg_var1++;\n  }\n  return reg_result;\n}\n<\/code><\/pre>\n\n\n\n<p>This is still work in progress since obviously some aspects are still open:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>The type system is not running again. With it in place the LOAD and STORE would be replaced by pointer or&nbsp;<code>struct<\/code>&nbsp;accesses. The function signatures also depend on the type system.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\t\t\t\t<![CDATA[]]>\t\t <a href=\"https:\/\/kronotai.com\/wordpress\/example\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-601","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/kronotai.com\/wordpress\/wp-json\/wp\/v2\/pages\/601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kronotai.com\/wordpress\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kronotai.com\/wordpress\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kronotai.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/kronotai.com\/wordpress\/wp-json\/wp\/v2\/comments?post=601"}],"version-history":[{"count":12,"href":"https:\/\/kronotai.com\/wordpress\/wp-json\/wp\/v2\/pages\/601\/revisions"}],"predecessor-version":[{"id":701,"href":"https:\/\/kronotai.com\/wordpress\/wp-json\/wp\/v2\/pages\/601\/revisions\/701"}],"wp:attachment":[{"href":"https:\/\/kronotai.com\/wordpress\/wp-json\/wp\/v2\/media?parent=601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}