반응형


사실 안드로이드 쪽은 잘은 모릅니다만...


여기저기 멘땅에 헤딩하며(?) 알게된 정보가 있어서 살포시 포스팅을 해봅니다.



제가 애용하는 SNS 어플이 하나있는데...


이 어플이 젤리빈 업데이트 후 글 스크롤도 안되고 글 클릭도 안되는 문제가 생기더군요.


운영자에게 확인 및 수정 요청을 했지만 의외로 시간이 조금 걸리길래...


" 이걸 어떻게... 직접 해결할 수 없을까? " 하고 여기저기 들쑤시고 다녔더니...



Custom Listview 를 사용한 경우에 젤리빈에서 위와 같은 문제가 발생할 수 있다는 내용이 있더군요..


해결방법은 의외로 간단했습니다.


Custom Listview 의 onAttachedToWindow() 메쏘드에~


// 추가할 코드
super.onAttachedToWindow();
//

달랑 한줄 추가하면 된다고 하더군요.


의외로 간단한 해결방법에~ " 어라~!? 어플 조작으로 해결할 수 있겠는데!? " 하는 생각이 들어..


해당 SNS 어플 apk 파일을 뽑아내서~ 디컴파일을 하고 다음과 같이 수정을 해봤습니다.


// [ 원본 소스 ]------------------------------------------------------
  protected void onAttachedToWindow()
  {
    setSelection(1);
  }

// [ 원본 smali 소스 ] --------------------------------------
.method protected onAttachedToWindow()V
    .locals 1

    .prologue
    .line 132
    const/4 v0, 0x1

    invoke-virtual {p0, v0}, Lcommon/PullToRefreshListView;->setSelection(I)V

    .line 133
    return-void
.end method
//------------------------------------------------------


// [ 수정 소스 ]------------------------------------------------------
  protected void onAttachedToWindow()
  {
    super.onAttachedToWindow()
    setSelection(1);
  }

// [ 수정 smali 소스 ] --------------------------------------
.method protected onAttachedToWindow()V
    .locals 1

    .prologue
    .line 132
    invoke-super {p0}, Landroid/widget/ListView;->onAttachedToWindow()V

    .line 133
    const/4 v0, 0x1

    invoke-virtual {p0, v0}, Lcommon/PullToRefreshListView;->setSelection(I)V

    .line 134
    return-void
.end method
//------------------------------------------------------



다행히도 잘 되더군요...


( 참고로 제가 한 작업은 Java 소스를 건드린 것이 아니라 디컴파일 시 생성된 smali 파일을 수정했습니다. )


젤리빈에서 스크롤 동작하고 글 클릭이 가능할 때의 그 기쁨이란~ㅎㅎㅎ



안드로이드 어플을 개발하는 과정 중에 젤리빈에서 Custom Listview 에서 위와 같은 문제가..


발생한다면 의외로 간단하게 해결이 가능하구요...


그런 어플을 쓰고 계신 분들중 리버싱에 관심이 있으신 분은 직접 ㅎㅎ 어플 조작을 해보시는 것도...


색다른 재미가 되지않을까 싶네요..



아... =ㅁ= 참고로 이 SNS 는 지금은 젤리빈 지원버전이 나와있는 상태랍니다.ㅎ



반응형
AND

반응형


Windows 운영체제에서 프로세스는 저마다 PEB(Process Environment Block) 를 가집니다.


이 PEB 는 유저레벨에서도 접근할 필요가 있는 정보들을 담고 있기에 프로세스 주소 공간에 위치하며,


커널레벨에서는 EPROCESS 구조체를 이용해 PEB 의 포인터를 알 수 있습니다.

( EPROCESS 구조체에 Peb 라는 필드가 있거든요~ :D )


이 때 문득...


WOW64 프로세스는 PEB 가 어떻게 될까...??


이런 호기심이 생기더군요~



#1. WOW64 프로세스의 PEB 는 32비트 기반으로 생성된다!?


WOW64 프로세스는 일단 32비트로 에뮬레이팅 되는 개념이라 32비트 코드에 포인터 역시 32비트일테고...


즉, PEB 내부의 각종 정보들도 32비트 기반으로 생성이 될 것이라고 생각을 한거죠...

( 32비트로 생성이 되어야 32비트 기반 코드에서 원활하게 접근이 가능할테니까요... )



#2. WOW64 프로세스의 PEB 는 64비트 기반으로 생성된다!?


위에서도 언급했지만 PEB 는 커널레벨에서도 EPROCESS 를 이용해 접근이 가능한 정보입니다.


64비트 OS 특성상 커널레벨은 64비트 코드가 실행되며 포인터 역시 64비트입니다...


이렇게 되면 위에서 32비트 기반으로 생성이 되었을 PEB 를 제대로 인식을 못할텐데...!?


제대로 인식을 하려면 64비트 기반으로 생성이 되어야될텐데...!?



#1#2 의 딜레마 때문에 살짝 혼란스러웠는데...


확인해보니 32비트 기반 PEB 와 64비트 기반 PEB 를 둘 다 생성을 하더군요... =_=;;;...



[ 커널레벨에서의 WOW64 프로세스 PEB ]


PROCESS fffffa8000d84620
    SessionId: 1  Cid: 0ba4    Peb: 7efdf000  ParentCid: 0534
    DirBase: 20516000  ObjectTable: fffff8a0022199c0  HandleCount:  97.
    Image: notepad.exe

kd> dt nt!_EPROCESS fffffa8000d84620
   +0x000 Pcb              : _KPROCESS
   +0x160 ProcessLock      : _EX_PUSH_LOCK
   +0x168 CreateTime       : _LARGE_INTEGER 0x1cddc0c`abfc961d
   +0x170 ExitTime         : _LARGE_INTEGER 0x0
   +0x178 RundownProtect   : _EX_RUNDOWN_REF
   +0x180 UniqueProcessId  : 0x00000000`00000ba4
   +0x188 ActiveProcessLinks : _LIST_ENTRY [ 0xfffffa80`00dae678 - 0xfffffa80`031dacb8 ]
   +0x198 ProcessQuotaUsage : [2] 0x2980
   +0x1a8 ProcessQuotaPeak : [2] 0x2980
   +0x1b8 CommitCharge     : 0x1d2
   +0x1c0 QuotaBlock       : 0xfffffa80`02d58280 _EPROCESS_QUOTA_BLOCK
   +0x1c8 CpuQuotaBlock    : (null)
   +0x1d0 PeakVirtualSize  : 0x5917000
   +0x1d8 VirtualSize      : 0x4dcd000
   +0x1e0 SessionProcessLinks : _LIST_ENTRY [ 0xfffff880`03666010 - 0xfffffa80`02fd6240 ]
   +0x1f0 DebugPort        : (null)
   +0x1f8 ExceptionPortData : 0xfffffa80`02944d10
   +0x1f8 ExceptionPortValue : 0xfffffa80`02944d10
   +0x1f8 ExceptionPortState : 0y000
   +0x200 ObjectTable      : 0xfffff8a0`022199c0 _HANDLE_TABLE
   +0x208 Token            : _EX_FAST_REF
   +0x210 WorkingSetPage   : 0x2041a
   +0x218 AddressCreationLock : _EX_PUSH_LOCK
   +0x220 RotateInProgress : (null)
   +0x228 ForkInProgress   : (null)
   +0x230 HardwareTrigger  : 0
   +0x238 PhysicalVadRoot  : (null)
   +0x240 CloneRoot        : (null)
   +0x248 NumberOfPrivatePages : 0x149
   +0x250 NumberOfLockedPages : 0
   +0x258 Win32Process     : 0xfffff900`c2cc9ce0
   +0x260 Job              : (null)
   +0x268 SectionObject    : 0xfffff8a0`02264d70
   +0x270 SectionBaseAddress : 0x00000000`00a30000
   +0x278 Cookie           : 0x9b7242f4
   +0x27c UmsScheduledThreads : 0
   +0x280 WorkingSetWatch  : (null)
   +0x288 Win32WindowStation : 0x00000000`00000054
   +0x290 InheritedFromUniqueProcessId : 0x00000000`00000534
   +0x298 LdtInformation   : (null)
   +0x2a0 Spare            : (null)
   +0x2a8 ConsoleHostProcess : 0
   +0x2b0 DeviceMap        : 0xfffff8a0`01895af0
   +0x2b8 EtwDataSource    : (null)
   +0x2c0 FreeTebHint      : 0x00000000`7ef9d000
   +0x2c8 FreeUmsTebHint   : 0x00000001`00000000
   +0x2d0 PageDirectoryPte : _HARDWARE_PTE
   +0x2d0 Filler           : 0
   +0x2d8 Session          : 0xfffff880`03666000
   +0x2e0 ImageFileName    : [15]  "notepad.exe"
   +0x2ef PriorityClass    : 0x2 ''
   +0x2f0 JobLinks         : _LIST_ENTRY [ 0x00000000`00000000 - 0x0 ]
   +0x300 LockedPagesList  : (null)
   +0x308 ThreadListHead   : _LIST_ENTRY [ 0xfffffa80`02ec1f78 - 0xfffffa80`02f465a8 ]
   +0x318 SecurityPort     : (null)
   +0x320 Wow64Process     : 0x00000000`7efde000
   +0x328 ActiveThreads    : 4
   +0x32c ImagePathHash    : 0x28e040de
   +0x330 DefaultHardErrorProcessing : 1
   +0x334 LastThreadExitStatus : 0
   +0x338 Peb              : 0x00000000`7efdf000 _PEB
   +0x340 PrefetchTrace    : _EX_FAST_REF
   +0x348 ReadOperationCount : _LARGE_INTEGER 0x0
   +0x350 WriteOperationCount : _LARGE_INTEGER 0x0
   +0x358 OtherOperationCount : _LARGE_INTEGER 0x0
   +0x360 ReadTransferCount : _LARGE_INTEGER 0x0
   +0x368 WriteTransferCount : _LARGE_INTEGER 0x0
   +0x370 OtherTransferCount : _LARGE_INTEGER 0x0
   +0x378 CommitChargeLimit : 0
   +0x380 CommitChargePeak : 0x1d2
   +0x388 AweInfo          : (null)
   +0x390 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
   +0x398 Vm               : _MMSUPPORT
   +0x420 MmProcessLinks   : _LIST_ENTRY [ 0xfffffa80`00dae910 - 0xfffffa80`031daf50 ]
   +0x430 HighestUserAddress : 0x00000000`7fff0000
   +0x438 ModifiedPageCount : 2
   +0x43c Flags2           : 0xd000
   +0x43c JobNotReallyActive : 0y0
   +0x43c AccountingFolded : 0y0
   +0x43c NewProcessReported : 0y0
   +0x43c ExitProcessReported : 0y0
   +0x43c ReportCommitChanges : 0y0
   +0x43c LastReportMemory : 0y0
   +0x43c ReportPhysicalPageChanges : 0y0
   +0x43c HandleTableRundown : 0y0
   +0x43c NeedsHandleRundown : 0y0
   +0x43c RefTraceEnabled  : 0y0
   +0x43c NumaAware        : 0y0
   +0x43c ProtectedProcess : 0y0
   +0x43c DefaultPagePriority : 0y101
   +0x43c PrimaryTokenFrozen : 0y1
   +0x43c ProcessVerifierTarget : 0y0
   +0x43c StackRandomizationDisabled : 0y0
   +0x43c AffinityPermanent : 0y0
   +0x43c AffinityUpdateEnable : 0y0
   +0x43c PropagateNode    : 0y0
   +0x43c ExplicitAffinity : 0y0
   +0x43c Spare1           : 0y0
   +0x43c ForceRelocateImages : 0y0
   +0x43c DisallowStrippedImages : 0y0
   +0x440 Flags            : 0x144d0801
   +0x440 CreateReported   : 0y1
   +0x440 NoDebugInherit   : 0y0
   +0x440 ProcessExiting   : 0y0
   +0x440 ProcessDelete    : 0y0
   +0x440 Wow64SplitPages  : 0y0
   +0x440 VmDeleted        : 0y0
   +0x440 OutswapEnabled   : 0y0
   +0x440 Outswapped       : 0y0
   +0x440 ForkFailed       : 0y0
   +0x440 Wow64VaSpace4Gb  : 0y0
   +0x440 AddressSpaceInitialized : 0y10
   +0x440 SetTimerResolution : 0y0
   +0x440 BreakOnTermination : 0y0
   +0x440 DeprioritizeViews : 0y0
   +0x440 WriteWatch       : 0y0
   +0x440 ProcessInSession : 0y1
   +0x440 OverrideAddressSpace : 0y0
   +0x440 HasAddressSpace  : 0y1
   +0x440 LaunchPrefetched : 0y1
   +0x440 InjectInpageErrors : 0y0
   +0x440 VmTopDown        : 0y0
   +0x440 ImageNotifyDone  : 0y1
   +0x440 PdeUpdateNeeded  : 0y0
   +0x440 VdmAllowed       : 0y0
   +0x440 CrossSessionCreate : 0y0
   +0x440 ProcessInserted  : 0y1
   +0x440 DefaultIoPriority : 0y010
   +0x440 ProcessSelfDelete : 0y0
   +0x440 SetTimerResolutionLink : 0y0
   +0x444 ExitStatus       : 259
   +0x448 VadRoot          : _MM_AVL_TABLE
   +0x488 AlpcContext      : _ALPC_PROCESS_CONTEXT
   +0x4a8 TimerResolutionLink : _LIST_ENTRY [ 0x00000000`00000000 - 0x0 ]
   +0x4b8 RequestedTimerResolution : 0
   +0x4bc ActiveThreadsHighWatermark : 4
   +0x4c0 SmallestTimerResolution : 0
   +0x4c8 TimerResolutionStackRecord : (null)



[ 유저레벨에서의 WOW64 프로세스 PEB ]




* FS 레지스터 : 0x7EFD7000




* FS:[30] (PEB) = 0x7EFDE000



정리해보면 EPROCESS 의 Peb 필드에 64비트 기반 PEB 의 포인터를 가지고 있고...


Wow64Process 필드에 32비트 기반 PEB 의 포인터를 가지고 있습니다... @_@..



막연하긴 하지만 유저레벨에서 다른 프로세스에 접근을 한다고 했을 때...


내 프로세스가 WOW64 모드인지 Native64 모드인지...


또, 접근대상이 WOW64 모드인지 Native64 모드인지에 따라 꽤나 복잡해질 수도 있겠구나...


하는 생각이 드는군요... @_@


틈틈이 WOW64 아키텍쳐에 대해서 좀 더 공부를 해봐야겠네요...




반응형
AND

반응형





하이텔에 이어 나우누리도 서비스가 종료되는군요...


95년인가...? 96년인가...? 아버지 아이디로 처음 접속해본 후로 "PC통신" 이라는 신세계에...


제대로 푹 빠져서 전화비 축내가며 미친듯이(?) 했던 기억이 아직도 새록새록한데...ㅎㅎ






2400 bps 모뎀에서 한글자 한글자 출력되는 페이지를 보다가...


12800 bps 모뎀에서 한페이지 출력 속도가 비약적으로 발전하는 과정을 직접 느꼈고...


그 당시 메가바이트 단위의 게임 하나를 몇 시간동안 받고 있다가...


부모님이 전화하려고 수화기 든 바람에 연결 끊어져서 멘붕이 왔던 기억도 있고...


밤에 부모님 몰래 통신하겠다고 담요로 컴퓨터 뒤집어 씌우는 뻘짓을 하다가...


ATZ "M" 이라는 훌륭한 명령에 문화쇼크도 받아봤고...


이런저런 추억이 많은데... 서비스가 종료된다고 하니 아쉬운 마음도 있네요..



어찌보면 "나우누리" 가 있었기에 지금의 제가 있는게 아닌가 하는 생각도 해봅니다...


PC 통신 동호회(중고생 프로그래머 모임, 바이러스 분석연구 모임 등...)활동을 하면서...


컴퓨터 기반 지식들을 많이 습득했고... 보안이라는 분야로 발을 담그게 된 것도...


그 당시 온라인에서 같이 활동하던 분들의 영향을 꽤 받았던 것도 있구요...



얼마전, "응답하라 1997" 이라는 드라마를 보다가 옛날 생각이 나서...


몇년 전 탈퇴했던 나우누리에 다시 가입을 한 게 그리 오래되지는 않았는데... ^^;;;;;


이젠 "나우누리" 와 함께... PC통신, 모뎀, 이야기, 파란화면, 채팅.... 등은...


추억의 한편으로 접어둬야겠네요...ㅎㅎ



안녕~~~ 나우누리~~~



반응형
AND