일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Injection
- pinpoint
- thread local storage
- tracerpid
- v8 tracing
- android inject
- pthread
- tracing
- Obfuscator
- LLVM
- so inject
- LLVM Obfuscator
- uftrace
- apm
- v8 optimizing
- OSR
- Linux packer
- on-stack replacement
- 난독화
- anti debugging
- linux thread
- 안티디버깅
- LLVM 난독화
- on stack replacement
- custom packer
- TLS
- Linux custom packer
- Android
- initial-exec
- linux debugging
- Today
- Total
Why should I know this?
[TODO] possiblyBits(???) 추가하기 본문
LLVM 에서 제공하는 비트 연산은 다음같은 연산을 추정하는데 한계가 있다.
x == ~x
x는 ~x와 같을 수 없다. false가 되야 한다.
이를 비트로 바꿔말하면,
x에 가용한 비트 조합과 ~x의 가용한 비트 조합 간에 일치되는 조합이 없다고 할 수 있다.
PossiblyBit Pb = PossiblyBit(X).matchPossiblyBit(PossiblyBit(~X));
; Pb == nullptr
이에 연장으로 x s< ~x 는 어떨까?
이 연산은 x 의 Signbit 가 세팅되어 있는지 여부인지가 중요하다.
만약 x에
SignBit가 세팅되어 있다면, x s< ~x 는 true 이고,
SignBit가 세팅되지 않았다면, x s< ~x 는 false 이다
signbit를 검사하는 것으로 단순화 할 수 있다.
x s< 0 이렇게
즉, x와 ~x 의 비교문에서 x와 ~x는 식 자체가 말하듯 한 쪽의 PossiblyBit에 최상위 부호비트가 set되면
반대편의 식의 PossiblyBit에는 최상위 부호비트가 set되지 않는다.
그렇다면 두 값의 비교문은, 최상위 부호비트의 여부를 비교하는 것으로 단순화 할 수 있다.
PossiblyBit Pb = PossiblyBit(X).calculateMaxDiffBit(PossiblyBit(~X))
; Pb = signedMaxValue
다음.
x&y == 0 ? x|y : x^y
위 식은 x^y 로 단순화 할 수 있다.
x&y == 0 이란 연산 결과는, x와 y에 공통으로 활성화된 비트가 없다는 것을 의미한다.
그렇다면 true 에 있는 x | y 연산은 x = 1, y = 1 이 제거된 x | y 연산이고, 그 결과는 x ^ y와 같다.
false일 때는 어차피 x ^ y 이므로 동일 연산.
그러므로 x&y == 0 ? x|y : x^y --> x ^ y 이다.
똑같은 말을, PossiblyBit로표현하면,
x&y == 0 일 때의 x와 y 각각의 possiblyBit는
x = 0, y = {0, 1} --> 0
x = 1, y = 0 --> 0
x = {0, 1}, y = 0 --> 0
로 표현할 수 있다. Possibly(X&Y==0) 의 결과 PossiblyBit이다.
본래 x|y의 possiblyBits는 다음과 같다.
x = 0, y = 0 -> 0
x = {0, 1}, y = 0 -> 1
x = 1, y = {0, 1} -> 1
x = 1, y = 1 -> 1
그러나 여기서 x & y == 0 의 PossiblyBit에 x = 1, y = 1 은 포함되지 않는다.
PossiblyBit("X&Y==0").caculatePossiblyBit("X|Y") 와 같이 함수를 호출했다고 가정하면 결과가 반영될 것이다.
x = 0, y = 0 --> 0
x = 1, y = 0 --> 1
x = 0, y = 1 --> 1
x&y != 0 일 때, x와 y 각각의 possiblyBit는
x = 0, y = 0 --> 0
x = 1, y = 0 --> 0
x = 0, y = 0 --> 0
x = 1, y = 1 --> 1
x&y != 0 일 때, x^y의 possiblyBits는 다음과 같다.
x = 0, y = 0 --> 0
x = 1, y = 0 --> 1
x = 0, y = 1 --> 1
x = 1, y = 1 --> 0
PossiblyBit("X&Y!=0").caculatePossiblyBit("X^Y") 와 같이 함수를 호출했다고 가정하면 결과가 반영될 것이다.
x = 0, y = 0 --> 0
x = 1, y = 0 --> 1
x = 0, y = 1 --> 1
x = 1, y = 1 --> 0
의 결과는 X^Y에 모두 포함되므로 이는 단순화 될 수 있다.
그리고 두 식의 단순화 PossiblyBit는 XOR의 PossiblyBit와 동일하다.
"x&y == 0 ? x|y : x^y --> x ^ y "
PossiblyBit("X&Y==0").caculatePossiblyBit("X|Y")
isPartOf
PossiblyBit("X&Y!=0").caculatePossiblyBit("X^Y")
possiblyBit Pb = PossiblyBit.simplify(
PossiblyBit("X&Y==0").caculatePossiblyBit("X|Y"),
PossiblyBit("X&Y!=0").caculatePossiblyBit("X^Y"));
PossiblyBit.CreateNewOp(Pb);
--> X ^ Y
문제는 LLVM에는 이런 비트 연산을 할 수 있는 방법이 현존하지 않는다.
위 두 문제를 단순화 하기 위해 PossiblyBit (가칭) 을 만들 것을 제한하려는 이유이다.
PossiblyBit 함수의 목적은 다음과 같다.
-.. 어떤 변수(혹은 식)의 비교연산 구문에서,
-.. 좌측과 우측에 공통의 항목이 존재할 때
1. 공통의 항목이 가진 가능한 비트 조합 범위 내에서 좌항과 우항이 단순화 될 수 있는 여부를 판단하는 기능.
2. 공통의 비트 조합이 나올 수 있는 단순화 된 연산 조합의 생성 기능.
'LLVM-STUDY > TODO' 카테고리의 다른 글
[TODO] ConstantRange (0) | 2023.12.12 |
---|---|
[TODO] MemorySSAAnalysis (0) | 2023.11.07 |
[TODO] Metadata & Attribute (0) | 2023.11.06 |
[TODO] MemorySSA = MSSA (0) | 2023.11.06 |
[TODO] 목록 (0) | 2023.11.02 |