REA và Claude Code reverse engineer một app thật trong 22 phút
Thử REA cùng Claude Code trên app Bruno: server app gọi tới, telemetry, setting HTTPS mặc định, giới hạn của report và ba cảnh báo khi dùng.
✓ Đã duyệt độc lập · cập nhật 17/10/2026 · 9 min
1. Repo ai cũng nhắc tới, và một bài thử với đúng một câu hỏi
Video mở đầu bằng một repo open source mới: nó cho phép AI coding agent của bạn, dù là Claude Code, Codex hay Cursor, tháo rời một app mà agent chưa từng thấy source code, tìm ra app đó đang làm gì ở hậu trường (behind the scenes), và đưa bằng chứng (evidence) cho từng câu trả lời. Repo đó tên là REA, viết tắt của Reverse Engineer Anything, và đã vượt mốc 150.000 sao trên GitHub.

morluto/rea: "One MCP for reverse engineering across binaries, applications, and runtime behavior", huy hiệu "#1 Repository Of The Day" trên GitHub Trending, và lệnh cài npx rea-agents setup ở giữa trang.Trên màn hình, bộ đếm sao của morluto/rea chạy tới 148.240, kèm một đồ thị gần như nằm phẳng suốt tháng 8 và tháng 9 rồi vọt thẳng lên: khoảng 10 nghìn sao vào ngày 7/10, 119 nghìn vào ngày 12/10, rồi chạm vạch 150 nghìn.
Người làm video muốn biết chuyện này là thật hay chỉ là hype. Nên anh cài một app, đưa cho Claude và REA không gì khác ngoài đúng những file đi kèm bản phát hành của app đó, rồi hỏi một câu duy nhất: bạn đang làm gì ở hậu trường?
Khoảng 22 phút và 81 cent sau, anh có trong tay một bản report liệt kê mọi server mà app nói chuyện cùng, mọi setting nó giấu, và vài thứ anh chắc chắn không ngờ tới. Sau đó anh mở app thật lên và theo dõi network của nó, và chỉ trong vài giây, app bắt đầu tra (look up) đúng những server mà report đã gọi tên.

REPORT.md trong ba cột: Servers (appinfo.usebruno.com, us.i.posthog.com, license-api.usebruno.com, github.com cho bản cập nhật), Settings (telemetry bật, verify TLS tắt, mock server bật, AI assistant tắt) và Surprises (WOOF với header x-good-boy: true, "and a few more").Anh hứa trong video sẽ cho xem REA thật sự làm gì, phần nào hoá ra đúng, phần nào không, và một setting mà theo anh mọi developer nên kiểm tra ngay hôm nay.
2. REA thực chất là gì, và không phải là gì
Trước hết là REA thực chất là gì, vì rất nhiều bài đăng về nó hiểu sai. Mọi thứ bắt đầu từ lời giới thiệu trong README: bạn thấy một feature trong một app nào đó, bạn nhờ agent của mình điều tra nó, và agent tìm ra feature đó được xây thế nào mà không cần nhìn thấy source code; nó thậm chí còn có thể giúp bạn build một phiên bản của riêng bạn. Trên màn hình, đoạn này được minh hoạ bằng bước "01 Find a feature": một nút Send trong app được khoanh lại với nhãn "A feature you like".
Về mặt kỹ thuật, REA là một MCP server kèm một command line tool. Anh giải thích MCP về cơ bản là một cái "phích cắm" cho phép AI agent dùng các tool bên ngoài. Vì vậy REA chạy được với Claude Code, Codex, Cursor và gần như mọi thứ khác nói được MCP. Nó có thể nhìn vào desktop app, Android app, website, firmware, và cả những chương trình đã được compile xuống mã máy (machine code).
Một điều người ta hay hiểu sai: REA không trả lại cho bạn source code gốc. Và cũng không có gì làm được việc đó, vì một khi chương trình đã được compile thì phần code ấy đã mất. Thứ bạn nhận lại là một bản mô tả chương trình làm gì, đi cùng bằng chứng cho từng điều: mỗi phát hiện đến từ đâu, và có những gì nó không tìm ra được.
Trên màn hình là dòng chữ "REA ≠ DECOMPILER". REA bản thân nó không phải là một decompiler. Nó bọc (wrap) các tool mà dân reverse engineering vẫn dùng sẵn: Ghidra (miễn phí), Hopper, và IDA Pro (cái đắt tiền). Bên trên các tool đó, nó đưa cho agent của bạn khoảng 170 tool để gọi.
3. Cài đặt: một lệnh setup có hỏi trước khi sửa
Cài REA là một lệnh duy nhất. Lệnh này cho bạn xem một kế hoạch (plan), sao lưu config hiện có, và hỏi trước khi thay đổi bất cứ thứ gì. Theo README của repo, lệnh đó là:
npx rea-agents setup

~/.claude.json, có bản backup), CREATE Codex (~/.codex/config.toml), UPDATE Cursor (~/.cursor/mcp.json, có backup), INSTALL skill reverse-engineering của REA. REA giữ nguyên config không liên quan, không cài hay nâng cấp Node.js, npm, Homebrew, Java hay Ghidra, rồi hỏi "Apply these 5 changes?".Dù vậy, anh không dùng đường đó: anh cắm REA vào qua một file config riêng, để setup bình thường của mình không bị đụng tới.
4. Chọn Bruno và prompt năm câu hỏi
Để thử, anh cần một app mà mình được phép tháo rời. Anh chọn Bruno, một API client open source, về cơ bản là bản thay thế miễn phí cho Postman mà rất nhiều developer dùng hằng ngày.

Anh tải bản phát hành Linux chính thức, kiểm checksum, rồi giải nén ra, để AI không có gì ngoài đúng những file đi kèm bản phát hành: không GitHub, không Internet.
Sau đó anh đưa năm câu hỏi trong một prompt duy nhất: app liên lạc với những server bên ngoài nào và khi nào; nó có thu thập telemetry không và chính xác gửi gì đi; những feature nào bị ẩn hoặc tắt sẵn theo mặc định; nó lưu gì trên ổ đĩa của bạn; và điều gì sẽ làm một người dùng bình thường bất ngờ. Anh còn yêu cầu nó đưa bằng chứng cho từng câu trả lời. Prompt trên màn hình:
Use REA to find out what this app does behind the scenes. I want to know: 1. Which outside servers the app contacts, and when. 2. Whether it collects telemetry, and what exactly it sends. 3. Which features are hidden or switched off by default. 4. What it stores on your disk. 5. What would surprise an everyday user. Show the evidence for every single answer.
5. REA vẽ bản đồ, Claude viết report trong 22 phút
Việc đầu tiên REA làm là vẽ một bản đồ (map) của app. Với Bruno, nó parse 137 file của chương trình chính, tìm ra 4 cửa sổ, và 347 message chạy qua lại giữa các phần khác nhau của app, mà không bị nghẹn ở file nào.

analyze_javascript_application của REA trên thư mục ~/rea-lab/input/src. Kết quả: 137 files parsed, 4 browser windows, 347 messages between the parts (IPC).Sau đó Claude cầm bản đồ ấy và bắt đầu đọc những phần quan trọng. Khoảng 22 phút sau, với tổng chi phí 81 cent, nó đã viết xong report. Anh thừa nhận chính tốc độ đó là một phần khiến cả chuyện này có cảm giác hơi khó tin.
6. App liên lạc với những server nào, và gửi gì đi
Câu trả lời đầu tiên là danh sách server. Đứng đầu là PostHog, một dịch vụ analytics, mà app liên lạc khi khởi động, lặp lại mỗi 24 giờ, và khi bạn thoát app.

session_activity liệt kê các bộ đếm gộp và config flag: requests sent, requests per HTTP method, collections opened, git usage, AI feature on or off.Bước kiểm anh thích nhất: report chỉ đọc code, nên anh mở app thật với một profile mới tinh và ghi lại những tên miền nó tra. Ngay lúc khởi động, app hỏi tới us.i.posthog.com và appinfo.usebruno.com, chính là server thứ hai mà report đã nêu tên.

appinfo.usebruno.com và us.i.posthog.com; lệnh tiếp theo lọc gói tin đầu tiên gửi đi trong log.Còn về nội dung gửi đi, report nói đó là các con số đếm và setting: bạn đã gửi bao nhiêu request, dùng những HTTP method nào, đã mở bao nhiêu collection, và bạn có dùng Git hay feature AI hay không. Report cũng nói nó không tìm thấy URL, header, request body hay key nào bị gửi ra ngoài.
7. Vì sao công tắc opt-out không chặn được hết
Anh muốn công bằng ở điểm này: có một công tắc tắt telemetry nằm ngay trong Preferences, nên đây không phải một trò giấu giếm. Nhưng gạt công tắc đó xuống không dừng được mọi thứ.
Lý do thứ nhất: app vẫn kiểm tra một server thông báo (notification server) mỗi sáu giờ và gửi kèm phiên bản của nó. Lý do thứ hai: phần kiểm tra license gửi đi một machine ID, tên máy (host name) của bạn khi bạn kích hoạt, và chính cái ID ẩn danh mà analytics đang dùng. Điều đó có nghĩa là hai bộ dữ liệu có thể được ghép lại với nhau.

telemetry.enabled: true trong src/store/preferences.js; "With telemetry switched off, three things still go out". File notifications.js không hề kiểm isTelemetryEnabled và đặt setInterval với SIX_HOURS_MS; license.js lấy machineIdSync(), os.hostname() và appDistinctId, tức anonymousTrackingId mà PostHog dùng. Dòng cuối: lời gọi feature flag "onboarding-import-options" không có bước kiểm telemetry.Report còn đánh dấu thêm một lời gọi nữa: một thí nghiệm onboarding (onboarding experiment), mà nó cho rằng vẫn chạy kể cả khi telemetry đã tắt. Tuy nhiên report chỉ gắn cho điểm này mức tin cậy trung bình (medium confidence).
8. Một setting nên kiểm ngay hôm nay: chứng chỉ HTTPS
Rồi tới phát hiện mà anh cho là mọi developer nên kiểm tra ngay hôm nay: mặc định khi mới cài, app này không xác minh chứng chỉ HTTPS (HTTPS certificate). Anh tự kiểm lại trong code, và giá trị mặc định của setting đó đúng là false.

cert-utils.js, nếu shouldVerifyTls() trả về false thì rejectUnauthorized bị đặt thành false; trong preferences.js, shouldVerifyTls đọc request.sslVerification với mặc định false. Dòng tô vàng: một server self-signed.local có chứng chỉ INVALID, nhưng request vẫn được chấp nhận chứ không bị chặn.Nghĩa là một request gửi tới server có chứng chỉ hỏng sẽ được chấp nhận thay vì bị chặn lại. Điều này có thể tiện khi bạn đang test với một server local, nhưng đáng biết trước khi bạn gửi đi bất cứ thứ gì thật.
9. Phần vui: method WOOF và các tính năng ẩn
Sau đó report tìm ra những thứ vui. Có một HTTP method bí mật tên là WOOF: nó không gửi gì cả, chỉ trả về một chú chó nhỏ vẽ bằng ký tự ASCII, kèm một header ghi rằng x-good-boy là true.

src/utils/woof.js chứa "Woof! Woof!", statusText: 'Woof!', một chú chó vẽ bằng ký tự và 'x-good-boy': 'true'. Dòng cuối cho thấy 'mock-server': true trong preferences.js.Ngoài ra còn có một mock server bật sẵn theo mặc định, một AI assistant tắt sẵn theo mặc định, và một updater cài bản mới một cách lặng lẽ khi bạn thoát app.
Report cũng để ý rằng cửa sổ chính chạy với nodeIntegration bật. Một người làm security sẽ muốn xem kỹ chỗ này, nhưng anh nói rõ mình chỉ chỉ ra điểm đó chứ không gọi nó là một lỗ hổng (flaw).
10. Phần trung thực: report không hoàn hảo
Giờ tới phần thẳng thắn, vì report này không hoàn hảo, và chính AI cũng nói vậy. Nó chỉ đọc code và không chạy bất cứ thứ gì. Bản đồ của REA chỉ phủ được một phần (partial) ở vài file lớn. Nó không biết một trong các server được dùng để làm gì. Và nó thừa nhận đã không audit các thư viện đóng gói bên trong app, nên danh sách những gì có trong đó chỉ là mức sàn chứ không phải mức trần ("a floor, not a ceiling").

ai.enabled:false), autoUpdater.autoInstallOnAppQuit = true, nodeIntegration: true ở hai chỗ trong src/index.js, và câu "Pointing it out, not calling it a flaw." Phía dưới là mục 6 của report, "What I could not determine": không chạy live traffic, REA chỉ phủ một phần vài file lớn, chưa rõ một server dùng làm gì, thư viện đóng gói chưa được audit.Anh cũng nói rõ cách mình kiểm: anh tự đọc source cho những khẳng định quan trọng, gồm giá trị mặc định của telemetry, giá trị mặc định của việc kiểm chứng chỉ, method WOOF, lần poll server thông báo, và dữ liệu license, và tất cả đều khớp. Anh bắt được app thật tra hai trong số các server, nhưng anh không nhìn được vào bên trong traffic đã mã hoá. Vì vậy những gì thực sự rời khỏi máy bạn là điều không ai chứng minh được từ bên ngoài, kể cả anh.
Còn về bản thân REA: trong 33 lần gọi tool, nó chỉ chiếm 3. Nên thứ bạn thật sự đang xem là một AI rất giỏi đọc code, được một bản đồ rất tốt chỉ đúng chỗ cần đọc. Điều đó hữu ích, nhưng không phải phép màu; màn hình kết lại bằng dòng chữ "Useful. Not magic."
11. Điều này có nghĩa gì với người dùng và người làm phần mềm
Ý nghĩa của tất cả chuyện này là giờ đây bất cứ thứ gì bạn cài hay ship đều có thể bị chất vấn theo cách này. Nếu bạn dùng phần mềm, cuối cùng bạn cũng có thể hỏi một tool xem phần mềm đó đang làm gì trước khi giao cho nó một mật khẩu.
Còn nếu bạn ship phần mềm, bạn nên giả định rằng agent của ai đó có thể đọc mọi thứ bên trong nó, kể cả mọi key mà bạn đặt vào đó. Trên màn hình là ví dụ một file code "inside your app" có một hằng số API_URL và một hằng số API_KEY viết thẳng trong code, với nhãn "Readable" và dòng chữ "Every key you put there."
Một secret nằm bên trong app chỉ giúp bạn câu thêm thời gian, và thứ một app không thể làm lộ là thứ nó không bao giờ nhận được. Vì vậy những bước kiểm tra và những key thật sự quan trọng thuộc về một nơi bạn kiểm soát, bên ngoài app.
12. Ba lời cảnh báo: bản giả, không phải sandbox, và chuyện pháp lý
Anh có ba lời cảnh báo.
Thứ nhất là bản sao giả (fake copies). Khi một repo bùng nổ như thế này, các bản sao bắt đầu xuất hiện. Anh tìm thấy một bản có 0 sao, được tạo đúng trong ngày hôm đó, với README nhồi đầy từ khoá tìm kiếm và bảo bạn tải về một file zip, trong khi trang releases của nó trống trơn. Anh không chứng minh được nó độc hại và cũng không xác minh được nó, nên đừng chạy nó. Bản thật cài từ npm, và người publish ở đó chính là tác giả. Vậy nên hãy kiểm tên chủ sở hữu (owner's name) trước khi cài bất cứ thứ gì đang trending.

rea-agents (bản 6.4.0, MIT), lệnh cài npm i rea-agents, mục Repository trỏ về github.com/morluto/rea, kèm dòng chữ "Check the owner's name."Thứ hai, đây không phải sandbox. Một số tool của REA chạy chính thứ bạn trỏ nó vào, với quyền của bạn. Nên đừng nhắm nó vào một chương trình ngẫu nhiên tải từ forum nào đó. Hãy giữ các prompt xin phê duyệt (approval prompt) của agent ở trạng thái bật, và làm như anh đã làm: chạy mọi thứ trong một thư mục tách biệt.
Thứ ba là khía cạnh pháp lý. Anh nói rõ mình không phải luật sư và đây không phải tư vấn pháp lý. Nhưng tháo rời phần mềm bạn không sở hữu có thể vi phạm điều khoản sử dụng của nó, và phá cơ chế chống sao chép (copy protection) lại là một vấn đề riêng nữa. Đó là lý do anh chọn một app open source, và là lý do app của chính bạn, phần mềm open source, và những thứ bạn được phép test là vùng an toàn.
Anh kết lại: đó là những gì REA tìm ra trong một app mà rất nhiều developer dùng hằng ngày. Rồi anh hỏi người xem: nếu được trỏ nó vào bất kỳ app nào trên máy của mình, bạn sẽ chọn app nào đầu tiên? Anh mời mọi người trả lời ở phần bình luận, và hứa sẽ chạy thử những đề xuất hay nhất.
Nguồn và liên kết 7 nguồn
- Tên gốc: REA + Claude Code Reverse Engineered a Real App in 22 Minutes
- Sự kiện: YouTube
- Video gốc: https://www.youtube.com/watch?v=adElWDUZQ_Q youtube.com
- Kênh YouTube SoftsWeb (SoftsWeb): youtube.com/channel/UCBLw-HTM5BQc_FVvZ4MOHRQ youtube.com
- REA: Reverse Engineer Anything, repo chính thức (README có lệnh setup, danh sách agent được hỗ trợ và cảnh báo chỉ tải từ nguồn chính thức): github.com/morluto/rea github.com
- Gói npm
rea-agents, nơi cài bản thật của REA: npmjs.com/package/rea-agents npmjs.com - Bruno, API client open source được dùng để thử: github.com/usebruno/bruno github.com