2011-12-18 3 views
0

죄송합니다. ASM 및 IDA에 관해서는 완전한 멍청한 반응입니다. 저의 프로그래밍 경험은 주로 Java 개발자로서 다소 편안함을 느낍니다.마지막으로 레지스터에서 장소를 변경 한 '함수'를 찾고 계십니까?

나는 리버스 엔지니어링을 약간하고 있으며, 내가 원하는 것을 거의 찾을 수 있었다. 내 프로그램은 다음 조건을 발견

mov  ecx, [esi+500h] 
cmp  byte ptr [ecx+679h], 1 
jnz  loc_7256AAD 
최대한 멀리 이해, 그것은 [EXC + 679h는 상기와 어드레스의 바이트를 비교 afterwhich 레지스터 ECX로 [ESI + 500H]의 값을 이동

바이트 1입니다. 결과가 0이 아니면 loc_7256AAD 함수로 점프합니다.

내 문제는 [ecx + 679h]의 바이트가 사실 부울이며, 항상 0 또는 1입니다. 결과는 0인지 여부를 결정하는 함수를 찾는 방법에 대한 단서가 없습니다. 또는 1. 기본적으로 나는 [ecx + 679h]의 가치가 설정된 장소를 찾는 방법에 대한 조언을 주시면 감사하겠습니다. 감사.

이 스 니펫을 호출하는 루틴에서 코드를 제공합니다.

push ecx 
lea  eax, [esp+70h+arg_8] 
mov  ecx, esp 
mov  dword ptr [esp+70h+var_30], esp 
push eax 
call ds:mfc90u_280 
mov  byte ptr [esp+70h+var_4], 9 
mov  byte ptr [esp+70h+var_4], 1 
mov  ecx, [esi+500h] 
call sub_7210050 
mov  ebp, eax 
test ebp, ebp 
jz  loc_7256E73 

및 loc_7256e73이 첫 번째 스 니펫입니다.

미안하지만 나는 어떤 조언을 주셔서 감사합니다.

Jens의 조언을 듣고 쓰기 추적 브레이크 포인트를 추가하려고 시도했지만 메모리 위치가 변경됩니다. 즉, ecx + 679h 주소는 매번 다릅니다. 누구든지 더 이상 아이디어가 있다면 크게 감사드립니다.

+0

'결과가 0이 아닌 경우 ': [JNE and JNZ] (http://www.felixcloutier.com/x86/Jcc.html)는 동일한 opcode와 동의어입니다. 이 경우 올바른 의미 해석이 아닌 것으로 간주됩니다. ('byte ptr [ecx + 679h]'-'1 '이 0이면 ZF가 설정됩니다. 왜냐하면 cmp는 플래그를 설정하는 하위와 같기 때문입니다). –

답변

1

프로그램을 실행할 수 있습니까?

그런 다음 가장 쉬운 방법은 디버거에서 실행하는 것입니다. 실제 주소를 찾은 다음 해당 주소에 쓰기 메모리 중단 점을 작성하십시오.

+0

안녕하세요, Jens 님의 답장을 보내 주셔서 감사합니다. 예, IDA하에 디버거에서 실행할 수 있습니다.즉, [ecx + 679h]의 주소를 찾고 쓰기 메모리 브레이크 포인트를 추가 한 후 어떤 함수가 그것에 대해 쓰는지 볼 수 있어야합니다. 죄송합니다. 한가지 다른 점은 cmp 바이트 ptr [ecx + 679h], 1이 실행될 때마다 주소가 다르면 쓰기 추적이 작동하지 않습니다. 이 아마추어 질문에 대해 유감입니다. – user1104652

+0

예, ecx로 가정하고 주소는 변경되지 않습니다. –

+0

그런 경우 플래그 중 하나를 변경하는 루틴은 다른 플래그를 변경하는 루틴 일 수 있습니다. –

1

정말 저렴한 방법은 코드 스 니펫에서 상수의 고유성을 남용하는 것입니다. 0x679은 매우 독특한 구조체 오프셋이므로 응용 프로그램 모듈의 모든 참조가 사용자가 관심있는 대상을 참조 할 가능성이 높습니다. mov [r32 + 0x679],r32 또는 mov [r32 + 0x679],c32 행을 따라 필요한 항목 만 검색하면됩니다.

물론이 방법은 값이 간접적으로 설정되면 변경해야합니다.이 경우 lea r32,[r32 + 0x679] 또는 add r32,0x679 줄을 따라 뭔가를 찾아야합니다.

R32 여기서 32 비트 레지스터 약자 마찬가지로 C32은

+0

679h에 대한 모든 참조를 검색했습니다. cmp에 대해서만 사용되고 mov/add/lea 등에는 사용되지 않는 것처럼 보입니다. 679h가 상수 일 때 ecx가 변경되고 따라서/ecx라는 함수는 다른 값을 가지고 있습니까? 죄송합니다. 아마 굉장히 아마추어입니다. 아마도 필자는 필요한 기능을 찾기 위해 다른 방법을 고안해야합니다. '너무 가깝다'고 느끼기 때문에 그냥 좌절하는 것입니다. – user1104652

+0

@ user1104652 : 찍은 지점이 변경됩니까? 왜냐하면 실제로 설정되지 않았을 가능성이 있기 때문입니다. 그렇지 않으면로드 된 dll과 같은 다른 바이너리 모듈을 통해 설정 될 수도 있습니다. – Necrolis

-1

아마 때문에 [ECX 찾고 32 비트 (또는 미만) 상수,이 올리 디버그 표기법, IDA가 있어야 유사한 와일드 카드이고 + 679h]는 스택이나 힙처럼 많이 사용되는 메모리 주소를 가리킬 수 있습니다. 따라서이 상황을 모니터링하는 것은 응용 프로그램의 스크래치 패드 이후로 성가시다. 메모리 주소 조건이 바뀌면 디버거의 문서를 읽을 수 있기 때문에 디버거의 문서를 읽을 수 있기 때문에 디버거가 메모리 주소를 변경할 때마다 디버깅하도록 설정할 수있다. 특정 값의 쓰기/읽기 조건이 충족됩니다.

+0

OP는 'ecx'가 매번 다른 구조체를 가리키며, 하나의 하이 - 교통 위치. OP는 워치 포인트를 쓰기 위해 문제가 있다고 말했다. 특정 값의 쓰기에 조건을 필터링하려고 시도하는 것이 좋지만이 경우에는 도움이되지 않습니다. –