심심풀이로
설마 저같은 4류 프로그래머가 뚫겠냐 싶어서 해보다가
언팩킹 후에 ge.smail 내부 몇개 if-nez 같은거 제끼고 리팩킹했더니
unlock key 없이 매크로 갯수 제한 풀리고 Screenshot 기능 활성화되고
해제 되는거 보고 깜놀했습니다만...
이런 글 쓰면 안되는거겠죠??
문제시 바로 삭제 하겠습니다.
ㅠㅠ
------------------------------------------------------------------------------------
여러 글을 둘러보면서
특히 바람처럼님 글 보면서 무엇보다 Frep 개발자가 너무 마음 아파 할거 같아 apk를 직접 올리지 않겠습니다.
다만 고쳐야 할 파일 여러개 중 한가지에 대해서 고치는 법을 좀 더 상세히 기술하겠습니다.
글구 다음번엔 개발자님께서 스크립트 언어처럼 코딩 기능이 지원 되게 만들어 줄 수 없는지 요청 하고 싶습니다;;;
취미 삼아 연구 하는 터라 틀린 점이 많을 수 있습니다. 잘못 된 점 지적 바랍니다.
웬지 모르게 이 루틴이 의심스럽다는 감각(?)에 따라 무식하게 고쳐보았습니다.
fm.smail 에서 Checking 하는 Routine 으로 보이는 구간입니다.
1. com.x0.strai.frepkey 이라는 unlock key 패키지명이 보입니다.
2. unlockstate 라는 주목할 만한 글자도 보입니다.
3. 저도 넘 어려워서 전혀 모르겠지만 Signature를 가져 오거나 Checking 하는 루틴으로 보이는 iget-object 어쩌구 signatures, 또는 checkSignatures 에 주목
4. if-eqz V1, : cond_0 => 만약 결과(V1)가 0이라면 cond_0: 로 Jump 하란 의미로 보임...
5. Signature 웬지 항상 가져 와야할거 같은 느낌.... 붉은 라인은 모두 제거 하는걸로 결정
6. if 어쩌구로 조건이 조금만 안 맞아도 주황색의 라벨이 붙은 cond_0: 로 Jump하는걸로 추정되고 checkSignatures 를 거치지 않고 return을 만나 함수가 종료되는 느낌
7. 따라서 cond_0는 돌아 올 수 없는 공포(?)의 구간으로 추정 이를 회피할 수 있는 유일한 루틴은 cond_1으로 가는 길....
goto :cond_1 를 추가하여 회생(?)의 길을 열어 줍니다.
8. 회생에 길 cond_1: 루틴에서도 공포의 cond_0 을 만나는 루틴들이 보입니다. 무시무시한 녀석이니 전부 제거
9. 도중에 cond_2로 가는 길목에 Signature를 가져오는걸로 추정되는 루틴이 보임 이를 거쳐야 할 것 같은 예감... 에
if-nez v0, :cond_2 제거 cond_2 루틴에는 unlockstate가 보임 그 이하엔 공포의 cond_0로 가는 루틴이 없으므로 맘 편히 PASS
핵심 요약:
1. 보라색 루틴에 의해 해당 루틴의 중요성을 감지 한다.
2. 공포의 아무것도 안 한채 Return 을 일으키는 cond_0 루틴의 심각성을 인지
3. 도중 피할수 없는 cond_0 루틴 좌절하지 말고... 절때 회피 신공 goto :cond_1 님의 도움을 받는다.
4. cond_2는 아름다운(?) unlock 구간임을 인지
5. 그 이하엔 cond_0 루틴이 없어 안심...
유사 루틴이 다른 smail 파일 에도 있으니 비슷한 방법으로 제거 하면 됩니다
참고로 한 손 가락안에 들어올 정도로 몇 개 없습니다
.method private u()V
.locals 5
const/4 v3, 0x1
const/4 v0, 0x0
iput-boolean v0, p0, e:Z
:try_start_0
invoke-virtual {p0}, getPackageManager()Landroid/content/pm/PackageManager;
move-result-object v0
invoke-virtual {p0}, getPackageName()Ljava/lang/String;
move-result-object v1
const/16 v2, 0x40
invoke-virtual {v0, v1, v2}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
move-result-object v1
if-eqz v1, :cond_0
iget-object v2, v1, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;
if-eqz v2, :cond_0
iget-object v2, v1, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;
array-length v2, v2
if-ge v2, v3, :cond_1
goto :cond_1
:cond_0
:goto_0
return-void
:cond_1
invoke-virtual {p0}, getResources()Landroid/content/res/Resources;
move-result-object v2
sget v3, Lcom/x0/strai/frep/kt;->apkmd5:I
invoke-virtual {v2, v3}, Landroid/content/res/Resources;->getText(I)Ljava/lang/CharSequence;
move-result-object v2
if-eqz v2, :cond_0
invoke-virtual {p0}, getPackageName()Ljava/lang/String;
move-result-object v3
const-string v4, "com.x0.strai.frepkey"
invoke-virtual {v0, v3, v4}, Landroid/content/pm/PackageManager;->checkSignatures(Ljava/lang/String;Ljava/lang/String;)I
move-result v0
if-nez v0, :cond_2
invoke-interface {v2}, Ljava/lang/CharSequence;->toString()Ljava/lang/String;
move-result-object v0
iget-object v1, v1, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;
const/4 v2, 0x0
aget-object v1, v1, v2
invoke-virtual {v1}, Landroid/content/pm/Signature;->toByteArray()[B
move-result-object v1
invoke-static {v1}, Lcom/x0/strai/frep/kz;->b([B)Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_2
invoke-virtual {p0}, d()Z
move-result v0
if-eqz v0, :cond_2
invoke-virtual {p0}, b()Z
move-result v0
if-nez v0, :cond_2
const/4 v0, 0x1
iput-boolean v0, p0, e:Z
:cond_2
iget-object v0, p0, b:Landroid/content/SharedPreferences;
invoke-interface {v0}, Landroid/content/SharedPreferences;->edit()Landroid/content/SharedPreferences$Editor;
move-result-object v0
const-string v1, "unlockstate"
invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
move-result-wide v2
invoke-interface {v0, v1, v2, v3}, Landroid/content/SharedPreferences$Editor;->putLong(Ljava/lang/String;J)Landroid/content/SharedPreferences$Editor;
move-result-object v0
invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->commit()Z
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0
goto :goto_0
:catch_0
move-exception v0
goto :goto_0
.end method
공유좀 부탁드려요