Boostrap code (Was: Re: Hacker FAQ)
Article: 7706 of alt.hackers From: Terje.Mathisen@hda.hydro.com (Terje Mathisen) Newsgroups: alt.hackers Subject: Boostrap code (Was: Re: Hacker FAQ) Date: 23 Apr 1995 13:45:23 GMT Organization: Hydro Data, Norsk Hydro (Norway) Lines: 112 Approved: Yes. Message-ID: 3ndllj$p9s@vkhdsu01.hda.hydro.com Reply-To: Terje.Mathisen@hda.hydro.com (Terje Mathisen) NNTP-Posting-Host: sk08ts.hda.hydro.com X-Newsreader: IBM NewsReader/2 v1.02 Status: RO
In <grobsonD7EqnE.95q@netcom.com>, grobson@netcom.com (Gary D. Robson) writes: >ObHackFromThePast: > >When I first started working in the minicomputer world, we were using >7-track tapes. I was doing an operating system for a 16-bit machine. >The way the system worked was that you'd mount the tape, press the >"reset" switch on the console, and it would read the first sector of the >boot device (in this case, the tape drive). > >This meant that I had to create a driver for the 7-track reel-to-reel >tape drive that fit in a single sector, and that driver needed to load >the bootstrap program from the following sector(s) of the tape. The >problem was, I could only use opcodes containing zeros in bits 0, 1, 8, >and 9. It turned out to be possible to make a little routine just a few >instructions long that "decoded" the rest of the sector and then turned >over control to it. That sounds very similar (in principle) to something I wrote a few weeks ago, based on an idea in an article by Jim Lawless (W/DDJ april issue?). The idea is to use a 7-bit ascii mail system to send binary files to somebody who don't have uudecode or similar programs available, by encoding a short bootstrap program as hex codes, use debug to decode that, pass control to the bootstrap stub, and let that decode the remainder of the input. Jim had used a uuencode-like system, which uses 6 bits from each of four characters to send 3 binary bytes. Using a state machine, his decoder needed 118 bytes. I got the decoder down to 55 bytes, and switched to a modulo-85 encoding, which lets me encode 4 bytes in 5 characters. The encoder is capable of handling executable files (which debug.exe cannot save back to disk), and files larger than 64k, both by generating one or more temp files, each slightly less than 64k, and then making a final block, which encodes a batch file, dbtemp.bat (generated on the fly while encoding), that will do the neccessary: copy /b $.$0 + $.$1 + $.$2 [+...] filename.exe command to regenerate the input file. The decoder stub is using quite a few (semi-)dirty tricks to reduce the size, the best is probably that I load the stub in the last 55 bytes in the segment, put the stack pointer below that, and then use the stack as my output buffer, saving each newly-decoded 32-bit word (in BP:AX) with two simple PUSH operations (using one byte each!). To exit the stub program (on finding an empty input line), I use INT 3 instead of INT 20, since INT 3 is a single-byte opcode (0CCh). This will always work since I'm running under debug! -Terje Mathisen (include std disclaimer) <Terje.Mathisen@hda.hydro.com> "almost all programming can be viewed as an exercise in caching" Below, I've included the source for the encoder (dbencode.c), and the stub decoder (asm), in a dbencode'd text file. Extract the remainder, save it as a temp file and redirect that file into debug to generate dbencode.zip! eFFC9 33 C0 33 ED B3 5 46 95 F7 E7 95 F7 E7 B9 DF 0 2 C eFFDB 3 C1 13 EA FE CB 75 EC 55 50 80 EF 5 77 DF B4 A BE eFFED 5C 0 8B D6 88 14 46 CD 21 8A 3C BF 55 0 84 FF 75 CA CC rsp 920 g=ffea *g6R(!!!7i!!!">!!3-%!!!!!"pIXr9iF>1779p=779I1!!!0f!!!!A!!*'"!!!!!!"8i- "bQdT!\@"V%FuSaC=<.g!!!!5!#,J892Iu.779p=:.7K;!!!!!!!!"l!!*'"!!!!!!"&]+ %(ZE="W0jHCq1UNCaK,f!!!!5!#,J892G]h+9.pf4/`;#=L>;R>#:I*bgUeN-Bu6,AGA5) ?lhq,=F',`4%*6GpWegTa/hEg=@^5mqG!8;Bf8OQF+Rh?IVdr0R"\8(-lf^jB^h)L3!Q@e -G1)FU3j>G]:M\f"[$ZU;WjV9pL@)tH8G,C'aZ"rEo*9U.LhkX=i-=QIC`;.Z(q2$\='Um <Pc9Z^ro9,ZuX6hf3/j,V1?a3S`'iM7ef%X@!Ln*XLt_SBC2k/&,M:p7]\b5"LNH]_dp(i I_a,/k3etp<KMcV2(LTV<2gP]T>O(_YN4sD']n1lJ1VL^rVcBS-EOZNFMIcOJ+@qcX,.`h TjYa;U2]+N$<B:#:0&^T%OQJ"af!s-;Z<Bt&/V)([]gi'@#nBqh;<-nW$XmSbGbXflqn*\ V@^/s@3oLdl=4*0`n%_XHR;ZIrN'['7;\VfDQV_HcOb@/HY!sV&aMbUjYGo*PK>*$PM2PD fo//];pNlLP#^Wrh>PM'<T$m%<K>JQ.^9+Y%6[HBkO)!Ei)kt>Zk]2f1JK9=Hu2F$"5MI) 5T6rBM_jKhp4ooNn_e1B'<fou$B>s%GkqjEZf^F;\+HkSZ7ga*[in<'K2`9u<C;l50F:Ic C;?9n87&*:7!hFO/(bc$H<),?]:NV@DoQ^r(GN:fB_fU>q.-C>NlPGZPK.6X+?5H1YmCTP W0Jr#0%(Q!]&&g(l;tY10[l(W<..J>5qYSo:I@Q=6::eR!"8i-"bQdT!\@"V%FuSaC=<.g !!!!5"9V:n&,a1o+!VCNc`oa%dfd?H4%PM1l*d#Moa@BY7/,5rX^V+e.S0&]HCdSU&Jk4& D.:(kgH*L&=#&IQ'G](SGDu1[6$J-p90B?lAQ]-+c0*hM\.97AJN=ir)<![2kH<++ftj7E i1iLZ;"8Hf]]F7F1KHQopEG>@rRL/ZDkd\e19G-?D8'=?*=jZsVi0dq[Tq8(?>1+O-ILA4 1tq3PgHa*pFQ@UOfbro_(sNcLYJo[C=X1nnMAkG5-d<MLrQM7EhNN)Y9+BLRd%s[iXf%") @(R1!U4KRg*$;%,13kPFm(PP9ent_''fNXEj<U!\5<%15$XX_b+JJV`8O+Z;+#AjQBPgpe hX?O&_D6Kf;CHOm[ho$ILic\0qIQDp-)FUi+g'OdbJR+B1j)3N$;j<TpE@9.%1Nj2)44T] &ttfUei?p+q1lth.cb5(<HZ0uNls<CWKr#4C%hS!0`P2`f%"EO,^+\Ps3^-4;D\ig:il4L WCGhs^(^kSqe@?9oW0s.>V-YW2,hBNn:,i",QkZ%9#<V?15]OPTd5k;c!*-ZP#@Rh'4="T AY)>h.!!N"Fi4qLDmUM-KZY8P\B6XnG4dYrn8>e[K]n=*k/Xa"=R-'!@%TOs\=]ak_#?n3 9Wjd&Rl*q5f6Sjn"&?kocM9i7gZpg,,b!5[-h/H%8bcd3@9WE$g;@5IHI7e=e1c_q;->I; ntf*6GgZ(R9#J^%T@#'bX)W^6$b6u,WW8RFp@3=j-X9XB9PHeE6jqpFkkfX:rFcn[1L#W: ]W'r!]@ktaANqpkKUbI?a^oK^C*[[/a`I(L"2_:pVJa-uc^-Jq22(%fRsLQo=fU#slcY`j GFB@g7-p_^gFRne8kaG)WS"IDMe,K5">na#npK,GIm^HYi^`PDO[N.GY:Xh@#PhppkMoin pUSim76-0`HKQK1.]5<6=ZinCd%*2mpU/dm4XMP'Kq@FkLX9h<<2AMul\4'<`Z8H;mqWEs PAmu^RrrB[*@4E/1P*E5`/qSm=Vg*Ic7V;.,UM\-$"^0#ql%Zr*]+l=5&^coRiO=9;fkn^ 8kp6aajd-:@++0Rc[?q:&K&#'8?=tPI>h+"?U97W8[IC(k!-qmO]!/Kac66B^&LHe*,7fD \Q^js%1$_\@g_mS]qd`N)cq=)_O`2XZo:g:mCmm9<e-!I7TVDk(B7sjB'#nY])U8+iN&^" T$"&Qi*j(k)k`%h>AT>QZG+>Q,sb!<!?^5lhHjI1;Kk^MTLQ.2U"LcZ-30caXl1gD&F4P- F=[:M6Qn(j,hk;7,uC`o1[1JH@P<+*7Z$K/%I*hq=KqFS*7ug0VfWl1)bu-0`9_iX!sU() Jme;o:[S^EDS4)DE:fM:("MTj0:3Rn)sI1k;s$9EJoo$f@,)0[7aNmlCr4W$.HPZfcnH6Z CQfPa^G)fAIFf,#8'uFGB?pM]VCp[CoYl_#6X6YG.2j<7q"=9,G.$F4rk%A[$Q\bbjo^uT HPgh]mG[a9hnK5;kD1e6aEQi=(qb"-4rsV8/\Uhn@6JGf?6j>5KEus&n`!0qa$UF[D!RNI 8&rX;\)Wdn'6k/.h)!(Zm-MsQB5='l5m0IqD_03-rfV"uO"?D[-;rnq&X&l=BbUYD"BF"R ,*#k[VFGDH.iFqNTRXapr=DHQDeW736S:eq:I@lG6::eR!"&]+%(ZE="W0jHCq1UNCaK,f J,fQ`"9V:n rcx 81e ndbencode.zip w q