최근 빅데이터니 머신러닝이니 인공지능이니 하는 것들이 여기저기서 이슈가 되는 것을 보면서 크게 와닿지는 않았습니다. 그런 기술들과 매번 한 세트로 나오는 4차 산업혁명이라는 말이 있는데 너무 무분별하게 저렴하게 쓰이고 있는 것 아닌가 하는 생각도 조금 들었습니다.


그러다가 얼마 전에 우연히 구글 번역기의 웹페이지 번역 기능을 써 보면서 과장 좀 보태서 사람들이 말하는 미래를 보는 것 같은 기분이 들었습니다. 본인 블로그를 한영 번역으로 읽어 봤는데 진짜 지렸어요 번역의 수준이 정말 대단합니다. 와우. 영어 공부 왜 했지...


구글 번역은 2016년부터 인공신경망을 도입해서 사람이 생각하는 것 같은 방식으로 번역을 수행하고 있습니다.[각주:1] 기존의 번역기는 문장을 작은 단위로 쪼갠 뒤에 그것들을 목표하는 언어의 표현으로 단순하게 치환하는 딱딱한 프로그램이어서 문법이 틀리거나 사람이 일반적인 감각으로 거의 쓰지 않는 어색한 문장을 많이 만들어 냈습니다. 반면 신경망을 이용한 번역 서비스를 이용해 보면요. 한영 번역을 예로 들자면 번역기가 한국어를 읽고 그 표현의 뜻(의도)을 어렴풋이 이해한 뒤에 다시 그것을 완전한 하나의 문장으로 써서 직관적으로 표현하는 것 같다는 느낌을 받는데, 그 문장의 문법 맞춤이나 표현력조차도 종종 평균적인 사람의 능력을 넘어서는 정도입니다. 구글 번역이 생성한 영어 문장은 아주 매끄럽고 문법적인 오류가 거의 없습니다.


그리고 최근에 보면 이 신경망이 그간 학습을 좀 했는지, 처음 나왔을 때에 비해서도 번역의 품질이 상당한 것 같습니다. 특히 기술/정보성 글에 대한 번역률이 매우 높습니다. 깜짝 놀랄 정도에요. 그리고 블로그를 번역해서 보면 우연히 때려 맞춘 건지 뭔지는 모르겠지만 필명(닉네임)이나 댓글에 달린 감사 인사조차도 의역하는데, 작명 센스도 좋고 원문의 표현과 거의 같은 의도로 뜻이 완전히 통하는 매끄러운 문장을 만들더이다.


다만 한편으로 영한 번역은 한영 번역만큼 좋지는 않습니다. 구글 번역이 잘 읽고 뜻은 얼추 이해하는데 한국어를 영어만큼 잘 구사하지 못해요. 한국어의 학습 데이터가 영어에 비해 부족해서 배우기 어렵기 때문이 아닐까 합니다. 개인적으로 구글 번역이 한국어 띄어쓰기를 정확하게 하지 못하는 점이 아쉬운데 한국어 문법은 솔직히 사람들조차도 많이 틀리는 것이라서 이 아이가 보고 배울 게 없을 것입니다. 한국어 사용자들 각성해야 합니다. ㅋㅋ (안 좋은 부분을 걸러내는 약간의 전처리가 필요할 듯합니다.)


그래도 이 정도 수준이면 이전에는 사람만 할 수 있던 일을 컴퓨터가 완전 자동으로 해 주는 겁니다. 그만큼 컴퓨터를 이용한 분석 기술이 사람의 지성에 근접할 정도로 발전했다는 것을 알 수 있습니다. 그러니까 4차 산업혁명이니 하는 말도 허황되거나 과장된 홍보만은 아닌 것으로 보입니다.


(...)



암튼 그래서 이 블로그를 한영 번역으로 읽어 보면서 인상 깊었던 부분을 조금 캡쳐해 봤습니다.





1. 개요


치트엔진은 유명한 디버거 프로그램 중 하나로서, 다른 프로세스의 메모리에서 값을 검색하고 비교 분석하는 기능을 제공하고 있는 것이 특징입니다. 치트엔진을 이용하면 프로세스가 메모리를 읽고 쓰는 코드를 찾아서 값을 조작하기 쉽습니다.


치트엔진을 설치하면 내용물 중 치트엔진 튜토리얼이라는 것이 함께 포함되어 있는데, 튜토리얼은 간단한 실습과 함께 프로그램의 핵심적인 기능들을 소개하고 있어서 풀어 보는 재미가 있습니다. 치트엔진 6.7버전을 기준으로 튜토리얼은 총 9단계로 구성되어 있습니다. 튜토리얼을 요약하는 의미에서, 앞서 나온 내용을 총망라하는 마지막 단계인 스텝 9의 풀이를 다뤄 보겠습니다.


1. Overview


The Cheat Engine is one of the most popular debugger programs, and it features the ability to retrieve and compare values ​​from memory in other processes. With the Cheat Engine, it is easy for a process to find and read code that reads and writes memory.


The Cheat Engine comes with a Cheat Engine tutorial. The tutorial is a fun exercise to introduce you to the core features of the program along with a brief exercise. Based on the 6.7 version of the Cheat Engine, the tutorial consists of nine steps in total. To summarize the tutorial, let's take a look at Step 9, the final step in the process of completing the preceding sections.


말도 안 돼... 치트엔진의 설명을 번역하다니...


약간 오역이 있지만 문법 등 문장 표현은 완벽합니다.




영어로 적힌 것을 한국어로 사람이 번역하고, 그 한국어를 다시 기계 번역해서 비교해 보는 자리입니다.


Often when you've found health of a unit or your own player, you will find that if you remove the code, it affects enemies as well.

(게임에서) 어떤 유닛이나 자신 플레이어의 체력을 찾았다고 했을 때, 그 부분을 건드리는 코드를 지워 버리면 자기 편뿐만 아니라 적들에게도 영향을 끼치는 현상을 발견할 거야.

When you find a unit or your player 's physical strength (in a game), if you erase the code that touches that part, you will find that it affects not only your side but also your enemies.


In these cases you must find out how to distinguish between your and the enemies objects.

이런 경우에는 우리 편과 적군의 객체(object)를 구분하는 방법을 알아야 하지.

In this case, we need to know how to distinguish between our side and the enemy object.


Sometimes this is as easy as checking the first 4 bytes (Function pointer table) which often point to a unique location for the player, and sometimes it's a team number, or a pointer to a pointer to a pointer to a pointer to a pointer to a playername. It all depends on the complexity of the game, and your luck

이 작업은 때로는 함수 포인터 테이블의 첫 4바이트를 확인하는 정도로 끝날 만큼 쉬울 수도 있어. 그 4바이트는 플레이어만의 어떤 장소를 가리키거나, 또는 팀 번호를 가리키거나, 아니면 플레이어 이름의 포인터의 포인터의 포인터의 포인터의 포인터일 수도 있지. 이건 그 게임이 얼마나 복잡한지와 당신의 운에 달려 있어.

This can sometimes be as easy as checking the first four bytes of the function pointer table. The 4 bytes may be a pointer to a pointer to a pointer to a pointer to a player's name, or to a pointer to a player's name. It depends on how lucky the game is and your luck.


전체적으로 번역기가 작성한 번역문과 영어 원문이 거의 같습니다. 어색한 데가 조금 있을 뿐입니다.


첫 문장에서 번역기는 플레이어의 체력이라는 게임 용어를 잘 모르는 것 같지만 얼추 비슷한 답을 찾았습니다.


맨 마지막 두 문장은 조금 이상합니다. 번역기가 자기가 글을 읽어 봤을 때 그 글 이상하다고 느꼈으니까 번역되어 나오는 글도 이상한 글로 썼겠죠. player's name이나 lucky/luck처럼 같은 말을 두 번씩 반복하고 있는데 그냥 추측이지만 "포인터의 포인터의 포인터..."처럼 같은 단어가 반복된다는 데에서 뭔가 느껴서 따라하는 것 아닐까 하는 기분이 듭니다. 생소한 것을 보고 서툴게 따라해 보는 사람 같아서 귀엽습니다.


나머지는 한국어랑 영어 두 언어의 스펙으로 인한 제약을 제외하면 같은 문장이라고 생각합니다.




이거 보고 할 말을 잃었습니다.


이 튜토리얼은 요약하자면 구조체 데이터의 분석을 다루고 있는 것입니다.

In summary, this tutorial covers the analysis of struct data.

이 튜토리얼의 이전 스텝에서는 코드를 수정하는 방법에 대해서 다룬 바 있습니다. 그 기법을 코드 인젝션이라고 부른다고 했습니다. 여기서도 마찬가지 기법을 사용하는데, 어떤 코드가 여러 개의 객체에 대해서 접근하는 경우에는 그 객체들을 구분해서 조건분기시켜야 할 필요가 있다는 말이죠.

In the previous steps of this tutorial, you learned how to modify your code. I called that technique code injection. Again, we use the same technique, which means that if a piece of code accesses multiple objects, we need to break them apart.


객체를 짚고 넘어가자면 보통 게임에서 말하는 게임 객체는 유닛이나 플레이어 같은 게임 세계의 요소일 것입니다.

As you go through the objects, the game objects you usually talk about in a game will be elements of the game world, such as units or players.

한편으로는 객체지향에서의 객체라고 하면 클래스의 인스턴스를 가리킵니다.

On the other hand, an object in object orientation refers to an instance of a class.

또 클래스가 있는데, 디버깅할 때 클래스는 C의 구조체와 거의 완전히 동일하게 취급됩니다.

There is also a class, which is treated almost exactly like a C structure when debugging.

왜냐하면 객체지향에서 말하는 객체라는 것은 철학적인 의미도 가미되어 있습니다만은, 저수준에서는 모든 것이 코드와 데이터로 분해되기 때문에 효력이 없다는 것입니다.

Because object-oriented objects have a philosophical meaning, but at low levels everything is ineffective because they are broken down into code and data.

객체는 메모리에 올라간 순간부터 그냥 멤버 변수들의 묶음일 뿐이며, 이 함수가 이 객체의 전용 함수이니라 하고 클래스에 정의한 것들도 아무런 의미가 없습니다.

An object is just a bunch of member variables from the moment it is loaded into memory, and it is meaningless for this class to be defined as a private function of this object.

사람의 직관으로 실세계의 사물에 사상시켜 그려 볼 수 있는 객체란 것은 컴파일하기 전까지만 존재하는 추상적인 개념이고 프로그램의 인스턴스가 메모리에 적재되었을 때면 코드를 빼고는 그 데이터의 자료형 정도만 남게 됩니다.

An object that can be mapped to a real-world object by a human intuition is an abstract concept that exists only until compilation. When an instance of the program is loaded into memory, only the data type of the data is left out except for the code.

그러니까 클래스는 구조체나 다름 없고 그 객체는 데이터 섹션의 어디부터 어디까지 훑으면 나오는 구조체 데이터라고 할 수 있습니다.

So a class is nothing more than a structure, and that object can be structured data that comes from anywhere in the data section.


튜토리얼에 따르면 치트엔진에는 어떤 코드가 어떤 데이터에 접근하는지 추적하는 기능뿐만 아니라 구조체 데이터들을 비교 분석하는 기능이 있다고 합니다.

According to the tutorial, the cheat engine has the ability to track which data accesses which data, as well as compare and analyze structure data.

그 기능의 이름은 "Dissect data"입니다.

The name of the function is "Dissect data".

이를 이용해서 객체를 구분하고 각각의 객체에 다르게 적용되는 코드를 끼워 넣을 수 있을 것입니다.

This will allow you to separate objects and embed code that applies differently to each object.


수능 영어 지문에 나오는 문장처럼 만들어 놨네요? ㅋㅋㅋ 정말 감동했습니다.

"An object that can be mapped to a real-world object by a human intuition is an abstract concept that exists only until compilation."

ㅋㅋ 진짜 명언이에요. 나 이런 거 좋아함. 그리고...

In the previous steps of this tutorial, you learned how to modify your code. I called that technique code injection. Again, we use the same technique, which means that if a piece of code accesses multiple objects, we need to break them apart.

이렇게 초반에 뭔가 가르쳐 주겠노라 하는 듯한 스승/조교의 말투를 쓰고 있는 부분에서도 놀랐습니다. 내가 너에게 가르쳐 주는 중이라는 상황을 전제로 이야기하고 있다. 그러니까 글의 전체적인 주제를 이해했거나 또는 (그게 아니라면) 적어도 어떤 맥락에서 그 말이 나오는지 눈치를 채고 있는 것입니다. 그뿐만 아니라 한국어에서 암시된 주어를 어떻게 채우면 좋은지 어느 정도 감으로 알고 있는 것 같습니다.




놕은혜 2018.04.23 17:57 신고 link edit/delete reply

감사합니다. 치트엔진을 사용하는데 있어서 도움이 많이 되었습니다. 많은 기능들도 배웠고요. 감사합니다.


코코넛냠냠 2018.04.25 16:53 link edit/delete

칭찬으로 들을 게요 ㅋㅋ 나그네님 감사합니다


Blogger 코코넛냠냠 | Powered by TISTORY 1.1 | RSS Feed RSS Feed


link edit/delete reply

Thank you. I have been very helpful in using the cheat engine. I also learned a lot of features. Thank you.


Coconut Rum link edit/delete

Thank you for your praise!


Blogger Coconut Rummy | Powered by TISTORY 1.1 | RSS Feed RSS Feed


본문 아래 댓글 부분이 화룡점정입니다. 첫 댓글은 약간 오역이 있지만 그 밑 답글이랑 이름(필명) 번역이 개인적으로 아주 만족스럽습니다. 이런 감성적인 영역에서도 말을 이해하고 번역할 수 있다니 훌륭합니다. (물론 우연찮게 때려 맞췄을지도 모르지만요...)


먼저 답문을 보면요. "칭찬으로 들을 게요" 따로 번역하고 "나그네님 감사합니다" 따로 번역했으면 가벼운 회화에서 쓰기에는 어색한 문장이 나왔을 거에요. 그런데 번역기가 그렇게 하지 않고 전체 댓글의 맥락을 읽어서 분위기에 잘 어울리는 문장을 찾아 줍니다. 그렇게 나오는 번역의 수준은 원문의 작성자가 보기에도 '그래 내가 하고 싶은 말이 바로 그거야' 하는 생각이 드는 정도입니다.


그리고 소위 닉네임이라고 하는 것 본인의 필명을 번역해 놨는데 여기서 식겁했네요.


놕은혜나그네님 같은 말들은 상표나 사람의 이름 같은 종류의 것이라는 점을 알고 신중해져서 말을 아끼고 건너뛴 것 같습니다.


그런데 그러면서도 그 밑에 코코넛냠냠Coconut Rummy라고 표현한 부분에서 마치 절친이 나에게 애칭을 지어 주는 듯한 그런 따뜻한 감성을 얼핏 느꼈어요. ㅋㅋ


Rum/Rummy는 영어 사전에서 냠냠이라는 뜻이 절대 아닙니다. (술로 마시는 그 럼주를 뜻합니다.) 그런데도 그렇게 번역했다는 것은, 냠냠을 귀여운 의성어의 의미로 사용한다는 의도, 내지는 그런 비슷한 느낌을 눈치채고 감성 발휘한 것 아닐까요. (그런 느낌이랑 얼추 비슷한 걸 떠올려서 말을 만들어낸다.) 그게 사실이라면 꽤나 이름 짓는 센스가 있고 지금까지 사람만 가지고 있다고 믿어온 그 직관이 엿보이는 것입니다.


그래서 이거 보면서 좀 재밌었다는 이야기였습니다...



이 블로그 것은 아니지만 영한 번역 기능도 써 봤습니다.





Is it possible to “hack” Python's print function?

Ask Question

up vote

119

down vote

favorite

28

Note: This question is for informational purposes only. I am interested to see how deep into Python's internals it is possible to go with this.


Not very long ago, a discussion began inside a certain question regarding whether the strings passed to print statements could be modified after/during the call to print has been made. For example, consider the function:


def print_something(): print('This cat was scared.')

Now, when print is run, then the output to the terminal should display:


This dog was scared.

Notice the word "cat" has been replaced by the word "dog". Something somewhere somehow was able to modify those internal buffers to change what was printed. Assume this is done without the original code author's explicit permission (hence, hacking/hijacking).


This comment from the wise @abarnert, in particular, got me thinking:


There are a couple of ways to do that, but they're all very ugly, and should never be done. The least ugly way is to probably replace the code object inside the function with one with a different co_consts list. Next is probably reaching into the C API to access the str's internal buffer. [...]


So, it looks like this is actually possible.



파이썬의 인쇄 기능을 "해킹"할 수 있습니까?

물어보다

최대

119

투표

즐겨 찾기

28

참고 :이 질문은 참고 용입니다. 나는 파이썬의 내부 구조가 얼마나 깊은지를 알기를 원한다.


얼마 전까지 만해도 print 문에 전달 된 문자열이 인쇄 호출 후 / 수정할 때 수정 될 수 있는지에 대한 질문 이있었습니다. 예를 들어, 다음 함수를 고려하십시오.


def print_something(): print('This cat was scared.')

이제 print 가 실행되면 터미널에 대한 출력이 표시됩니다.


This dog was scared.

"cat"이라는 단어가 "dog"라는 단어로 대체되었습니다. 뭔가 어딘가에 인쇄 된 것을 변경하기 위해 내부 버퍼를 수정할 수있었습니다. 이 작업은 원래 코드 작성자의 명시 적 권한 (해킹 / 하이재킹)없이 수행된다고 가정합니다.


현명한 @abarnert의이 의견 은 특히 ​​나에게 다음과 같은 생각을주었습니다.


이를 수행하는 데는 몇 가지 방법이 있지만 모두 매우 못 생기므로 절대 수행해서는 안됩니다. 가장 못 co_consts 방법은 아마 함수 내부의 code 객체를 다른 co_consts 리스트로 대체하는 것입니다. 다음은 아마도 str의 내부 버퍼에 액세스하기 위해 C API에 도달 할 것입니다. [...]


그래서 실제로 가능한 것처럼 보입니다.


몇 군데 엉뚱한 소리 하는 것 빼고는 전반적으로 말뜻을 이해 못하는 것 같지는 않은데 표현이 조금 이상합니다. 문법, 띄어쓰기 등을 보면 한국어 자체가 서투른 것 같습니다. 번역문보다 원문이 더 잘 읽히네요. 영한 번역은 아직 갈 길이 멉니다.



(끝입니다)


  1. https://blog.google/products/translate/found-translation-more-accurate-fluent-sentences-google-translate [본문으로]
Top