;일단 필요할것 같은 버퍼들을 망라해보자.  
;TRS_BUFF ;번역할 문장이 위치한 버퍼의 주소
;TRS_LAST_BUFF ;번역형 버퍼의 현재 끝 주소
;CMP_BUFF ;완성된 버퍼가 위치한 버퍼의 주소
;CMP_LAST_BUFF ;완성형 버퍼의 현재 끝 주소
;CMP_BUFF_LENG ;완성형 버퍼의 현재 길이
;BASE_ADDR ;문장 구조체의 시작 주소
;STR_ADDR ;문장이 위치하는 주소
;STR_LENG_ADDR ;문장 길이가 위치하는 주소
;STR_MAX_ADDR ;문장 최대길이가 위치하는 주소
;TMP_BUFF ;주로 픽스라인 때문에 쓰지 않을까.
;EBX를 존나 중요하게 써야할거같다.


;번역을 위해 후킹될 함수다.
;TRS_CPY가 포함하고 있다. 혹시 모르니 다용도를 위해 따로 포인트를 만들었다.
TRS_HOOK
NOP ;여기를 후킹하자.
NOP
NOP
NOP
NOP
RETN ;결과적으로는 번역문 버퍼가 번역되겠지.


;현재 번역버퍼에 있는 문장을 번역한 뒤 번역버퍼를 초기화한다.
;번역버퍼의 크기는 총 5000바이트.
;그리고 번역된 문장은 완성형 버퍼에 이어 붙이고 동시에
;완성형 버퍼의 길이와 주소를 자동으로 갱신해 준다.
TRS_CPY
CMP DWORD PTR DS:[TRS_BUFF],0
JE END_ROOT ;버퍼가 0으로 초기화 되어있을시 그대로 리턴한다.
CALL TRS_HOOK ;번역함수

;번역된 문장을 완성형버퍼에 이어 붙이고 완성형 버퍼의 크기를 갱신한다.

MOV ECX,0x1388 ;번역문 버퍼의 크기는 5000(0x1388)바이트
XOR EAX,EAX ;EAX를 0으로 초기화. 검색의 기준이 된다.
MOV EDI,DWORD PTR DS:[TRS_BUFF] ;번역 버퍼의 시작주소를 EDI로 세팅
MOV ESI,EDI ;번역버퍼의 시작주소를 ESI로 세팅
REPNE SCAS BYTE PTR ES:[EDI] ;0까지 번역문 전체를 검색. 끝날시 EDI는 문장의 끝을 가리킨다.(종결)
SUB EDI,EDX ;EDX에는 번역버퍼의 시작이, EDI에는 번역버퍼의 끝이.
;서로 뺀 결과값은 EDI로 들어간다. 즉 문장의 길이.
;결과값은 종결자(0)를 포함하고 있다.
MOV ECX,EDI ;ECX에 다시 문장의 길이를 넣는다.
DEC EDI ;EDX 즉 복사된 문장 길이를 1 뺀다. 종결자를 빼기 때문.
ADD DWORD PTR DS:[CMP_BUFF_LENG],EDI ;EDI에 있는 복사될 문장 길이를 완성형 버퍼의 현재 길이와 더한후 덮어쓴다.
MOV EDI,DWORD PTR DS:[CMP_LAST_BUFF] ;EDI에 완성형 버퍼의 끝주소를 넣는다.
REP MOVS BYTE PTR ES:[EDI],DWORD PTR DS:[ESI] ;번역문을 완성형 버퍼에 이어 붙인다.

;번역문 버퍼를 초기화
MOV DWORD PTR DS:[TRS_BUFF],0 ;번역문 버퍼의 시작을 0으로 고친다. 이걸로 초기화.

END_ROOT:
MOV DWORD PTR DS:[TRS_LAST_BUFF],TRS_BUFF
;현재 진행중인 버퍼의 주소를 초기화 하자.
MOV DWORD PTR DS:[CMP_LAST_BUFF],EDI ;완성형 버퍼의 마지막 주소를 갱신하자.
RETN


;ECX에 기준 문자가 들어있다.
;EDI에는 처리할 문장의 주소가 들어있다.
;처리할 문장의 주소로부터 기준문자까지를 완성형 버퍼로 복사한다.
;기준문자는 오직 1바이트 문자만을 받아들인다.
;작업후 현재 작업해야할 문장 주소는 EBX로 리턴한다.
;동시에 완성형 버퍼의 길이와 최종주소 역시 갱신해준다.
;종료시 EBX를 갱신해 준다.
STR_CPY ;ECX와 EDI를 인자로 받는다.

MOV EDX,DWORD PTR DS:[CMP_LAST_BUFF] ;완성형 버퍼의 진행주소를 EDX로 넣는다.
MOV ESI,EDI
LOOP:
MOV EAX,BYTE PTR DS:[EDI] ;문장의 한 바이트를 AL로 옮긴다.
MOV BYTE PTR DS:[EDX],AL ;AL은 다시 EDX의 완성형 버퍼에 이어붙여진다.
INC EDI ;현재 진행중인 버퍼의 다음 주소를 가리킨다.
INC EDX ;완성형 버퍼의 다음 주소를 가리킨다.
CMP BYTE PTR DS:[EDI],CL ;기준 문자와 같은지 확인
JE END_LOOP ;같을 시 탈출하는데 이때 EDI는 진행중인 문장의
;필터링 되는 기준문자 다음을 가리킨다.
;따라서 EBX에 추가적인 작업이 없어도 된다.
JMP LOOP ;아닐시 반복 재개
END_LOOP:
MOV EAX,EDI ;EDI는 다음 포인터를 가리키고 있다. 이것을 EAX로 복사
SUB EDI,ESI ;EBX에는 이전 작업했던 포인터를 가지고 있다. 현재 완료한것과 작업전
;의 포인터를 빼면 문장길이가 산출된다.
;즉 EDI로 문장길이가 들어간다.
ADD DWORD PTR DS:[CMP_BUFF_LENG],EDI ;이것을 완성형 버퍼의 진행 포인터와 더한다.
MOV EBX,EAX ;아까 백업했던 EDI를 EBX에 넣는 것으로 EBX는 다음 작업해야할 포인터를
;포인터를 획득하게 된다.
MOV DWORD PTR DS:[CMP_LAST_BUFF],EDX ;그리고 완성형 버퍼의 마지막 주소를 갱신해준다.
RETN


;문장을 처리하게 되는 주요 함수. 스크립트를 분석하고 그에 맞쳐서 동작한다.
;주로 세개의 버퍼를 마구 오가기 때문에 극히 주의
;EBX는 원래의 구조체가 가진 대사의 주소가 입력되게 되어있다.
;ECX는 번역버퍼의 시작주소가 입력되어진다.
;위의 두개 레지스터 이외는 기본적으로 자유롭게 사용해도 상관없다.
;MAIN_PROC는 기본적으로 원문으로부터 번역형 버퍼로 데이터를 옮기게 되어있다.
MAIN_PROC
XOR EAX,EAX
MOV EBX,DWORD PTR DS:[STR_ADDR] ;EBX에는 원문 문장의 시작주소가 들어간다.
MOV ECX,DWORD PTR DS:[TRS_BUFF] ;ECX에는 번역형 버퍼의 시작주소가 들어간다.

LOOP: ;루프의 시작.
;원문문장이 종결(0)될 때까지 계속해 반복한다.
CMP BYTE PTR DS:[EBX],0 ;문장이 종결될 시
JE END_LOOP ;종료 루틴으로 이행
CMP BYTE PTR DS:[EBX],3C ;<(3C)를 처리하는 루틴으로 이행
JE 3C_ROOT
CMP BYTE PTR DS:[EBX],5B ;[(5B)를 처리하는 루틴으로 이행
JE 5B_ROOT
CMP BYTE PTR DS:[EBX],0A ;개행(0A)를 처리하는 루틴으로 이행
JE 0A_ROOT
CMP BYTE PTR DS:[EBX].81 ;마침표(8142)를 처리하기 위한 루틴으로 이행
JE 81_ROOT
MOV AL,BYTE PTR DS:[EBX] ;어디에도 아닐시 원문의 한바이트를 번역 버퍼로 옮긴다.
MOV BYTE PTR DS:[ECX],AL
INC EBX ;다음 원문을 가리킨다.
INC ECX ;다음 번역 포인터를 가리킨다.
MOV DWORD PTR DS:[TRS_LAST_BUFF],ECX ;현재 진행중인 번역 포인터를 세팅하자.
JMP LOOP ;반복 재개.

3C_ROOT:
CMP DWORD PTR DS:[EBX+1],52554259 ;RUBY를 처리하는 루틴으로 이행.
JE RUBY
CMP DWORD PTR DS:[EBX+1],5355423E ;SUB를 처리하는 루틴으로 이행.
JE SUB
CMP BYTE PTR DS:[EBX+1],2F ; / (2F)를 처리하는 루틴으로 이행.
JE 2F
JMP DEFAULT_3C ;이상의 세가지 경우가 아닐경우 모든 < 루틴은
;디폴트 동작하게 되어있다.
2F: ; / (2F) 처리 루틴에서 재차 검증하는 건 하나뿐이다.
CMP DWORD PTR DS:[EBX+2],RUBY ; /RUBY라면 RUBY루틴으로 이행
JE RUBY
JMP DEFAULT_3C ;아니라면 마찬가지로 디폴트 루틴으로 이행한다.

;DEFAULT_3C루틴은 우선 TRS_CPY를 호출 번역버퍼를 번역해 정리 한 뒤
;3E(>)까지의 문장을 그대로 완성형 버퍼에 복사해 넣는다.
DEFAULT_3C:
CALL TRS_CPY ;기존 번역물을 번역후 완성형 버퍼로 조립한다.
MOV EAX,3E ;EAX에 3E 세팅(>)
MOV EDI,EBX ;EDI에 현재 진행중인 문장 주소를 넘긴다.
CALL STR_CPY ;그대로 3E까지 완성형 버퍼로 조립 후에 EBX를 세팅한다.
MOV ECX,DWORD PTR DS:[CMP_BUFF] ;번역형 버퍼는 TRS_CPY에 의해 초기화 되었으니
;ECX를 새로 세팅한다.
JMP LOOP ;루프 재개


;RUBY를 만날시 그대로 번역버퍼로 옮겨버린다. TRS_CPY는 호출하지 않는다.
RUBY:
MOV AL,BYTE PTR DS:[EBX] ;원문의 한바이트를 번역 버퍼로 옮긴다.
MOV BYTE PTR DS:[ECX],AL
INC EBX ;다음 원문을 가리킨다.
INC ECX ;다음 번역 포인터를 가리킨다.
CMP AL,3E ;>(3E)인지를 감별하자
JNE RUBY
MOV ECX,DWORD PTR DS:[CMP_BUFF] ;현재 진행중인 번역 포인터를 세팅하자.
JMP LOOP ;그리고 루프 재개


;우선 TRS_CPY를 호출 후 <SUB>를 완성형 버퍼에 조립한 뒤
;다음 0A까지의 문장을 번역 버퍼로 옮긴 뒤 다시 TRS_CPY를 호출.
SUB:
CALL TRS_CPY
MOV EAX,3E
MOV EDI,EBX
CALL STR_CPY
SUB_LOOP:
MOV AL,BYTE PTR DS:[EBX] ;원문의 한바이트를 번역 버퍼로 옮긴다.
MOV BYTE PTR DS:[ECX],AL
INC EBX ;다음 원문을 가리킨다.
INC ECX ;다음 번역 포인터를 가리킨다.
CMP AL,0A ;개행(0A)인지를 감별하자
JNE SUB_LOOP ;아닐시 반복
CALL TRS_CPY ;버녘[...]
MOV ECX,DWORD PTR DS:[CMP_BUFF] ;현재 진행중인 번역 포인터를 다시 세팅하자.
JMP LOOP ;그리고 루프 재개

;[ ]를 처리하는 루틴이다.
;일반적으로는 [text00000]과 같은 유형의 텍스트가 들어오는 듯 하다.
;우선 TRS_CPY를 호출 번역버퍼를 번역해 정리 한 뒤 5D(])까지의 문장을
;완성형 버퍼에 복사해 넣는다.
5B:
CALL TRS_CPY ;기존 번역물을 번역후 완성형 버퍼로 조립한다.
MOV EAX,5D ;EAX에 3E 세팅(>)
MOV EDI,EBX ;EDI에 현재 진행중인 문장 주소를 넘긴다.
CALL STR_CPY ;그대로 3E까지 완성형 버퍼로 조립 후에 EBX를 세팅한다.
MOV ECX,DWORD PTR DS:[CMP_BUFF] ;번역형 버퍼는 TRS_CPY에 의해 초기화 되었으니
;ECX를 새로 세팅한다.
JMP LOOP ;루프 재개

;문제의 개행 루틴이다. 레알 짜증.
;반드시 체크하자. 0A다음 오는것이 무조건 81 40 혹은 5F5F5F5F5F여야만 한다.
;크게 두가지 루틴이 있다. 라고 해도 둘다 같은 간이 픽스라인 역활을 하겠지.
;개행을 만나게 된다면 새로운 버퍼로 문자를 옮기는데 이때 2바이트를 기준으로 감별해
;1바이트 문자는 개행기준에 넣지 않는다.

0A:
CMP BYTE PTR DS:[EBX+1],0A ;0A다음이 0A인지를 검사
JE 0A_TRS ;맞다면 그대로 문단 루틴으로 이행
CMP WORD PTR DS:[EBX+1],8140
JE LINEFEED_01
CMP DWORD PTR DS:[EBX+1],5F5F5F5F
JE LINEFEED_02
0A_TRS: ;지금 처리중인 문장을 문단으로 인식한다.
CALL TRS_CPY ;그대로 현재 문장을 번역
MOV ECX,DWORD PTR DS:[CMP_LAST_BUFF] ;ECX에 완성형 버퍼의 끝주소를 넣는다.
0A_TRS_LOOP:
MOV AL,BYTE PTR DS:[EBX] ;원문의 한바이트를 완성형 버퍼로 옮긴다.
MOV BYTE PTR DS:[ECX],AL
INC EBX ;다음 원문을 가리킨다.
INC ECX ;다음 번역 포인터를 가리킨다.
CMP AL,0A ;개행(0A)인지를 감별하자
JE 0A_TRS_LOOP ;아닐시 반복
MOV ECX,TRS_BUFF ;ECX를 다시 세팅
JMP LOOP ;그리고 재개
LINEFEED_01:
CMP WORD PTR DS:[EBX-2],8142 ;만약 개행 이전이 마침표 라면.
JNE LINEFEED_01_NEXT ;서브루틴으로 전환하자.
CALL TRS_CPY ;우선 지금 번역버퍼를 처리하고
MOV ECX,CMP_LAST_BUFF ;ECX에는 완성형 버퍼의 끝주소를 넣자.
MOV AH,3 ;AH에 3을 채워넣자.
01_SUB_LOOP:
MOV AL,BYTE PTR DS:[EBX] ;한바이트씩 완성형 버퍼로 문장을 옮긴다.
MOV BYTE PTR DS:[ECX],AL
INC EBX
INC ECX
DEC AH ;한번 옮길때마다 AH는 1씩 떨어지고
CMP AH,0 ;총 3바이트 옮길시 반복문을 탈출한다.
JE 01_SUB_END
JMP 01_SUB_LOOP ;아닐시 그냥 루프 ㅇㅇ
01_SUB_END:
MOV DWORD PTR DS:[CMP_LAST_BUFF],ECX ;진행했던 완성형버퍼 마지막 주소는 다시 세팅되고
MOV ECX,TRS_BUFF ;ECX에는 다시 번역형 버퍼의 시작주소가 세팅
JMP LOOP ;그리고 루프 재개
LINEFEED_01_NEXT:
 XOR EAX,EAX
ADD EBX,3 ;EBX는 개행을 넘어서 다음 문자를 가리킨다.
01_LOOP:
MOV AL,BYTE PTR DS:[EBX] ;원문의 한바이트를 번역 버퍼로 옮긴다.
CMP AL,0A ;지금 처리하는 바이트가 0A면 다음 루틴으로 이행
JE 01_TRS
CMP AL,00 ;지금 처리하는 바이트가 00이면 다음 루틴으로 이행
JE 01_TRS
MOV BYTE PTR DS:[ECX],AL
INC EBX
INC ECX
JMP 01_LOOP ;아닐시 계속 루프
01_TRS: ;여기까지 온다면 개행을 제외한 문장이
;번역버퍼에 남게 된다.
CALL TRS_HOOK ;후킹함수.
;이것으로 현재 번역버퍼에 위치한 문장이 번역된다.
MOV ESI,TRS_BUFF ;ECX로 번역형 버퍼의 시작주소를 세팅
MOV EDI,TMP_BUFF ;EDX로 임시 버퍼 시작주소를 세팅
01_LF_MAIN:
  MOV ECX,19 ;ECX로 개행의 기준이 될 문자수를 세팅
01_BYTE_LOOP:
XOR EAX,EAX ;EAX를 항시 초기화하자.
MOV AL,BYTE PTR DS:[ESI] ;우선 번역문으로부터 한바이트를 가져온다.
CMP AL,81 ;그것을 0x81과 비교하고 크거나 같다면
JGE 01_DOUBLE_BYTE ;그것은 2바이트 문자를 의미한다.
MOV BYTE PTR DS:[EDI],AL ;지금은 1바이트 루틴이므로 문장길이에 영향을
;주지 않는 것으로 판단하고 그대로 복사한다.
CMP AL,0 ;혹시 0을 만난다면
JE 01_LF_END ;종결된 것으로 인식하고 그대로 개행 루프 탈출.
INC ESI
INC EDI
JMP 01_BYTE_LOOP ;내부 루프 재개
01_DOUBLE_BYTE:
MOV AX,WORD PTR DS:[ESI] ;번역문으로부터 2바이트의 문장을 받아온다.
MOV WORD PTR DS:[EDI],AX ;그것을 임시 버퍼로 옮긴다.
ADD ESI,2
ADD EDI,2
DEC ECX ;문장이 하나 넘어갔음을 의미한다.
CMP ECX,0 ;만약 할당량이 다 넘어갔다면
JE 01_LF_INSERT ;개행 삽입 루틴으로 이행한다.
JMP 01_BYTE_LOOP ;내부 루프 재개
01_LF_INSERT: ;개행 삽입 루트.
;현재 0A 81 40에 관한 것이므로 0A 81 40만을
;삽입한다.
MOV BYTE PTR DS:[EDI],0A
MOV BYTE PTR DS:[EDI+1],81
MOV BYTE PTR DS:[EDI+2],40
ADD EDI,3
JMP 01_LF_MAIN ;끝났으면 루프 재개


LINEFEED_02
CMP WORD PTR DS:[EBX-2],8142 ;만약 개행 이전이 마침표 라면.
JNE LINEFEED_01_NEXT ;서브루틴으로 전환하자.
CALL TRS_CPY ;우선 지금 번역버퍼를 처리하고
MOV ECX,CMP_LAST_BUFF ;ECX에는 완성형 버퍼의 끝주소를 넣자.
MOV AH,6 ;AH에 6을 채워넣자.
02_SUB_LOOP:
MOV AL,BYTE PTR DS:[EBX] ;한바이트씩 완성형 버퍼로 문장을 옮긴다.
MOV BYTE PTR DS:[ECX],AL
INC EBX
INC ECX
DEC AH ;한번 옮길때마다 AH는 1씩 떨어지고
CMP AH,0 ;총 6바이트 옮길시 반복문을 탈출한다.
JE 02_SUB_END
JMP 02_SUB_LOOP ;아닐시 그냥 루프 ㅇㅇ
02_SUB_END:
MOV DWORD PTR DS:[CMP_LAST_BUFF],ECX ;진행했던 완성형버퍼 마지막 주소는 다시 세팅되고
MOV ECX,TRS_BUFF ;ECX에는 다시 번역형 버퍼의 시작주소가 세팅
JMP LOOP ;그리고 루프 재개
LINEFEED_01_NEXT:
XOR EAX,EAX
ADD EBX,3 ;EBX는 개행을 넘어서 다음 문자를 가리킨다.
02_LOOP:
MOV AL,BYTE PTR DS:[EBX] ;원문의 한바이트를 번역 버퍼로 옮긴다.
CMP AL,0A ;지금 처리하는 바이트가 0A면 다음 루틴으로 이행
JE 01_TRS
CMP AL,00 ;지금 처리하는 바이트가 00이면 다음 루틴으로 이행
JE 01_TRS
MOV BYTE PTR DS:[ECX],AL
INC EBX
INC ECX
JMP 01_LOOP ;아닐시 계속 루프
02_TRS: ;여기까지 온다면 개행을 제외한 문장이
;번역버퍼에 남게 된다.
CALL TRS_HOOK ;후킹함수.
;이것으로 현재 번역버퍼에 위치한 문장이 번역된다.
MOV ESI,TRS_BUFF ;ECX로 번역형 버퍼의 시작주소를 세팅
MOV EDI,TMP_BUFF ;EDX로 임시 버퍼 시작주소를 세팅
02_LF_MAIN:
MOV ECX,19 ;ECX로 개행의 기준이 될 문자수를 세팅
02_BYTE_LOOP:
XOR EAX,EAX ;EAX를 항시 초기화하자.
MOV AL,BYTE PTR DS:[ESI] ;우선 번역문으로부터 한바이트를 가져온다.
CMP AL,81 ;그것을 0x81과 비교하고 크거나 같다면
JGE 02_DOUBLE_BYTE ;그것은 2바이트 문자를 의미한다.
MOV BYTE PTR DS:[EDI],AL ;지금은 1바이트 루틴이므로 문장길이에 영향을
;주지 않는 것으로 판단하고 그대로 복사한다.
CMP AL,0 ;혹시 0을 만난다면
JE 02_LF_END ;종결된 것으로 인식하고 그대로 개행 루프 탈출.
INC ESI
INC EDI
JMP 02_BYTE_LOOP ;내부 루프 재개
02_DOUBLE_BYTE:
MOV AX,WORD PTR DS:[ESI] ;번역문으로부터 2바이트의 문장을 받아온다.
MOV WORD PTR DS:[EDI],AX ;그것을 임시 버퍼로 옮긴다.
ADD ESI,2
ADD EDI,2
DEC ECX ;문장이 하나 넘어갔음을 의미한다.
CMP ECX,0 ;만약 할당량이 다 넘어갔다면
JE 02_LF_INSERT ;개행 삽입 루틴으로 이행한다.
JMP 02_BYTE_LOOP ;내부 루프 재개
02_LF_INSERT: ;개행 삽입 루트.
;현재 0A 5F 5F 5F 5F 5F에 관한 것이므로
;0A 5F 5F 5F 5F 5F만을 삽입한다.
MOV BYTE PTR DS:[EDI],0A
MOV BYTE PTR DS:[EDI+1],5F
MOV DWORD PTR DS:[EDI+2],5F5F5F5F
ADD EDI,6
JMP 02_LF_MAIN ;끝났으면 루프 재개

LF_END ;0을만나 문장이 종결된 것을 의미한다.
MOV AL,BYTE PTR DS:[EBX] ;현재 EBX가 가리키는 0A 혹은 00을 AL로
MOV BYTE PTR DS:[EDI],AL ;AL은 다시 EDI가 가리키는 임시 버퍼의 끝을 가리킨다.
MOV EDI,TMP_BUFF ;EDI에는 임시버퍼의 시작주소가 들어간다.
MOV ECX,0 ;ECX에는 0이 들어간다.
INC EBX
PUSH EBX
CALL STR_CPY
POP EBX
MOV AL,BYTE PTR DS:[EBX]
CMP AL,0
JE END_LOOP
MOV ECX,DWORD PTR DS:[CMP_BUFF]
MOV DWORD PTR DS:[ECX],0
MOV DWORD PTR DS:[CMP_LAST_BUFF],ECX
JMP LOOP



;81 42 통칭 마침표.
;마침표를 만날 시 그대로 TRS_CPY함수 호출. 그리고 만난
;마침표를 버퍼로 복사. 조립한다.
81:
CMP WORD PTR DS:[EBX],8142
JE 8142
MOV AL,BYTE PTR DS:[EBX] ;원문의 한바이트를 번역 버퍼로 옮긴다.
MOV BYTE PTR DS:[ECX],AL
INC EBX ;다음 원문을 가리킨다.
INC ECX ;다음 번역 포인터를 가리킨다.
MOV DWORD PTR DS:[TRS_LAST_BUFF],ECX ;그리고 진행사항도 저장하자.
JMP LOOP ;이러나저러나 재개
8142:
MOV AX,WORD PTR DS:[EBX] ;진행중인 포인터는 8142를 가리키고 있다.
MOV WORD PTR DS:[ECX],AX ;이것을 번역형 버퍼로 옮긴다.
ADD EBX,2 ;그리고 EBX는 2 증가. 다음 문자를 가리키게된다.
CALL TRS_CPY ;그대로 번역
MOV ECX,DWORD PTR DS:[CMP_BUFF] ;ECX는 처음부터 시작한다[...]
JMP LOOP ;다시 재개 ㅡㅡㅋ



END_LOOP: ;종료 루틴
CALL TRS_CPY ;만약을 위해 번역버퍼를 번역후 복사
RETN



;원래의 구조체를 완성형 버퍼를 참조하도록 변조한다.
PNT_SET
MOV EAX,DWORD PTR DS:[BASE_ADDR] ;원래의 문장 포인터를 얻는다.
MOV ECX,DWORD PTR DS:[CMP_BUFF] ;ECX에는 완성형 버퍼의 시작 주소가 들어간다.
MOV DWORD PTR DS:[EAX],ECX ;시작주소가 문장포인터에 그대로 덮어씌어진다.
MOV ECX,DWORD PTR DS:[CMP_BUFF_LANG] ;완성형 버퍼의 크기를 ECX에 넣는다.
MOV DWORD PTR DS:[EAX+10],ECX ;본래의 길이로 덮어씌어버린다.
MOV DWORD PTR DS:[EAX+14],0xFFFFF ;최대 버퍼 크기를 0xFFFFF로 세팅해버린다.
;설마 이보다 크진 않겠지 -_-;
RETN

---------------------------------------------------

여기까지 온 당신을 위해[...]

슈타인즈 게이트 개조 작업...거의 끝나갑니다.

아 힘드네요. 이짓도 이제 슬슬 관둘땐가. -_-....

물론 작동은 안될겁니다[...]

오랜만에 해서 그런지 막 틀린 곳도 있고 엉킨곳도 있지만[...]

이걸로 대충 흐름은 잡았으니 내일 다시 하면 제대로 될겁니다 ㅡㅡㅋ