본문 바로가기

카테고리 없음

ㅂㅂ

## 핵심 답변

**또 다른 JavaScript 함수 오류가 있습니다!** `Memory.writeU8().add()` 체인이나 다른 함수 호출에 문제가 있습니다. 가장 기본적인 형태로 다시 작성하겠습니다.

## 확실한 정보

### 완전히 단순화된 안전한 코드

```python
import frida
import sys
import os

executable = "mail.exe"

if not os.path.exists(executable):
    print(f"❌ {executable} 파일이 없습니다.")
    sys.exit(1)

try:
    print(f"🚀 {executable} 실행 중...")
    
    device = frida.get_local_device()
    pid = device.spawn([executable])
    session = device.attach(pid)
    print(f"✅ 프로세스 생성 및 연결 완료 (PID: {pid})")
    
    # 베이스 주소만 가져오기
    base_script = session.create_script("""
        var modules = Process.enumerateModules();
        send(modules[0].base.toString());
    """)
    
    base_address = None
    def get_base(message, data):
        global base_address
        if message['type'] == 'send':
            base_address = message['payload']
            print(f"🎯 베이스 주소: {base_address}")
    
    base_script.on('message', get_base)
    base_script.load()
    
    import time
    time.sleep(0.5)
    base_script.unload()
    
    if base_address:
        # 주소 계산
        ghidra_addr = 0x406688
        ghidra_base = 0x400000
        real_base = int(base_address, 16)
        
        offset = ghidra_addr - ghidra_base
        real_address = real_base + offset
        
        print(f"📊 실제 주소: 0x{real_address:x}")
        
        # 극도로 단순화된 패치 코드
        patch_script = session.create_script(f"""
        var addr = ptr("0x{real_address:x}");
        
        console.log("패치 시작");
        
        // 현재 바이트
        var b1 = Memory.readU8(addr);
        var b2 = Memory.readU8(ptr(addr.toInt32() + 1));
        var b3 = Memory.readU8(ptr(addr.toInt32() + 2));
        
        console.log("현재: " + b1.toString(16) + " " + b2.toString(16) + " " + b3.toString(16));
        
        // 권한 변경
        Memory.protect(addr, 3, "rwx");
        
        // 패치
        Memory.writeU8(addr, 0x31);
        Memory.writeU8(ptr(addr.toInt32() + 1), 0xC0);
        Memory.writeU8(ptr(addr.toInt32() + 2), 0x90);
        
        // 확인
        var n1 = Memory.readU8(addr);
        var n2 = Memory.readU8(ptr(addr.toInt32() + 1));
        var n3 = Memory.readU8(ptr(addr.toInt32() + 2));
        
        console.log("수정: " + n1.toString(16) + " " + n2.toString(16) + " " + n3.toString(16));
        
        if (n1 == 49 && n2 == 192 && n3 == 144) {{
            console.log("성공");
            send("OK");
        }} else {{
            console.log("실패");
            send("FAIL");
        }}
        """)
        
        def on_patch(message, data):
            if message['type'] == 'send':
                result = message['payload']
                if result == "OK":
                    print("✅ 패치 성공!")
                else:
                    print("❌ 패치 실패")
        
        patch_script.on('message', on_patch)
        patch_script.load()
        
        time.sleep(1)
    
    # 프로세스 실행
    device.resume(pid)
    print("\n▶️ 프로그램 실행됨!")
    
    try:
        input("종료하려면 Enter...")
    except KeyboardInterrupt:
        print("\n⏹️ 종료")

except Exception as e:
    print(f"❌ Python 오류: {e}")

finally:
    try:
        if 'session' in locals():
            session.detach()
        if 'device' in locals() and 'pid' in locals():
            device.kill(pid)
        print("🧹 정리 완료")
    except:
        pass
```

## 주요 수정사항

1. **`.add()` 함수 제거** → `ptr(addr.toInt32() + 1)` 사용
2. **복잡한 함수 체인 제거** → 단순한 산술 연산
3. **엄격한 비교 제거** → 숫자 직접 비교 (49 = 0x31, 192 = 0xC0, 144 = 0x90)
4. **모든 고급 JavaScript 기능 제거** → 기본 문법만 사용

## 변경된 핵심 부분

```javascript
// 문제 코드
Memory.writeU8(target.add(1), 0xC0);  // ❌ .add() 함수 오류

// 안전한 코드  
Memory.writeU8(ptr(addr.toInt32() + 1), 0xC0);  // ✅ 기본 산술
```

이제 모든 고급 JavaScript 함수를 제거하고 가장 기본적인 방법만 사용했습니다! 🔥