문제

나는 이진에서 하드 코딩 된 현을 추출 할 수 있음을 발견했습니다.
예를 들어 속성보기 프로세스 탐색기 3 자 이상의 문자열을 모두 표시합니다.

다음은 간단히 테스트하기 위해 쓴 간단한 실행 파일의 코드입니다.

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    _TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5");
    _TCHAR* hiddenString2 =_T("hidden_password_or_whatever");
    for (int i= 0; i<argc; i++) {
        if (0 == _tcscmp(argv[i],hiddenString1)) {
            _tprintf (_T("The guid argument is correct.\n")); }
        else if (0 == _tcscmp(argv[i],hiddenString2)) {
            _tprintf (_T("Do something here.\n")); }
    }

    _tprintf (_T("This is a visible string.\n"));
    //Keep Running
    Sleep(60000);
    return 0;
}

문자열은 해당 실행 파일에서 명확하게 추출 할 수 있습니다.
alt text

나는 줄을 찾기가 너무 쉽다고 생각합니다.

내 질문은 다음과 같습니다.

  1. 어떻게 간단히 숨다 HiddenString1 또는 HiddenString2 실행 파일에서?
  2. 숨겨진 숨겨진 입력보다 "치트 코드"를 사용하는보다 안전한 방법이 있습니까?
도움이 되었습니까?

해결책

더 넓은 방어 프로그래밍 세계에 오신 것을 환영합니다.

몇 가지 옵션이 있지만, 나는 그들 모두가 어떤 형태의 난독 화에 의존한다고 생각합니다. 완벽하지는 않지만 적어도 무언가입니다.

  1. 직선 문자열 값 대신 텍스트를 다른 바이너리 양식 (16 진?)으로 저장할 수 있습니다.

  2. 앱에 저장된 문자열을 암호화 한 다음 실행 시간에 해독 할 수 있습니다.

  3. 코드의 다양한 지점으로 나누고 나중에 재구성 할 수 있습니다.

또는 일부 조합.

일부 공격은 실제 바이너리를 보는 것보다 더 나아가는 것을 명심하십시오. 때때로 그들은 프로그램이 실행 중에 프로그램의 메모리 주소 공간을 조사합니다. MS는 a라는 것을 생각해 냈습니다 .NET 2.0에서 Securestring. 앱이 실행되는 동안 문자열을 암호화하는 목적입니다.

네 번째 아이디어는 앱 자체에 문자열을 저장하지 않고 컨트롤하는 서버에 제출할 유효성 검사 코드에 의존하는 것입니다. 서버에서 합법적 인 "치트 코드"인지 여부를 확인할 수 있습니다.

다른 팁

여러 가지 방법이 있습니다 모호 실행 파일의 데이터. 여기에 다른 사람들은 좋은 솔루션을 게시했습니다. 나는 그 목록에 추가하지 않을 것이다.

그냥 알아보십시오 : 그것은 모두 고양이와 마우스 게임입니다. 불가능한 에게 보장하다 아무도 당신의 "비밀"을 찾을 것입니다.

얼마나 많은 암호화 나 다른 트릭을 사용하든; 얼마나 많은 노력이나 돈을 넣어도. 얼마나 많은 "NASA/MIT/CIA/NSA"유형이 숨겨지는 데 관여하든 상관 없습니다.

그것은 모두 간단한 물리학으로 나옵니다.
불가능하다면 어느 사용자는 실행 파일에서 비밀을 꺼내고 "고정 상태"에 해당하는 경우 컴퓨터가 해제되지 않을 수 없으며 프로그램을 사용할 수 없습니다. 충분한 인센티브를 가진 적당히 숙련 된 개발자는 비밀을 막을 수있는 방법을 찾을 것입니다.

실행 파일을 사용자에게 건네 준 순간, 비밀을 찾는 데 필요한 모든 것이 있습니다.

당신이 기대할 수있는 최선은 그것을 만드는 것입니다 너무 힘들어 비밀을 알면 얻을 수있는 혜택이 번거 로움이 없다는 비밀을 밝히기 위해.

따라서 데이터가 공개되기 위해서는 "Not Nice"라면 또는 공개되는 결과가 "불편한"경우 데이터를 모호하게하는 것이 좋습니다. 그러나 프로그램에 "마스터 클라이언트 데이터베이스에 대한 비밀번호", 개인 키 또는 기타 중요한 비밀을 숨기는 것을 생각하지 마십시오. 당신은 그냥 할 수 없습니다.

귀하의 프로그램이 어떻게 든 필요하지만 공개 정보가되어서는 안되는 비판적 비밀 정보가 있다면 (개인 키와 같이) 프로그램이 제어 하에서 원격 서버와 대화하고 적절한 인증 및 권한 부여 컨트롤을 적용해야합니다 (즉, 승인 된 사람이나 컴퓨터 만 서버에 요청할 수 있는지 확인하십시오.), 그리고 그 서버에 비밀을 유지하고 사용하도록하십시오.

가장 간단한 방법은 Xor 또는 Rot-13과 같은 사소한 무언가로 암호화 한 다음 사용될 때 즉시 해독하는 것입니다. 그것은 그들의 캐주얼 시청을 제거 할 것이지만, 반전에 대한 많은 경험을 가진 사람을 멈추지는 않습니다.

이러한 방법 외에도 Chris는 해싱 알고리즘을 사용할 수도 있습니다. 올바른 ID를 지정했는지 확인하는 것만으로도 실제로 프로그램에 전체 ID를 저장할 필요가 없습니다.

  • 비교하려는 문자열/비밀번호/ID의 해시 (MD5, SHA 등)를 만들고 '소금'값을 추가 할 수 있습니다. 이것을 프로그램에 저장하십시오
  • 프로그램이 실행되면 입력 문자열/비밀번호/ID에서 동일한 알고리즘을 수행하고 두 해시를 비교하여 일치하는지 확인하십시오.

이런 식으로 실제 텍스트는 프로그램에 결코 저장되지 않으며 해시 알고리즘이 단방향이기 때문에 원본 텍스트가 무엇인지 알아 내기 위해 프로그램을 리버스 엔지니어링 할 수 없습니다.

HTTP 요청에 대한 URL도 숨길 수 있습니다.

앱이 요청을하는 경우이를 숨기는 점이 없습니다. Fiddler, HTTP Analyzer 또는 수십 개의 무료 및 쉽게 사용할 수있는 방법 중 하나와 같은 앱을 실행하면 앱이 작성하는 모든 트래픽이 표시됩니다.

모든 비밀 코드가 안내일까요, 아니면 그 예일 뿐입니 까?

아마도 비밀을 바이너리 안내로 보관할 것입니다.

const GUID SecretGuid =
    { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

그런 다음 제공된 안내서를 문자열에서 바이너리 형식으로 변환하고 두 바이너리 안내서를 비교하십시오.

특정 문자열이 있으면 사람들이 볼 수 있기를 원하지 않는 경우 런타임에 암호를 암호화하고 해독하십시오.

사람들이 당신의지도를보고 싶지 않다면 문자열로 구성되지 않고 바이트로 구성하십시오.

const GUID SecretGuid = 
      { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

당신이 할 수있는 최선의 방법은 char 배열로 숨기려는 비밀번호 또는 다른 문자열을 코딩하는 것입니다. 예를 들어:

std::string s1 = "Hello";   // This will show up in exe in hex editor
char* s2 = "World";   // this will show up in exe in hex editor
char s3[] = {'G', 'O', 'D'}; // this will not show up in exe in hex editor.

다음은이 목적으로 사용하는 방법입니다. 먼저, 나는 그것을 사용합니다 문자열 도구 sysinternals exe 또는 dll에 문자열을 표시합니다. 그런 다음 사용합니다 작은 도구를 따릅니다 (보다 기사)이 문자열을 산술 표현식으로 저장된 스크램블 된 문자로 바꾸려면 : 예를 들어 : 문자열 대신 :"이것은 테스트입니다"다음 코드를 배치하겠습니다. (자동으로 생성됩니다. 이 도구)

WCHAR T1[28];
 T1[22] = 69;
 T1[15] = 121 - 17;
 T1[9] = L':' + -26;
 T1[12] = L't' - 1;
 T1[6] = 116 - 1;
 T1[17] = 117 - 12;
 T1[3] = 116 - 1;
 T1[14] = L'' - 3;
 T1[13] = L'w' - 3;
 T1[23] = 69;
 T1[26] = L'Y' + 3;
 T1[19] = 111 + 0;
 T1[21] = L'k' - 34;
 T1[27] = L'\\' - 8;
 T1[20] = L'B' + 32;
 T1[4] = 42 + -10;
 T1[25] = L'm' - 17;
 T1[16] = L'H' + 18;
 T1[18] = L'A' + 56;
 T1[24] = 68;
 T1[1] = 105 - 1;
 T1[11] = L'k' - 6;
 T1[10] = 66 + 50;
 T1[2] = 105;
 T1[0] = 117 - 1;
 T1[5] = L'k' - 2;
 T1[8] = 89 + 8;
 T1[7] = 32;

이 문제에 대한 많은 해결책이 있으며 그 중 어느 것도 완벽하지는 않지만, 민감한 문자열을 스크램블하고 변장하고 숨길 수있는 방법이 있습니다. 물론 런타임 중에 암호를 암호화하고 해독 할 수는 있지만 (이 기사 참조), 실행 파일의 비트와 바이트 사이 에서이 문자열이 사라지게하는 것이 더 중요합니다. 내 도구를 실행 한 후에는 실행 파일에서 "테스트입니다"를 찾을 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top