2012-09-24 2 views
0

내가하고있는 일은 DLL을 실행중인 프로세스에 주입하는 것입니다. 그런 다음 버전 등의 프로세스에 대한 정보를 확인하기 위해 진행합니다. 문제는 어셈블리 파일에서 더블 체크하려는 개정 번호가 들어있는 문자열에 액세스 할 수없는 것입니다. 여기에 지금까지 무엇을 가지고 : 나는 IDA를 통해 얻을이 훈련 물건인라인 ASM을 사용하여 문자열 얻기

__declspec(naked) void CheckBuild() 
{ 
    char* revision; 
    __asm { 
     sub esp, __LOCAL_SIZE 
     pushad 
     pushfd 

     mov revision, dword ptr 0x5F5200 
    } 

    printf("Detected revision ID: %u\n", revision); 

    __asm { 
     popfd 
     popad 
     add esp, __LOCAL_SIZE 
     retn 
    } 
} 

, 문자열의 주소, 내가 CheatEngine하고 올리 디버그를 사용하여 확인할 것을 상수이다.

그러나 내가 시도한 것에 관계없이 나는 항상 0x5F5200을 십진수로 되돌려 놓았는데, 이것은 분명히 내가 기대하는 바가 아니다. 나는 거의 모든 것을 시도했는데, lea와 others를 포함하여, 그러나 나는 여전히 유효한 문자열을 얻지 못했다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

답변

1
  1. 당신은 "역 참조"누락 : 그것은 두 indirects이 있기 때문에 유효한 명령하지

    mov revision, dword ptr [0x5F5200]

, 그래서

mov eax, dword ptr [0x5F5200] 
mov revision, eax 
  1. 값이 실제로 문자열이면 거기에 의 뭔가 다른 잘못 : 문자열이 0x5F5200에 저장되어있는 경우 문자열의 주소가 0x5F5200에 저장되어있는 경우

    • , 당신은 단순히,

    printf("Detected revision ID: %s\n", 0x5F5200)

    • 당신이 할 사용합니다 사용

    printf("Detected revision ID: %s\n", revision)

  2. 문자열이 유니 코드 인 경우
  3. 문자열 형식

, 당신은

printf("Detected revision ID: %S\n", revision); 

이 (wprintf와 함께, 그것은 다른 방법으로 '라운드의주의 사용합니다 : %의 넓은 문자열에 대한, 그리고 char 문자열의 경우 % s).

마지막으로 문자열이 0으로 끝나지 만 고정 길이가 보장되지 않으면 주소에서 로컬 버퍼로 복사하고 인쇄 전에 0을 종료해야합니다.

+0

해결되었습니다. 감사합니다. – Warpten