TGViewer
ReverseEngineering ReverseEngineering @reverseengine · 1.33K subscribers
Post #1746 70
Backward Slicing
یعنی از نتیجه برگردید به عقب

تا اینجا در Data Flow Analysis یاد گرفتیم داده از کجا وارد میشه و چه مسیری رو طی میکنه

Backward Slicing
دقیقا برعکسشه
اینجا از یک نقطه مهم شروع میکنیم و برمیگردیم عقب تا بفهمیم چه چیزهایی باعث به وجود اومدن اون نتیجه شدن

مثلا فرض کنید این کد رو داریم:
C++
int process(int a, int b)
{
int x = a + b;
int y = x * 2;

int junk = 500;
junk ^= 123;

return y;
}



اگر هدفمون return y باشه از y شروع میکنیم

می‌پرسیم:
y
از کجا اومده?

جواب:

y = x * 2

پس حالا باید بفهمیم x از کجا اومده

x = a + b

پس a و b روی خروجی تاثیر دارن
حالا اگر به junk نگاه کنیم میبینیم هیچ مسیری به y یا خروجی نداره

پس در این تحلیل میتونیم فعلا کامل نادیده‌اش بگیریم

مسیر Backward Slice این شکلیه:

Return y
↑
y = x * 2
↑
x = a + b
↑ ↑
a b

این روش مخصوصا وقتی با یک تابع خیلی بزرگ و شلوغ طرفید فوق‌العاده کاربردیه
چون لازم نیست از اول تابع تا آخرش همه چیز رو تحلیل کنید اول مشخص میکنید دنبال چی هستید

مثلا:
نتیجه یک شرط
مقدار خروجی
یک آدرس مهم
یک مقدار نوشته‌شده در حافظه
یا یک تابع مهم
بعد از همون نقطه شروع میکنید و به عقب برمیگردید
فرض کنید داخل دیس‌اسمبل این رو میبینید:

cmp eax, 1
jne failed

سوال مهم این نیست که فقط jne کجا میره

اول باید بپرسید:
مقدار EAX قبل از این مقایسه از کجا اومده؟
ممکنه چند دستور قبل:

call check_value

وجود داشته باشه
حالا باید برگردید و ببینید check_value چی برمیگردونه
یا شاید EAX از یک محاسبه طولانی اومده باشه
در این حالت Backward Slicing کمک میکنه فقط دستورهایی رو بررسی کنید که واقعا روی مقدار نهایی EAX تأثیر دارن
این کار توی برنامه‌های Obfuscate شده خیلی مهمه چون ممکنه دور یک شرط مهم صد تا دستور اضافی وجود داشته باشه
اما شاید فقط ده دستور واقعا روی نتیجه اون شرط تاثیر بذارن هدف Backward Slicing دقیقا پیدا کردن همین دستوره
یک نکته مهم اینه که باید فقط دنبال وابستگی مستقیم نباشید
مثلا:

A
روی B تاثیر می‌ذاره

B
روی C

C روی نتیجه

پس A هم بخشی از Slice محسوب میشه حتی اگر مستقیم به نتیجه وصل نباشه

تمرین:

این تابع رو بررسی کنید:
C
int verify(int input)
{
int a = input * 2;
int b = a + 15;

int temp = 100;
temp += 50;

int result = b ^ 0x33;

return result;
}



از return result شروع کنید و به عقب برگردید مشخص کنید کدوم متغیر ها واقعا روی خروجی تاثیر دارن
بعد مسیرش رو روی کاغذ رسم کنید

input
↓
a
↓
b
↓
result
↓
return

temp
رو هم بررسی کنید میبینید که وجود داره و چند عملیات روش انجام میشه ولی هیچ اثری روی خروجی نداره و دقیقا همینجاست که Backward Slicing به ما کمک میکنه وسط تعداد زیاد کد از کد مستقیم بریم سراغ چیزی که واقعا مهمه

@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 →