2012-09-07 3 views
0

나는 아주 까다로운 문제를 디버깅 해왔다.완전히 관리되는 어셈블리가 .Net 4.5에서 AccessViolationException과 충돌합니다.

기본적으로 나는 다양한 방법으로 충돌하는 난독 화 된 어셈블리가 있습니다. 난독 화 어셈블리에는 아무런 문제가 없지만 obfuscator가 여기에서 책임지지 않는다고 보장 할 수는 없습니다. (그게 내가 고치려고하는 것)

어쨌든, 난독 화 된 어셈블리도 .Net 4.0에서 잘 실행됩니다. .Net 4.5에서 JIT 최적화를 사용하지 않으면 잘 실행됩니다.

내가 시도한 것 :

IL에 대해 디버깅을 시도했습니다. 액세스 위반은 단순히 스택에 무언가를로드하는 IL 작업에서 비롯된 것 같습니다. 다시 말하지만, 완전히 관리되는 코드. 그것이 String.Empty에 관련이 이런 경우에

, 내가 대신 AccessViolation, 나는 그것을 통해 실행하는 FatalEngineException

를 얻을, 이제 있습니다 .. IL를 통해 가서 ldstr ""와 문자열의 모든 : 빈 전화를 교체 그것의 옵션이 모두 해제 된 deobfuscator는 작동하게 만듭니다. 기본적으로, deobfuscator가 켜지지 않은 모든 작업은 IL을 간신히 재 배열하고 일부 NOP를 삽입하는 것입니다.

또한 실행 파일은 PEVerify를 전달하므로 걱정할 필요가 없습니다.

나쁜 실행 : Test.exe

좋은 실행 : Test-cleaned.exe

기분을 상하게 스택 트레이스 :

 
Test.exe!PreEmptive.SoS.Client.Cache.CacheService.ServiceCache() Line 22032 + 0x137 bytes Unknown 
Test.exe!Test.TestConsole.Main(string[] args) Line 14 + 0x6 bytes Unknown 

당신은 두 개의 실행 파일을 비교하는 ILDASM을 사용할 수 있습니다. 재 순서가 정해 졌기 때문에, 제 취향에 조금 어려움을 느꼈습니다. 난 small tool 그냥 방법의 일리노이 덤프 및 비교 순서를 정렬하기 쉬운 방법으로했다.

나쁜 IL 덤프 : testcount.il

좋은 IL 덤프 : 사람이를 분석하고 IL 조각이의 원인을 정확히 파악하는 방법에 대한 아이디어가있는 경우 testcountcleaned.il

어쨌든, 내가 ' 감사합니다.

답변

0

해결책은 우리가 실제로 P/Invoking의 작은 비트를 가졌다는 것이 었습니다. 닷넷 4.5는보다 적극적으로 메모리를 사용합니다. 어떤 이유로 든 우리가 사용하고 있던 도구가 구조체 중 하나의 Marshalling 특성을 제거했습니다. 버그 수정 후 모든 것이 마술처럼 작동합니다. 그래서 .Net 4.5 버그가 아닙니다. 이제는 더 적극적으로 메모리를 사용합니다.

관련 문제