検索 - みる会図書館

全データから 44844件ヒットしました。

月刊 C MAGAZINE 1990年11月号


ROM 化 プ ロ グ ラ ミ ン グ 考 察 て い る だ け て 、 す 。 実 際 は 以 下 の よ う な こ と を 行 い ま す 。 こ の と き List 8 の ス タ ー ト ア ッ プ ル ー チ ン ・ ス ー バ ー バ イ ザ ス タ ッ ク ポ イ ン タ と プ ロ を ほ か の フ ァ イ ル よ り も 先 に リ ン ク し て TEXT C M 8K の C コ ン ヾ イ ラ グ ラ ム カ ウ ン タ の 初 期 値 セ グ メ ン ト を ROM の 先 頭 に 割 り 付 け る 必 要 の ス タ ー ト ア ッ プ レ ー チ ン ス ー パ ー バ イ ザ ス タ ッ ク ポ イ ン タ と プ ロ が あ り ま す 。 グ ラ ム カ ウ ン タ の 初 期 値 は リ セ ッ ト 時 に 0 ~ 7 ・ 例 外 べ ク タ テ ー プ ル の 設 定 簡 単 な ス タ ー ト ア ッ フ 。 ル ー チ ン 例 を List 8 番 地 ( 通 常 は シ ャ ド ウ ROM ) か ら 読 み 込 ま れ バ ス エ ラ ー , ア ド レ ス エ ラ ー な ど の 例 外 や に 示 し ま す 。 こ の 例 は 非 常 に 手 抜 き て 、 す が , ま す か ら ① の よ う に 設 定 し ま す (Fig. 6 ) 。 ー ド ウ ェ ア 割 り 込 み の た め の べ ク タ テ ー List1-C cl /c /Fa /AL /Gs test 1. c の よ う に コ ン バ イ ル し , TurboC 2.0 で あ れ ば 一 s を つ け て tcc -c -S -ml test2. c の よ う に コ ン ノ ヾ イ ル し ま す 。 (List 1-A,List I-B, List I-C, List I-D) れ : PUBLIC ffardat 42 : PUB し IC -fhugedat 43 : PUBLIC -fpubcon 44 : PUBLIC ~ -ffarcon 45 : PUBLIC fhugecon 463 EXTRN acrtused: ABS 47 : _BSS SEGMENT 48 : COMM NEAR -fpub: 49 : COMM FAR -ffarpub: 50 : COMM NEAR -fhugepub : BSS ENDS SEGMENT 52 : _DATA 53 : ufpubdat DW 54 : _DATA ENDS 55 : TEST15_DATA SEGMENT 56 : ORG $ + 2 ffardat DW 58 : TEST15_DATA ENDS SEGMENT 59 : TEST17-DATA 60 : DW 00H -fhugedat 65534 DUP(O) DB 62 : 63 : TEST17_DATA ENDS 64 : SEGMENT _DATA 65 : $S107_fstatdat DW 66 : _DATA ENDS 67 : TEST15_DATÅ SEGMENT 68 : $S109_ffarstatdat 69 : TEST15_DATA ENDS 70 : TEST18_DATA SEGMENT 71 : $S111_fhugestatdat DW 72 : 65534 DUP( の DB 73 : 74 : TEST18_DATA ENDS _DATA SEGMENT fpubcon DW _DATA 77 : ENDS 78 : TEST15_DATA SEGMENT 79 : ffarcon DW 80 : TEST15_DATA ENDS 81 : TEST19_DATA SEGMENT 82 : fhugecon 00H DW 65534 DUP(O) 83 : DB 84 : 85 : TEST19_DATA ENDS 86 : CONST SEGMENT 87 : $S115_fstatcon DW 0aH 88 : CONST ENDS 89 : TESTIIO_CONST SEGMENT 90 : $S116_ffarstatcon DW 91 : TESTIIO_CONST ENDS 92 : TESTIII_DATA SEGMENT 93 : $S117_fhugestatcon DW 65534 DUP ( の DB BYT E : BYTE: BYTE: 2 2 65536 List 1 ー A の ア セ ン プ リ リ ス ト i st 0a 日 Static Name AIiases 2 : 3 : $S106_fstat $S107_fstatdat $S108_ffarstat 5 : 6 : $S109„ffarstatdat 7 : $S110-fhugestat 8 : $S111_fhugestatdat 9 : $S115_fstatcon 10 : $S116_ffarstatcon $S117_fhugestatcon TITLE testl. 0 NAME testl 14 : . 8087 16 : TESTI_TEXT SEGMENT WORD PUBLIC ・ CODE' 17 : TBSTI_TEXT ENDS DATA SEGMENT WORD PUBLIC "DATA' _DATA ENDS 20 : CONST SEGMENT WORD PUBLIC 'CONST' 21 : CONST ENDS 22 : _BSS SEGMENT WORD PUBLIC 'BSS' BSS 23 : ENDS 24 : TEST15_DATA SEGMENT PARA PUBLIC 'FAR_DATA' 25 : TBST15_DATÅ ENDS SEGMENT PARA PUBLIC 'FAR_DATA' 26 : TEST16_DATA 27 : TEST16_DATA ENDS SEGMENT PARA PUBLIC 'FAR_DATA' 28 : TEST17_DATA 29 : TEST17_DATA ENDS 30 : TEST18_DATA SEGMENT PARA PUBLIC 'FAR_DATA' 31 : TEST18_DATA ENDS 32 : TEST19_DATA SEGMENT PARA PUBLIC 'FAR_DATA' 33 : TEST19_DATA ENDS 34 : TESTIIO_CONST SEGMENT PARA PUBLIC 'FAR_DATA' 35 : TESTIIO_CONST ENDS 36 : TESTIII_DATA SEGMENT PARA PUBLIC 'FAR_DATA' 37 : TESTIII_DATA ENDS 38 : DGROUP GROUP CONST, _BSS, _DATA 39 : ASSUME CS: TESTI_TEXT, DS: DGROUP, SS: DGROUP 40 : PUBL'IC -fpubdat 0aH EQU EQU EQU EQU EQU EQU EQU EQ U EQU fstat fstatdat ffarstat ffarstatdat fhugestat 、 fhugestatdat fstatcon ffarstatcon fhugestatcon 0aH 0aH DW 00H 0aH 0aH 0aH 00H 特 集 ROM 化 プ ロ グ ラ ミ ン グ 考 察 45

月刊 C MAGAZINE 1992年6月号


新 MS ー DOS プ ロ ク ラ ミ ン ク 入 門 ・ 第 こ C プ ロ ッ ラ マ の た め の / * 未 使 用 ス タ ッ ク 領 域 ク リ ア * / unsigned get_usedstk( void ) ・ / * 使 用 ス タ ッ ク サ イ ズ の 取 得 * / の ふ た つ の 関 数 か ら 成 り ま す 。 こ れ ら の 関 数 の 使 用 例 を List 4 (teststk. c) List 3 の ア セ ン プ ル リ ス ト ( Turbo C 十 十 1 .0 : ー N ) そ れ て 、 は , 前 記 の 三 つ の 中 て 、 も っ と も 実 用 性 が あ る , ス タ ッ ク 領 域 の 初 期 値 を 設 定 し て お い て 調 べ る た め の 関 数 を List 3(stkc lr. c ) に 示 し ま す 。 List 3 は void stkclr( int data ) ・ ン ク シ ョ ン を 呼 び 出 し ま す か ら , 結 構 う ま く 調 べ ら れ る 可 能 性 が あ り ま す 。 ス タ ッ ク 領 域 の 初 期 値 を 設 定 し て 調 べ る テ ス ト プ ロ グ ラ ム List 2 B List 1 : ifndef ??vers ion 2 : ?debug macro 3 : endm 4 : $comm macro name, dist, size, count 5 : comm dist name: BYTE: count*size 6 : endm 7 : else 8 : $comm macro name, dist, size, count dist nameCsize] :BYTE:count 9 : 10 : endm endif 11 : ?debug S ” test. c ” 12 : ?debug C E90C9A9616067 乢 573742E63 13 : TEXT segment byte publ ic ' CODE' 14 : 15 : TEXT ends 16 : DGROUP group DATA, _BSS 17 : assume cs :_TEXT, ds : DGROUP DATA segment word public ' DATA' 18 : 19 : [email protected] la 1 byte 20 : [email protected] 1a21 word 21 : DATA ends segment word publ ic ' BSS' 22 : BSS 23 : label byte 24 : [email protected] 1a21 word 25 : BSS endS TEXT segment byte publ ic ' CODE' 26 : void func( void ) 28 : 29 : 30 : assume cs : TEXT 31 : func proc near 32 : push bp 33 : mov bp, sp 34 : cmp word ptr brklvl, sp jb short @[email protected] 35 : 36 : call near ptr N—[email protected] 37 : @[email protected] : 38 : 39 : 40 : 41 : 42 : pop bp ret 44 : func endp 45 : ?debug C E9 46 : TEXT ends DATA segment word publ ic ' DATA' 47 : 48 : [email protected] label byte 49 : DATA ends TEXT segment byte publ ic ' CODE' 50 : 51 : TEXT ends publ ic _func 52 : extrn [email protected]: far 53 : 54 : brklvl : far extrn 55 : end 1 : void func( void ) List 3 の ア セ ン プ ル リ ス ト (Turbo C 2.0 ト N ) List 2A 1 : ifndef ??vers ion 2 : ?debug macro 3 : endm 4 : endif ?debug S "test. c ” 5 : TEXT segment byte publ ic ' CODE' 6 : 7 : DGROUP group DATA, BSS 8 : assume cs :_TEXT, ds : DGROUP, ss : DGROUP 9 : TEXT ends 10 : DATA segment word publ ic ' DATA' 11 : [email protected] 1a21 byte 12 : [email protected] 1a21 word 13 : DATA ends segment word public ' BSS' 14 : BSS 15 : 1a21 byte 16 : [email protected] la 1 word 17 : ?debug C E90C9A961606746573742E63 18 : BSS endS TEXT segment byte publ ic ' CODE' 19 : 20 : ?debug L 1 21 : func proc near 22 : c 叩 word ptr DGROUP : brklvl, sp 23 : jb @2 11 far ptr [email protected] 24 : 25 : @2 : 26 : @1 : 27 : ?debug L 3 28 : ret 29 : func endp 30 : TEXT ends 31 : ?debug C E9 DATA segment word publ ic ' DATA' 32 : 33 : [email protected] la 1 byte 34 : DATA ends brklvl :word 35 : extrn extrn [email protected]: far 36 : ' CODE' TEXT segment byte publ ic 37 : 38 : TEXT ends publ ic func 39 : 40 : end 新 MS-DOS プ ロ グ ラ ミ ン グ 入 門 81

Surreptitious software obfuscation watermarking and tamperproofing for software protection


6.2 Moving Code Around 565 When the program tries to write into the code stream, the operatmg system throws an exception. Then, the attacker examlnes the instruction at address ① x28c ① that caused the trap and finds that it tries to store the value ⅲ register ( ー 64 ) into the address stored in register r2 ( 0x2 男 4 ). Now, all he has to do is replace the instruction at address ① x28c ① , which does the modification, with a nop and the byte at address ① X2934 with ー 64 , and he's done! ProbIem 6.1 ln a real implementation of 0BFKMNM, there may be hundreds or thousands of updates to the code segment, and it would be infeasible for an attacker tO remove each one of them by hand. Write an attack script that automates the process. Algorithm 6.1 の 66 gives an overview of the obfuscation. The idea is to find three points 4 お , and C ⅲ the control flow graph, like this: ENTER target : A move 0 灯 g , target C move bogus, target EXI T At ス , you insert an lnstruction that overwrites the target lnstructlon with its original value 0 〃 g , restoring the routine to an executable state. At C, you likewise lnsert an lnstruction that overwrites the target with the bogus value. You have to choose ス , お , and C such that every path to B flows through ス and every path from お flows through C. AS you saw, this algorithm is susceptible to dynamic attacks. But what about static attacks? If an adversary can statically determine that an instruction modifies the text segment, and ル る な る location it modifies, then patching the executable to rid it of the self-modification isn't hard. To make things a bit more difficult for the adversary, you can compute the address of the target instruction using an opaque

月刊 C MAGAZINE 1991年4月号


5 8086 / 8088 用 ア セ ン プ ラ テ キ ス ト LiSt る 必 要 が あ り ま す 。 ま た , 割 り 込 み 処 理 に つ い て は 実 際 に ど の よ う な 処 理 を 行 う か 早 急 に 決 定 し な け れ ば な り ま せ ん 。 も し , 割 り 込 み 関 数 用 の モ デ ィ フ ァ イ ヤ ー を 設 け る の て 、 あ れ ば プ リ プ ロ セ ッ サ / パ ー サ の 段 階 か ら の 対 応 が 必 要 と な り ま す の て 、 , 次 回 に も 具 体 的 な 検 討 を 行 う 必 要 が あ り ま す 。 と く に こ の 問 題 に 関 し て 具 体 的 な 要 望 , 使 用 し た い ケ ー ス に つ い て の ご 意 見 を お も ち の 方 は な る べ く 詳 し い 内 容 を 本 誌 編 集 部 fPragmaC 』 係 ま て 、 お 寄 せ く だ さ い 設 問 以 外 の ご 要 望 次 の 2 点 は , 設 問 以 外 に 寄 せ ら れ た ご 要 望 の な か か ら ヒ 。 ッ ク ア ッ プ し た も の て 、 す 。 C 十 十 に つ い て C 十 十 に 対 応 ( ? ) す べ き だ と い う 意 見 が い く っ か 寄 せ ら れ て い ま す 。 も し か す る と 「 PragmaC て は , C 十 十 に つ い て 故 意 に 無 視 し て い る の て は な い か ? 」 と い う 印 象 を も た れ た 読 者 も い る か も し れ ま せ ん 。 た し か に こ れ ま て 、 本 記 事 中 て C 十 十 に つ い て 言 及 し た こ と は あ り ま せ ん が , 無 視 し て い る わ け て 、 も 避 け て 通 ろ う と し て い る の て 、 も あ り ま せ ん 。 PragmaC て 、 は , C 十 十 に 対 し て 以 下 の よ う な 構 成 を 取 る こ と に よ り 対 応 て 、 き る の て 、 は な い か と 考 え て い ま す 。 ① プ リ プ ロ セ ッ サ ・ フ ェ ー ズ 1 ② C 十 十 ト ラ ン ス レ ー タ ③ プ リ プ ロ セ ッ サ ・ フ ェ ー ズ 2 ④ / ヾ ー サ ⑤ コ ー ド ジ ェ ネ レ ー タ 具 体 的 に は , プ リ プ ロ セ ッ サ ・ フ ェ ー ズ l<#include な ど の プ リ プ ロ セ ッ サ 疑 似 命 令 を 処 理 し , こ の テ キ ス ト を 一 度 フ ァ イ ル に 書 き 出 し て か ら ト ラ ン ス レ ー タ を 呼 び 出 し , そ の 出 力 に 対 し て 文 字 列 や エ ス ケ ー プ 処 理 を 施 し て 解 析 , 生 成 と い っ た 処 理 の 流 れ と 62 C MAGAZINE 1991 4 8086 / 8088 用 サ ン プ ル : Memory mode 1 : C0de=sma Ⅱ Data=near Segment=d : Processor: 8086 / 88 Optimization: d i sa b I ed Pack data : word : Stack checking: 0ff : Default char: unsi gned String segment: data : Const segment: data Line numbers: 0ff . 8086 dummy : near group CONST, -DATA, _BSS _TEXT group segment byte public 'CODE' assume cs :CGROUP, ds:DGROUP endS segment word public 'CONST' assume cs:CGROUP, ds:DGROUP endS segment word public ' DATA' assume cs:CGROUP, ds:DGROUP endS segment word public 'BSS' assume cs:CGROUP, ds:DGROUP endS extrn DGROUP CGROUP TEXT _TEXT CONST CONST DATA _DATA BSS _BSS 0 : 0022h : 0000h : 0000h : 0000h TEXT segment byte public ・ CODE' assume cs:CGROUP, ds:DGROUP public -sample proc push mov sub near sample [email protected] [email protected] 0 CO . ー 0 っ 0 - -0 8 8 十 ) 十 レ ー 0 0 ・ ー 4 0 0 0 0 0 0 0 0 0 ニ 0 0 0 0 1 よ 、 1 11 1 よ 、 1 ワ 0 0 乙 0 a. a. [email protected] [email protected] push push ca Ⅱ mov add mov mov mov word ptr [email protected] [bp] word ptr [email protected] [bp] near ptr _dummy word ptr [email protected][bp], ax sp, 十 4 ax, word ptr [email protected][bp] word ptr [email protected] [bp], ax ax, word ptr [email protected][bp] sp, bp mov POP ret endp endS end -sample _TEXT

Surreptitious software obfuscation watermarking and tamperproofing for software protection


184 Program Analysis Algorithm 53 Overview of AIgorithm RECG. X is a stripped executable file. DECOMPILE ( X) : goto m achine code tests an d bran ches with i f (a) Perform a reaching definitions data flow analysis on condition codes and replace 7. For each basic block in G recover statements: 6. Optimize G by removrng Jumps-to-Jumps. 5. Replace known idioms with higher-level constructs. 4. Remove any functions from G whose signatures match those in szgs. con trol flow gr 叩 h G. う . Disassemble the text segment and construct a call graph and for every function a library function signatures for this compiler. 2. Heuristically determine the compiler that generated X. Let be the set of known 1. Parse the executable 石 le X and recover the text segment and the entry pornt main. Z : cmp1 尸 , 〃 〃 ′ 〃 ↓ ノ ・ : brg lab ノ : if 尸 > z goto lab (b) Remove a temporary register / 戸 by replacing its use with its symbolic contents. First perform a definition-use data flow analysis to determine the number of uses Of / 2 and then an interprocedural live register data flow analysis to determine registers that are live at entrance and exit of the block. Finally, perform ル ル 4 4 み 立 ″ 4 / あ 〃 tO eliminate / 戸 and its definition: ↓ / : add / 2 , リ ノ : cmpi / 戸 十 , z (c) Replace calls to library functions in 立 with calls to the corresponding symbolic name: / : call ノ ノ Z : ca11 〃 4 / ″ 8. Classify nodes in G by calling RESTRUCTURELOOPS(G) and RESTRUCTUREIFS(G) in Figure 3.4 182 and Figure .5 18 名 respectively. 9. Traverse G and build an abstract syntax tree. For a basic block marked as being the head of a control structure, traverse its body depth first, i. e. , until its follow node is reached, and then continue with the follow node. 10. Traverse the abstract syntax tree and emit source code.

Surreptitious software obfuscation watermarking and tamperproofing for software protection


98 Dynamic Obfuscation t0 initialize the cells with the KG keystream. show the new code in Listing 6.11 の 97. The code that, in a real implementation, would be executed at obfuscation time has been marked dashed. 6.4 1)iscusslon All the algorithms ⅲ this chapter share one characteristic: They modify the code segment Of the program at runtlme. This has three immediate consequences: 1. lt makes the program harder t0 analyze statically. 2. lt has the potential of making the program 4 訪 slower. う . lt can make the protection routines less stealthy. static analysis becomes hard because the code segment is now treated bOth as code 4 〃 ノ as data, and any modifications t0 the code have t0 be tracked bY the analyzer. ln section う .1. し 、 119 , you saw the kinds 0f contortions Algorithm REAMB had t0 go through t0 build a control flow graph that' more or less accuratelY' reflects the changes a self-modifying program goes through. The significant overhead 0f these algorithms results from the very features that make modern processors so efficient at being "confused" bY self-modifying code. At the very least, whenever the code segment changes' the instructlon pipeline must be flushed, the contents Of data caches must be written tO memory, and instruction caches must be invalidated. stealth suffers for several reasons. First, few real programs use self-modifying COde. AS you ve seen, a simple attack is tO write-protect the COde segment and see where the operatmg system throws an exception. Second' a consequence Of the high overhead Of these algorithms is that it may not be possible tO protect an entire program. lnstead, you may have tO confine the obfuscation tO those routines that contaln security-sensitive COde. AS a most Of your program 引 1 execute nor- mally" while a small part will write 1ntO its own code segment. lt won t reqtllre much thought for the adversary t0 decide which part 0f your program t0 examine first. Finally, many Of the algorithms you ve seen ⅲ this chapter make extensive use Of xor operations. 気 h the exception 0f cryptographic routlnes and low-level graphics prmitlves, xors are real COde. Referring back to the model in Section 2. ム , 86 , what types 0f operations d0 the algorithms in this ch 叩 ter perform? First, since they all continuously modify the code at runtlme, they must all make use Of the dynamic primltive. ln addition tO

FIARLOGE SEGMENT A/B/C


0 ご あ い さ っ と あ と が き と お く づ け の ペ ー ジ 0 予 定 よ り ま ん が の ペ ー ジ 数 か 増 え ち ゃ っ た の で ご あ い さ つ 以 下 が 1 ペ ー ジ に 圧 縮 で す 。 ・ ご あ い さ つ ■ と い う わ け で こ ん に ち は 、 s IJ D A で ご ざ い ま す 。 ち ょ っ と だ け 久 し ぶ り の 本 で す 。 え ー と 、 厚 い 本 で す 、 今 回 。 今 回 の キ ャ ラ は 4 年 く ら い 前 か ら ち ょ こ ち ょ こ 考 え て い た 奴 ら で す 。 3 年 前 の 「 ち る る と 師 匠 ( 魔 法 の ち る る ) 」 は 当 時 の ミ ア と エ リ ア か ら 流 用 し て る の で 見 比 べ る と お も し ろ い で す 、 自 分 で は 。 工 リ ア は 今 よ り 年 上 で す ね 。 逆 に ミ ア は 幼 か っ た よ う な 。 話 を 考 え た 当 初 は か な り 暗 い ( 笑 ) 路 線 だ っ た の で す が 、 自 分 と し て は や つ ば り 読 ん だ り 描 い た り し て 楽 し い の は コ メ デ ィ ー な ん で す よ ね 。 そ ん な の が ち ょ っ と 不 安 だ っ た の で す が 、 実 際 に 描 き 始 め て み る と ・ ・ ・ キ ャ ラ が 勝 手 に コ メ デ ィ ー に し て く れ た の で し た ( 笑 ) 。 こ い つ ら っ て ば ・ ・ ・ つ て 感 じ で す 。 ー コ メ ン ト と か ・ ・ ハ ロ ー グ ッ パ イ : ・ ・ ・ と い う 歌 が 大 昔 に あ っ た よ う な 。 良 く 知 ら な い け ど 。 去 年 描 い た カ ラ ー イ ラ ス ト の 1 枚 は P 1 0 下 の コ マ が 気 に 入 っ た の で 流 用 し た も の 。 こ っ ち が オ リ ジ ナ ル で す 。 ・ 亡 霊 . 元 ネ タ は 特 に 無 し 。 何 に も な い 平 原 が 舞 台 ( ? ) な の で 背 景 楽 だ 一 と か 考 え て た ら 、 逆 。 何 に も 無 い ト コ を 描 く の は ム ズ カ シ イ で す 。 ・ 天 使 降 臨 . そ れ な り に シ リ ー ズ 物 っ ぽ く し た か っ た の で ( 笑 ) 最 後 の ト コ だ け 申 し 訳 程 度 に 引 っ 張 ら せ て い た だ き ま し た 。 ・ お ま け ロ シ ナ ン テ メ モ リ ー ベ ー ジ 数 合 わ せ の た め に 土 壇 場 で 描 き ま し た 。 一 部 コ ピ ー & ペ ー ス ト で す 。 ( 笑 ) ※ そ い え ば タ イ ト ル の 「 フ ェ ア ロ ー ジ ュ 」 が 登 場 し な い の で す が 一 、 実 は ミ ア が 天 使 に ヘ ン シ ン す る た め の マ ジ カ ル ア イ テ ム で す 。 ・ ・ ・ ウ ソ で す 。 過 去 の 自 分 の ま ん が を 読 み 返 し て み る と ペ ー ジ 全 体 と い う か 全 コ マ に 背 景 と か ご ち や ご ち ゃ と 描 い て あ っ て ち ょ っ と う る さ い 感 じ で し た 。 こ の へ ん 、 原 稿 の ま ま で は 良 く 判 ら な い ん で す よ 、 実 際 に 本 に し て み な い と 。 そ ん な わ け で 今 回 は 少 し 空 白 を 増 や し ま し た 。 ・ ・ 原 稿 の 状 態 だ と 妙 に 白 く て 不 安 な ん で す け ど 。 ■ あ と が き ・ ま あ 、 内 容 は い つ も 通 り と い う か 大 し た モ ノ じ ゃ な い わ け で ス ト ー リ ー 的 に 続 き が 読 み た い と か 思 っ て も ら え る よ う な モ ノ で も な い の で す が 、 で き れ ば こ の キ ャ ラ 達 を 好 き に な っ て も ら い た い な ー と い う 目 標 で 描 い て ま す 。 と い う わ け で こ の 話 は ド ラ マ チ ッ ク で ダ イ ナ ミ ッ ク な 展 開 が あ る わ け で も な く て ろ て ろ 描 い て い く つ も り な の で こ の キ ャ ラ 達 の コ ト を 少 し で も 思 い 出 し た ら 読 ん で も ら え る と 嬉 し い で す 。 え ー と 、 こ の 先 の 4 話 分 8 0 p の 下 描 き が 出 来 て た り し ま す 、 既 に と い う か そ っ ち を 先 に 描 き 始 め た の で す が 。 た だ 、 か な り 手 直 し と か す る と 思 う の で 本 に な る の は ち ょ っ と 先 か も で す 。 あ と 今 回 こ の 本 の べ ー タ 版 テ ス ト に 協 力 し て く れ た 方 々 、 感 謝 で す 。 > 0 氏 ・ S 氏 ・ K 氏 ・ T 氏 ・ M 氏 そ ん な わ け で し た 。 そ れ じ ゃ よ か っ た ら ま た 会 お う ね 。 2 0 0 1 . 8 . 2 8 M . S IJ D A 0 。 0 な い 別 ・ 0 9 ■ お く づ け ■ FIARLOGE SEGMENT A / 副 0 発 行 Sep. 2001 SIESTA ( http : 〃 w 響 w - k を 諸 im. 0 れ jp ト 0 a ね 「 0 可 連 絡 先 [email protected] ・ ↑ 感 想 等 い た だ け る と 嬉 し い で す ・ 48

月刊 C MAGAZINE 1991年4月号


80186 / 80286 用 ア セ ン プ ラ テ キ ス ト 能 な 問 題 だ と 思 わ れ ま す 。 ト ラ ン ス レ ー タ と し て 考 え た 場 合 に は C 十 十 そ の も の に こ だ わ る 必 要 は な い と 田 い ま す 。 ど ん な に 拡 張 さ れ た C 十 十 て 、 も , ま た , PASCAL → C, BASIC → C な ど の ト ラ ン ス レ ー タ を 組 み 合 せ る こ と も 可 能 て 、 し よ う 。 要 は パ ー サ に 入 力 さ れ る テ キ ス ト が , 正 統 な C の 文 法 に 適 合 し て い れ ば よ い わ け て 、 す か ら ・ ・ 識 別 子 で の 日 本 語 使 用 識 別 子 と し て 日 本 語 ( シ フ ト JIS 漢 字 コ ー ド ) を 使 用 て 、 き る よ う に 拡 張 す る こ と は , コ ン パ イ ラ を 作 成 す る う え て 、 は ほ と ん ど 問 題 あ り ま せ ん 。 ANSI の キ ャ ラ ク タ コ ー ド 規 約 か ら は 外 れ て し ま う こ と に な り ま す が , 文 字 列 リ テ ラ ル 中 に お い て 日 本 語 を 認 識 し な け れ ば な ら な い 以 上 , 同 程 度 の 違 反 て 、 あ る と い え ま す 。 た だ し , 問 題 と な る の は 日 本 語 の 識 別 子 を 埋 め 込 ま れ た オ プ ジ ェ ク ト を リ ン カ や デ バ ッ ガ が 処 理 す る こ と が て 、 き る か ど う か と い う 点 て 、 す 。 LINK や PLINK, SYMDEB や CODEVIEW な ど は , 予 測 て 、 き な い 結 果 を 引 き 起 こ す 可 能 性 が あ り ま す 。 も ち ろ ん , 専 用 の リ ン カ , デ バ ッ ガ な ど を 作 成 す る こ と に よ っ て 対 応 す る と い う 手 も あ り ま す が , そ こ ま て 、 す る と ほ か の 環 境 (MS-DOS 以 外 の OS や ェ ク ス テ ン ダ な ど ) へ の 移 植 性 が 著 し く 損 な わ れ る こ と に な っ て し ま う て 、 し よ う 。 妥 協 案 と し て 「 コ ン バ イ ラ 内 部 で は 日 本 語 と し て 識 別 ・ 処 理 す る が , オ プ ジ ェ ク ト を 生 成 す る 段 階 で は ア ス キ ー コ ー ド セ ッ ト に 適 合 す る よ う に 変 換 す る 」 と い っ た こ と も 考 え ら れ ま す 。 こ れ は , そ の 昔 , 日 本 語 対 応 の コ ン パ イ ラ が な い 時 代 に , フ ィ ル タ ー を 使 用 し て 文 字 列 中 の 日 本 語 を 文 字 工 ス ケ ー プ に 置 き 換 え て い た の と 同 じ よ う な 形 て 、 の 処 理 が 可 能 て 、 し よ う 。 た だ し , こ の 場 合 , っ た ほ う が 処 理 ス ヒ 。 ー ド の 点 な ど て 、 有 利 に な り ま す 。 も ち ろ ん , ト ラ ン ス レ ー タ を コ シ ン ポ リ ッ ク デ バ ッ グ を 行 う こ と は ほ と ん な り ま す が , RAM デ ィ ス ク を 使 用 し た り EMS ン パ イ ラ 本 体 に 埋 め 込 む , ま た は , C 十 十 の ど 不 可 能 と な っ て し ま い ま す 。 を 採 用 す る こ と な ど に よ り あ る 程 度 解 消 可 制 御 構 造 を 直 接 解 析 す る と い っ た 手 法 を 取 プ ロ ジ ェ ク ト PragmaC 63 List 80186 / 80286 用 サ ン プ ル Memory model: Processor: Optimization: : Pack data : Stack checking ・ : Default char: String segment: : Const segment: Line numbers . C0de=smaII Data=near Segment=d 80186 / 80286 d i sab I ed word 0ff uns i gned data data 0ff 0 . 186 extrn dummy:near group CONST, -DATA, -BSS TEXT group segment byte public 'CODE' assume cs:CGROUP, ds:DGROUP endS segment word publ ic 'CONST ・ assume cs:CGROUP, ds:DGROUP endS segment word public ' DATA' assume cs :CGROUP, ds:DGROUP endS DGROUP CGROUP TEXT TEXT CONST CONST _DATA DATA : 001eh ; 圓 00h : 0000h : 0000h segment word public 'BSS' assume cs :CGROUP, ds:DGROUP endS segment byte publ ic 'CODE' assume cs:CGROUP, ds:DGROUP pub lic proc enter push push call mov add mov mov mov leave ret end endS end -sample , れ 0 -4 ・ O -4 ・ O Q) cd 0 0 0 ー 0 ー ヂ ヂ を 7 ー 行 ー 0 4- O -4 ・ -4 ・ -4 ・ ー ヂ ー 8 8 8 8 8 + レ + レ + レ 4 し ・ -0 O ・ 0 0 11 1 ー ・ 0 0 0 00 0 0 一 一 0 0 0 0 11 11 1 よ 11 0 0 near + 4 , 0 word ptr [email protected] [bp] word ptr [email protected] [bp] near ptr _dummy word ptr [email protected] Cbp], ax sp, 十 4 ax, word ptr [email protected]] word ptr [email protected][bp], ax ax, word ptr [email protected][bP]

月刊 C MAGAZINE 1990年11月号


プ ロ ク ラ ミ ン グ 添 削 読 み 飛 ば さ れ ま す 。 単 純 に 2 回 以 上 イ ン ク ル ー ド し , 再 定 義 な ど の エ ラ ー が 出 る よ う な 場 合 に こ の テ ク ニ ッ ク を 使 え ば , 2 回 以 上 の イ ン ク ル ー ド 時 に お け る エ ラ ー 発 生 を 防 げ ま す 。 こ の テ ク ニ ッ ク は 必 ず 覚 え て く だ さ い 。 そ し て , 自 分 て 、 作 成 す る ヘ ッ ダ フ ァ イ ル は す べ て こ の テ ク ニ ッ ク を 使 う よ う 心 が け ま し よ う 。 memory. h Li st 2 : 3 : 4 : 6 : 7 : #if !defined()- い B-MEMORY-DEF-) い B_MEMORY_DEF_ 8 : #define 9 : _peek( unsigned segment, unsigned offset) ; 10 : i nt peekb(unsigned segment' unsigned offset) : 11 : char POke( unsigned segment' unsigned offset' int value) ; 12 : void -pokeb(unsigned segment, unsigned offset' char value) : 13 : void 14 : ((void far * ) \ 15 : #define _FPTR(seg,ofs) (((unsigned long) (seg) く く 16 ) ー (unsigned) (ofs))) 17 : 18 : #define _peek(a,b) 19 : #define -peekb(a,b) 20 : #define _poke (), b, c) (*((char far*)-FPTR((a), (b))) 21 : #define _pokeb(), b, c) 22 : 23 : #endif <l ibYmemory. h> 8086 メ モ リ ア ク セ ス ・ ラ イ プ ラ リ へ ッ ダ フ ァ イ ル by 柴 田 望 洋 自 分 で 作 成 す る ヘ ッ ダ フ ァ イ ル は , 2 回 以 上 イ ン ク ル ー ド さ れ て も エ ラ ー が 起 こ ら な い よ う に 作 成 す る 。 10 ~ 13 行 目 は 関 数 版 の た め の プ ロ ト タ イ プ 宣 言 て 、 す 。 18 ~ 21 行 目 が マ ク ロ 版 の 定 義 部 分 て 、 す 。 far ポ イ ン タ は メ モ リ モ デ ル ( ス モ ー ル , ラ ー ジ な ど ) に 依 存 せ ず に , つ ね に 32 ビ ッ ト て 、 表 現 さ れ る ポ イ ン タ て 、 す 。 こ の ポ イ ン タ に 強 制 的 に 物 理 ア ド レ ス を 代 入 す る こ と に よ り , IM バ イ ト の メ モ リ 空 間 を 自 由 に 表 現 て 、 き ま す 。 15 行 目 て 、 定 義 し て い る 一 FPTR は ふ た つ の 引 数 seg, ofs て 表 さ れ る ア ド レ ス を 指 す fa 「 ポ イ ン タ を 作 成 し ま す 。 peek, peekb は そ の fa 「 ポ イ ン タ の 指 し て い る ア ド レ ス の 値 を そ れ ぞ れ i nt, char 型 と し て 返 す も の て 、 す 。 poke, P0keb は 作 成 さ れ た fa 「 ポ イ ン タ の 指 す ( そ れ ぞ れ int , cha 「 型 を も っ ) ア ド レ ス に 値 を 代 入 し て い ま す 。 こ れ て 、 マ ク ロ 版 は 完 成 し ま し た 。 ・ 関 数 に よ る 実 現 次 は 関 数 版 て 、 す 。 高 速 化 の た め に ア セ ン プ リ 言 語 を 使 用 し ま し よ う 。 List 2 が ア セ ン プ リ て 記 述 し た ラ イ プ ラ リ の ソ ー ス (peekpoke. asm) の リ ス ト て 、 す 。 ス モ ー ル , コ ン ノ ヾ ク ト , ミ デ ィ ア ム , ラ ー ジ ( ヒ ュ ー ジ ) モ デ ル に 対 応 し て い ま す 。 ス モ ー ル モ デ ル 用 に ア セ ン プ ル す る と き , A > MASM /MX /Dm0del = small peekpoke. asm , の よ う に し て く だ さ い ( 各 モ デ ル 用 に ア セ ン プ ル ず み の オ プ ジ ェ ク ト フ ァ イ ル が 付 録 デ イ ス ク に 格 納 さ れ て い ま す ) 。 プ ロ グ ラ ミ ン グ 添 削 135 (int) (c)) (char) (c)) peekpoke. asm List 1 よ ワ 00 ・ 4 ・ ド 0 《 00 ー 80V011 っ 0 っ 0 4 ・ -. 0 ^ 0 ー ) 0 、 1 っ 0 っ -4 ・ 戸 0 ^ 0 行 ー 80V011 っ 0 っ 0 ・ 4 ・ 戸 0 1 よ 11 1 人 11 11 14 1 よ 1 よ 11 1 ・ - っ 0 っ 0 ワ っ っ 0 ワ 0 ワ 朝 ワ 3 っ 乙 っ 0 っ 0 っ 0 っ 0 っ 0 00 peek, peekb, -POke, -pokeb for Turbo-C, MS-C, Quick-C, Zortech-C + + , Hitech-C (MS- い (K) etc.. . MODEL model, C . CODE peek SegI, 0fsI PROC peek ax, Seg1 mov mov e S , a X bx, 0fs1 mov ax, es: [bx] mov ret ENDP _peek -peekb PROC Seg1, 0fs1 -peekb ax, Seg1 mov e S , a X mov bx, 0fs1 mov ax, es: [bx] mov ah, 0 mov ret ENDP -peekb poke

月刊 C MAGAZINE 1990年11月号


理 的 な ) 添 え 字 を , A(segment : offset) て 、 の segment お よ び offset は 便 宜 的 に 導 入 し た 添 え 字 を 意 味 し ま す 。 つ ま り , A (segment : offset) は , A[segme nt * 10 十 offset ] を 意 味 す る わ け て 、 す 。 Fig. 1 の よ う に 考 え れ ば わ か り ま す ね 。 こ て 導 入 し た の が , い わ ゆ る セ グ メ ン テ ー シ ョ ン (segmentation) の 概 念 て 、 す 。 セ グ メ ン ト (segment) は , 実 際 の 添 え 字 て 、 い う と 10 個 お き の 任 意 の 位 置 に 設 定 て き , 一 度 セ グ メ ン ト を 設 定 す る と , そ こ か ら 100 個 の デ ー タ を 先 頭 か ら の オ フ セ ッ ト (offset)< 表 す こ と が て き ま す 。 た と え ば , セ グ メ ン ト を 21 と す る と , Fig. 2 の よ う に A [ 210 ] か ら A [ 309 ] ま て 、 を 表 現 す る こ と が て 、 き る よ う に な る こ と が わ か り ま す ね 。 , こ ま て 、 は た ん な る 例 て 、 し た の て 、 , 10 進 数 て 、 考 え ま し た が , 実 際 に 8086 の セ グ メ ン ト ・ オ フ セ ッ ト の 計 算 は 16 進 数 ( 内 部 的 に は 0 と 1 の 2 進 数 て 、 す が ) て 、 行 い ま す 。 た と え ば , 実 際 の 物 理 ア ド レ ス は 20 ビ ッ ト ( 16 進 数 5 桁 ) て す 。 こ れ を 16 ビ ッ ト ( 16 進 数 4 桁 ) て 表 せ ば よ い こ と に な り ま す 。 た と え ば FOA01 は Fig. 3 の よ う に , セ グ メ ン ト FOAO : オ フ セ ッ ト 0001 や セ グ メ ン ト F000 : オ フ セ ッ ト 0A01 の よ う に 表 せ ま す 。 す な わ ち , ア ド レ ス = セ グ メ ン ト >< 16 十 オ フ セ ッ ト と な り ま す 。 こ て , 16 を 掛 け る と い う の は , 10 進 数 て い え ば , 10 を 掛 け る こ と に 相 当 す る の て 、 , 1 桁 繰 り 上 げ る こ と と 同 じ な の は い う ま て も あ り ま せ ん 。 こ れ て IM バ イ ト も の メ モ リ 空 間 を , セ グ メ ン ト , オ フ セ ッ ト の 16 ビ ッ ト ふ た つ の 数 て 表 す こ と が て き ま し た 。 ラ イ プ ラ リ の 作 成 そ れ て は , ラ イ プ ラ リ を 作 成 し ま し よ う 。 poke, peek と い う 名 前 に す る と , Zortech C 十 十 を 使 用 す る と き に 支 障 が あ り ま す ね 。 て す か ら , 今 回 は poke, pokeb, peek, peekb と い う 名 前 て 、 ラ イ プ ラ リ を 作 成 し ま す 。 Fig. 2 セ グ メ ン ト と オ フ セ ッ ト の 例 A(seg : ofs) A [ 310 ] A [ 309 ] A [ 308 ] A ( 21 : 99 ) A ( 21 : 98 ) 100 個 A [ 212 ] A [ 211 ] A [ 210 ] A [ 209 ] 2 ) A ( 21 : A ( 21 : 0 ) A ( 21 : 先 頭 Fig. 3 セ グ メ ン ト と オ フ セ ッ ト の 例 segment offset F0000 + 0A01 ゞ FOAO 1 FOA00 + ー 0001- FOAO 1 VOid poke(unsigned segment, unsigned offset, int value) ; に , 以 下 の よ う な 仕 様 と し ま す 。 く ⅱ b \ memo h 〉 を イ ン ク ル ー ド し て い る 場 合 は マ ク ロ と し て 扱 わ れ , く lib*me void pokeb(unsigned segment, mo h 〉 を イ ン ク ル ー ド し て い な い 場 unsigned offset, char value) : 合 , も し く は マ ク ロ 定 義 を # undef し た セ グ メ ン ト segment, オ フ セ ッ ト offset 場 合 は , 関 数 と し て 扱 わ れ ま す 。 で 示 さ れ る 物 理 ア ド レ ス の メ モ リ 位 置 す な わ ち , ー poke な ど を 呼 び 出 す ソ ー ス フ に ワ ー ド value( pokeb は バ イ ト value) ア イ ル て 、 く libYmemory. h> が イ ン ク ル ー ド さ れ て い れ ば , 高 速 の マ ク ロ の バ ー ジ ョ ン の 値 を 格 納 し ま す 。 と な り , イ ン ク ル ー ド さ れ な け れ ば , 通 常 int peek(unsigned segment, の 関 数 と し て 取 り 扱 い ま す 。 ラ イ プ ラ リ は , マ ク ロ 版 と 関 数 版 の ふ た unsigned offset) ; つ を 作 成 し ま す 。 ・ マ ク ロ に よ る 実 現 char peekb(unsigned segment, List 1 が く IibYmemory. h > の 内 容 て 、 す 。 unsigned offset) : セ グ メ ン ト segment, オ フ セ ッ ト offset こ の フ ァ イ ル を 最 初 に イ ン ク ル ー ド し た と で 示 さ れ る 物 理 ア ド レ ス の メ モ リ 位 置 L 旧 MEMORY DEF が マ ク ロ 定 義 き に の ワ ー ド 値 ( ー peek は バ イ ト 値 ) を 返 し ま さ れ ま す ( 8 行 目 ) 。 も し 何 か の 拍 子 に こ の ヘ す 。 ッ ダ を 2 回 以 上 イ ン ク ル ー ド し て も , 7 行 目 の チ ェ ッ ク に ひ っ か か り ま す の て 、 , 8 ~ 23 行 こ れ ら の ラ イ プ ラ リ は , Turbo C を 参 考 目 ま て 、 ( す な わ ち 定 義 ・ 宣 言 部 の す べ て ) が 134 CMAGAZINE 19 11