가령 모듈 3가지가
DumpText,
FixLine,
EzTransXP
요렇게 있다고 가정할때
var c0_EzTransXP = new EzTransXP("NoSpace");
var c0_DumpText = new DumpText("KOut,KHex,KHex16");
var c0_FixLine = new FixLine("/ATData/c0.dat");
c0_DumpText.setNext(c0_EzTransXP);//DumpText 이후에 EzTransXP 사용
c0_FixLine.setNext(c0_DumpText);//FixLine다음에 DumpText
SetContext("C0",c0_FixLine);//별명 C0로 컨텍스트 엔진에 추가
이런식으로 썼을때 가령
어떤 텍스트를 번역하고 싶다면
var TrText = GetContext("C0").Translate("원하는 텍스트");
으로 쓸수도 있구요.
만약 직접 자바스크립트로 구동하는 녀석을 짜고 싶다면,
var c1_MyDouble = new Context(function(text){
var TrText = this.getNext().Translate(text);
return TrText + TrText; //2배!
});
요렇게 해서
직접 쓸거면
c1_MyDouble.Translate("번역할것"); 하거나
SetContext("DoubleType",c1_MyDouble); 요렇게 등록해서 쓰거나요,
특이 개념으로
var Hook1 = new Hook(function(){
var Mem = this.ReadMemory("[EAX]+0x40",100,function(chunk){
for(var i=0;i<chunk.length();i++){
if(chunk[i]==0){
return i;
}
}
return -1;
});
var Text = ToText(Mem,-1);
var MsgBox = GetDLL("User32.dll").GetFunc("MessageBoxW");
MsgBox(0,"!!!","Before : "+Text,0);
var TrText = GetContext("C0").Translate(Text);
MsgBox(0,"!!!","Before : "+Text,0);
var Data = ToData(TrText,-1);
this.WriteMemory("[EAX]+0x40",Data,-1);
});
SetHook(null,"0x1000",Hook1);
이렇게 만들어볼 수도 있지 않을까 싶어요
아랄
- 2011.04.23
- 00:41:49
var c0_EzTransXP = new EzTransXP("NoSpace");
var c0_DumpText = new DumpText("KOut,KHex,KHex16");
var c0_FixLine = new FixLine("/ATData/c0.dat");
c0_DumpText.setNext(c0_EzTransXP);//DumpText 이후에 EzTransXP 사용
c0_FixLine.setNext(c0_DumpText);//FixLine다음에 DumpText
SetContext("C0",c0_FixLine);//별명 C0로 컨텍스트 엔진에 추가
// 네, 좋은 방법이네요. v8엔진을 들여다보지 못해 잘 모르겠습니다만
// EzTransXP, DumpText 같은 식별자는 아랄트랜스 코어모듈이 플러그인을 로드할 때 자동으로 선언/정의 하도록 동작해야 겠군요.
var TrText = GetContext("C0").Translate("원하는 텍스트");
// 스고이! 간단하고 명료합니다!
var c1_MyDouble = new Context(function(text){
var TrText = this.getNext().Translate(text);
return TrText + TrText; //2배!
});
// 역시 간단하고 명료합니다!
// 체인 상에 있는 다음 변환함수를 호출하는 룰을 정해 놓는다면
// preTranslate, postTranslate 들이 따로 존재할 필요가 없어지네요
c1_MyDouble.Translate("번역할것"); 하거나
SetContext("DoubleType",c1_MyDouble); 요렇게 등록해서 쓰거나요,
// 네, 한가지 걱정되는 점은 코드파인더들을 위해 컨텍스트, 모듈 같은 용어들을 다시 정리해야 할 것 같아요.
// 위의 컨셉대로라면 new EzTransXP("NoSpace") 이 한문장은 단순한 모듈객체 생성이 아닌 하나의 컨텍스트 생성이니까요.
// 그래서 컨텍스트 끼리는 체인을 형성할 수도 있고.. 단, 짤 때 순환참조 체인 형성은 주의해야 겠군요.
var Hook1 = new Hook(function(){
var Mem = this.ReadMemory("[EAX]+0x40",100,function(chunk){
for(var i=0;i<chunk.length();i++){
if(chunk[i]==0){
return i;
}
}
return -1;
});
var Text = ToText(Mem,-1);
var MsgBox = GetDLL("User32.dll").GetFunc("MessageBoxW");
MsgBox(0,"!!!","Before : "+Text,0);
var TrText = GetContext("C0").Translate(Text);
MsgBox(0,"!!!","Before : "+Text,0);
var Data = ToData(TrText,-1);
this.WriteMemory("[EAX]+0x40",Data,-1);
});
SetHook(null,"0x1000",Hook1);
// "[EAX]+0x40" 에서 [EAX]는 다른 변수명으로 치환 후 eval 같은 함수를 사용하여 최종 정수 값을 구하는 건가요?
// 그냥 흥미롭고 궁금해서요 ^^;
// 그리고 네이티브 dll 프로시져를 호출하는 부분도 상당히 재밌네요!
// 인자 갯수 잘못주면 재앙이 일어날 수도ㅎㅎ
// 암튼 이래저래 굿입니다 히데님 짱짱~, 저는 대찬성~ =ㅁ=b
따로 GetContext, SetContext를 마련해 두는 이유는
각 경우에 따라 다른 플러그인을 사용하는 플러그인이 있을 경우 (FixLine이 유력)
단순히 getNext()로는 충분하지 않기 때문에 그냥 이 플러그인을 해당 Context의 마지막으로 두고
그 플러그인이 번역시에는
GetContext("지정해둔 이름")을 통해 다른 컨텍스트를 불러오기 위해서입니다.