TGViewer
ReverseEngineering ReverseEngineering @reverseengine · 1.33K subscribers
Post #1866 46
Pointer Aliasing

تا اینجا فهمیدیم داده میتونه از Register بره داخل Memory و دوباره از طریق Pointer برگرده

حالا یک مشکل مهم تر داریم

ممکنه دو Pointer مختلف به یک قسمت از Memory اشاره کنن

مثلا:
int value = 100;

int *p = &value;
int *q = &value;

اینجا p و q دو Pointer مختلف هستن

ولی هر دو به یک Memory اشاره میکنن

value
|
0x5000
/ \
/ \
p q

پس اگر این کار رو انجام بدیم

*p = 200;

مقدار value تغییر میکنه

و وقتی بعدا این رو بخونیم

printf("%d", *q);

مقدار 200 رو میبینیم

چون p و q در واقع به یک محل اشاره میکنن

به این وضعیت میگیم

Pointer Aliasing

این موضوع برای Reverse Engineering خیلی مهمه

چون ممکنه داخل یک تابع ببینید

mov [rax], 200

و چند خط پایین‌ تر ببینید

mov ecx, [rbx]

در نگاه اول ممکنه فکر کنید این دو دستور هیچ ارتباطی ندارن

ولی اگر

RAX = 0x5000
RBX = 0x5000

باشه

هر دو دارن با یک Memory مشترک کار میکنن

RAX ─────┐
↓
0x5000
↑
|
RBX ─────┘

پس تغییر از طریق RAX میتونه مستقیما روی چیزی که از طریق RBX خونده میشه اثر بذاره

اینجا Data Flow دیگه فقط بین Register ها نیست

باید رابطه Pointer ها و Memory Address ها رو هم دنبال کنید

یک مثال ساده‌ تر

int value = 10;

int *p = &value;
int *q = p;

*p = 50;

int x = *q;

مسیر واقعی داده

value
↓
p
↓
q
↓
Memory
↓
50
↓
x

اما از نظر Address

p ──┐
├──> value
q ──┘

پس p و q دو مسیر متفاوت برای رسیدن به یک داده هستن

در Reverse Engineering

وقتی با Pointerها کار میکنید فقط نپرسد

این Pointer کجاست؟

باید بپرسید

این Pointer به کجا اشاره میکنه؟

چه Pointer های دیگه‌ ای ممکنه به همین Address اشاره کنن؟

چه کسی مقدار اون Memory رو تغییر داده؟

چه کسی بعدا اون مقدار رو خونده؟

این سوال‌ها کمک میکنن ارتباط‌ هایی رو پیدا کنی که از روی Control Flow معمولی مشخص نیستن

تمرین:

این کد رو بررسی کنید

int value = 10;

int *p = &value;
int *q = p;

*p = 100;

int result = *q;

مسیر Data Flow رو رسم کنید

value
↓
p
↓
q
↓
*p = 100
↓
*q
↓
result

بعد مشخص کن چرا result برابر 100 میشه

در مرحله بعد میریم سراغ یک موضوع مهم‌تر


Memory Aliasing
در توابع مختلف

اونجا دیگه دو Pointer داخل یک تابع نداریم

یک تابع Memory رو تغییر میده و یک تابع دیگه از طریق Pointer متفاوت همون Memory رو میخونه

و دقیقا همینجا تحلیل Data Flow در باینری‌ های واقعی شروع میکنه به دردسر درست کردن

@reverseengine
More from @reverseengine
  1. Oct 15, 2026Reverse Engineer Anything v6.5.0 A tool for reverse engineering that allows AI agents to a…
  2. Oct 15, 2026Someone Used AI to Reverse-Engineer PS5 Security in Weeks: What Is REA? https://pub.toward…
  3. Oct 15, 2026How Dangerous Is REA (Reverse Engineer Anything) for Your App? https://21zerixpm.medium.co…
  4. Oct 15, 2026REA Is Impressive. But Reverse Engineering Was Never the New Part https://crizantlai.mediu…
  5. Oct 15, 2026QuarkslaB Dynamic binary Instrumentation https://qbdi.quarkslab.com/introduction @reversee…
  6. Oct 15, 2026angr’s documentation https://docs.angr.io/en/latest/search.html?q=Document&check_keywords=…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →