코드 삽입 작동 방식을 이해하기 위해 minesweeper.exe를 변경하고 있습니다. 간단히 말해서, 지뢰 찾기를 시작하기 전에 메시지 상자를 보여주기를 바랍니다. 그래서, 나는 실행 파일에 "cave"를 찾은 다음 messagebox에 표시 할 문자열을 정의하고 messagebox를 호출합니다. 물론, 실행 파일의 모듈 진입 점에서 값을 변경하고 먼저 추가 코드로 이동 한 다음 자체 코드를 계속 진행해야합니다. 그래서 동굴에서 내가하는 일; 문자열 주소를 어셈블리, 머신 코드와 함께 스택에 푸시하는 방법
"hello starbuck",0
push 0 //arg4 of MessageBoxW function
push the address of my string //arg3, must be title
push the address of my string //arg2, must be the message
push 0 //arg1
call MessageBoxW
...
지금 실행 변경 매번에서 코드의 메모리 주소 이후는 MessageBoxW 함수를 호출을 위해, 나는 MessageBoxW가 가져 오기 주소 테이블에 정의 된 주소의 오프셋을 제공, 메모리에로드됩니다.
MessageBoxW
단지
call MessageBoxW
후
IAT의에서 주소 1과 명령에 정의 된 경우 예를 들어,
주소 2 대신 call MessageBoxW
작성 에, 나는
call address2 - address1
쓰기입니다.
제 질문은 문자열의 주소를 스택에 넣기 위해 어떻게해야합니까? 예를 들어 ollydbg를 통해 이러한 변경 작업을 수행 할 경우 "hello starbuck"이라는 직접 주소를 사용하여 푸시하면됩니다. 그러나 실행 파일을 다시로드하거나 ollydbg 외부에서 실행하면 즉각적인 주소가 변경되기 때문에 당연히 실패합니다.
미리 감사드립니다. Yigit.
편집 : exe가 열릴 때마다 모듈 진입 점의 상위 단어가 변경되기 때문에이 문제가 발생합니다. 따라서 다른 문자열이 스택에 어떻게 푸시되는지 보려면 다음을 수행하십시오.
코드에서 "Destroy Canvas"문자열을 발견했습니다. 이것은 주소 : 00403E44에 있습니다. 주소 0042878E에는 PUSH 00403E44
(68 44 3E 40 00) 명령이 있습니다. 이는 문자열에 대한 포인터가 스택에 푸시되었음을 의미합니다. 그런 다음 UltraEdit에서 exe를 열어 해당 주소 인 00027D8E를 찾았습니다. 여기서 "68 44 3E 40 00"대신 "68 44 3E 00 01"이라고 씁니다. 이제 OllyDbg가 exe를로드하면이 코드가 업데이트된다는 것을 의미합니다. 00 01 ~ 40 00. 나는 다른 현을 보았고, 그들의 강요 지침도 마찬가지였다. 그래서 문자열을 푸시하기 위해 UltraEdit에서 "68 DA 9A 00 01"대신 "68 DA 9A 00 00"을 쓰면 업데이트 될 것입니다. 그러나 그렇지 않습니다. 이 후 OllyDbg에서 EXE를 열면 밀어 넣을 주소는 "01009ADA"로 남습니다.
그래서 이러한 "코드 업데이트"절차를 구성해야한다고 생각합니다. 어쩌면 재배치 테이블과 관련이 있을지 모르겠습니다.
다른 질문으로 질문해야 할 것 같습니까?
불행히도 여기에 같은 문제가 있습니다. 예를 들어 첫 번째 기사에서 "push 0100131C"는 "You found the password"문자열의 포인터를 전달했습니다. 이제 0100131C는 해당 문자열의 현재 주소입니다. 따라서 그가 ollydbg에서 calc.exe를 시작하면 작동합니다. 그러나 그가 exe에 변경 사항을 저장하고 다시 외부로 시작하면 충돌이 발생합니다. 주소 0100131C는 관련이없는 어딘가를 지적하기 때문에. 그가 ollydbg를 닫은 후 다시 시작하고 calc.exe를 다시 열면 0100131C 주소가 "You found the password"문자열을 가리키고있는 것을 볼 수 있습니다. – Yigit
그리고 그 이유는 exe가 시작될 때마다 다른 주소로로드되기 때문입니다. exe에서 코드와 문자열 간의 상대 거리가 변경되지는 않지만 실제 주소가 변경됩니다. – Yigit
나는 기사를 썼다. 이 프로그램은 ollydbg 밖에서 충돌하지 않으며 문자열은 정확히 같은 위치에 있습니다. 당신은 아마 명백한 것을 놓치고있을 것입니다. 내 XP 버전의 지뢰 찾기에서 해보고 다시 해보겠습니다. –