2월 10, 2022

리버스 엔지니어링 동글 보호 소프트웨어

나는 어렸을,인터넷은 이제 막 시작하고 우리는 무료로 소프트웨어의 톤을 얻을 수 있습니다. 그것은이었다 무료 누군가가 거기에 있기 때문에”종류”균열 충분히/패치.파일.

나는 어렸을 때 내가 가진 견해 였기 때문에 따옴표 사이에”종류”를 넣었습니다. 이제 저는 소프트웨어 엔지니어이며 소프트웨어를 구축하는 데 얼마나 많은 노력이 필요한지 알고 있습니다. 그래서,금이 소프트웨어를 다운로드하지 마십시오. 개발자를 지원하고 라이센스를 구입!

그런 균열을 적용하고,엑스를 패치하면서,나는 항상 그런 일을하는 방법을 알고 싶었다. 그것은 당신이 어셈블러,당신의 중앙 처리 장치 만 이해하는 기계 언어(그리고 다른 바보들)를 이해할 필요가 있음이 밝혀졌습니다. 너무 어려웠다으로,나는 그것을 학습 주위에 없었어. 최근까지(20 년 후처럼 20 년 후).

사진:패트릭 헨 드리 에 언 스플래시

1 년 전,나는 소프트웨어를 샀다(라이센스!)이 작동하려면 동글이 필요합니다. 그것은 모든 시간에 당신과 함께 그 동글을 가지고 정말 성가신. 특히 당신이 도로에있을 때. 그래서 나는 그 주위에 방법을 찾았다. 내가 처음 만난 것은 멀티 키라는이 키 에뮬레이터였습니다. 그것은 당신의 레지스트리에 동글의 메모리를 덤프하고 레지스트리에서 읽어 동글을 에뮬레이트합니다. 나는 윈도우 10 에서 실행하고 싶어 할 때까지 즉,확인을했다. 분명히,마이크로 소프트는 멀티 키의 그런 큰 팬이 아니다. 실제로는 서명되지 않은 드라이버의 큰 팬이 아니다 및 멀티 키는 서명되지 않은 드라이버를 사용합니다. 그래서 다른 해결책이 필요했습니다. 어셈블리 코드라는 것에 뛰어들 시간!

나는 리버스 엔지니어링을위한 도구가 있다는 것을 항상 알고있었습니다. 그것은 당신의 디 컴파일 할 수 있습니다.파일 및 무슨 일이 일어나고 있는지 보여줍니다. 불행하게도,인터페이스는 이해하기 정말 어렵다. 저도 올리버에 대해 알고 있었습니다. 그것은 디버거입니다. 디버거는 프로그램이 실행되는 동안 어셈블러 코드를 단계별로 할 수 있습니다! 당신이 계산기 응용 프로그램을 디버깅한다면,예를 들어,의미,당신은 실제로,버튼 누름을 처리 계산을 수행하고 화면에 결과를 보여주는 볼 수 있습니다. 지옥,당신은 심지어 2+2 가 무엇인지 물을 때 계산기 반환 5 를 만드는 메모리를 변경하고 변경할 수 있습니다!

그러나 나는 미적분을 바꾸기 위해 여기에 있지 않습니다(멋지 겠지만). 나는 동글에서 벗어나고 싶다. 그래서 나는 올리드와 함께 내 앱을 열었습니다.

그 결과,그 결과는 매우 인상적이었습니다. 나는이 모든 코드가 무엇을 의미하는지 전혀 몰랐다. 어디서부터 시작해야할지 혼자 보자. 그래서 나는 드로잉 보드로 돌아 갔다. 레덱이란 것이 있다는 것이 밝혀졌습니다. 그것은 나에게 그것을 설정하고 디 컴파일을 실행하는 데 시간이 걸렸습니다,하지만 노력은 지불. 결과는 거대했다.반 읽기 가능한 코드가있는 2 백만 줄 이상의 코드.

사실 동글의 바이트를 읽는 코드를 상당히 쉽게 찾을 수 있습니다:

레덱 출력:이미 변수 이름의 일부를 더 읽기 쉬운 것으로 변경했습니다.

이 정보를 사용하여 디버거로 돌아 왔습니다. 2013 년 이후 업데이트되지 않았습니다. 그래서 나는이 새로운 향상된 디버거를 발견했다. 그것은 오픈 소스 그리고 작업 개발자의 큰 커뮤니티가 있습니다.

기계어 읽기

기계어에서는 모든 명령어에 메모리 주소가 있습니다. 그래서 레덱 코드에서 발견 된 주소로,나는 동글을 읽는 코드를 보라:

동글 메모리의 2 바이트를 읽는 어셈블러 코드.

어셈블리 코드에서 함수의 인수는 스택 포인터를 사용하여 메모리에로드됩니다. 우리의 코드에서 이것은 함수를 호출하기 직전에 발생합니다. (3 개의 동작 지침은 호출이 3 개의 인수를 취함을 나타냅니다). 호출 후 스택 포인터가 재설정되고 함수 호출이 성공한 경우 검사(테스트)가 수행됩니다. 그렇지 않은 경우,우리는 점프(일본)를 만드는 코드를 참조하십시오. 이 점프는 동글이 없음을 나타내는 코드 조각을 가리 킵니다.

당신이 볼 수 있듯이,특정 함수에 대한 호출이 동글을 읽을 수 있습니다. 이 기능이 무엇을하는지 알아 내기 위해 참조 가이드를 찾아 보았습니다:

이 함수는 동글에서 2 바이트의 메모리(단어)를 읽습니다. 짐작대로,이 함수는 마지막 인수가 동글의 일부 데이터를 포함 할 2 바이트에 대한 포인터 인 3 개의 인수를 사용합니다.

어셈블리 코드에서 인수는 역순으로 로드됩니다. 마지막 인수에 전달이 하나입니다:

마지막 인수는 동글의 데이터가 동글이 가리키는 메모리 주소에 저장된다는 것을 의미합니다.

실제로,호출이 이루어진 직후에 일시 중지 할 때,우리는 메모리에서 결과를 볼 수 있습니다:

0.74. 즉,동글에서 읽고 메인 프로그램의 메모리에 저장거야.이 호출을 건너 뛰려면 메모리에 0 을 쓸 필요가 있습니다. 이것은 위의 7 줄을 교체하는 것만 큼 간단합니다:

당신이 볼 수 있듯이,나는 또한 함수에 대한 호출이 유효한지 테스트를 포함하여 어셈블러 명령어의 나머지 부분을 삭제했다. 이 점프가 촬영되지 않습니다 및 프로그램 줘야 체크없이 계속 작동을 의미합니다.

동글과 관련된 모든 호출을 패치 한 후 새 호출을 저장했습니다.엑스 나는 동글을 꺼내 내 관습을 달렸다.그리고 내 자신의 놀랍게도 그것은 효과가 있었다! 나는 성공적으로 소프트웨어의 조각을 금했다.

또 다른 것은 내가 십자가는 나의 목록😊

Ps:대부분의 것들을 읽을처럼,0x74 과 응용 프로그램의 이름. 이것은 어떤 식 으로든이 소프트웨어를 만든 열심히 일하는 개발자를 해칠 수 없습니다. 또한 나는 동글이 바이트 만 반환하고 자체적으로 암호화를하지 않은 것은 매우 운이 좋았습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.