الفريق العربي للهندسة العكسية
تغير قيمة ثابتة - نسخة قابلة للطباعة

+- الفريق العربي للهندسة العكسية (https://www.at4re.net/f)
+-- قسم : منتديات الهندسة العكسية - Reverse Engineering Forums (https://www.at4re.net/f/forum-4.html)
+--- قسم : الأسئلة والإستفسارات، حلول المشاكل و تبادل الخبرات - Expert Exchange Newbie Questions Answers (https://www.at4re.net/f/forum-36.html)
+--- الموضوع : تغير قيمة ثابتة (/thread-273.html)

الصفحات: 1 2 3 4 5


RE: تغير قيمة ثابتة - offset - 12-01-2019

(12-01-2019, 04:49 PM)هـآوي كتب : وجدت المكان التي تظهر به القيمة وبعد كتابة mov edx واقوم بالتشغيل يحدث خطا

لنأخذ التحدي من هنا للتجربة عليه:
https://www.at4re.net/f/thread-19.html

1- المكان الفارغ في نافذة Hex Dump :
 
[صورة مرفقة: p_1107lh64v1.png]

2- الكتابة في المكان الفارغ:
العنوان الجديد 0x004068BC
 
[صورة مرفقة: p_1107j3q762.png]

3- العنوان المستهدف للتعديل عليه:
في العنوان 0x00403F4A نقوم باستبدال القيمة القديمة الى يتم دفعها للذاكرة بالقيمة الجديدة و هي عنوان الكلمة Hello
PUSH 004068BC

 
[صورة مرفقة: p_11072gv0b3.png]

 4- نتم تشغيل التحدي و نضغط على زر "تحقق من التسجيل"
 
[صورة مرفقة: p_1107o9ak04.png]



نفس العملية برمجبا بالسي شارب:
 
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.IO;

public class Program {
    public static void Main() {
        STARTUPINFO si = new STARTUPINFO();
        PROCESS_INFORMATION pi = new PROCESS_INFORMATION();

        CreateProcess("AT4RE01.exe",
                      null,
                      IntPtr.Zero,
                      IntPtr.Zero,
                      false,
                      CreateSuspended,
                      IntPtr.Zero,
                      null,
                      ref si,
                      out pi);

        byte lpBuffer = Encoding.ASCII.GetBytes("Hello!");

        IntPtr lpNumberOfBytesWritten = IntPtr.Zero;

        WriteProcessMemory(pi.hProcess,
                           (IntPtr)0x004068BC,
                           lpBuffer,
                           lpBuffer.Length,
                           ref lpNumberOfBytesWritten);

        byte lpBuffer2 = {
            0x68,
            0xBC,
            0x68,
            0x40,
            0x00
        };

        lpNumberOfBytesWritten = IntPtr.Zero;

        WriteProcessMemory(pi.hProcess,
                           (IntPtr)0x00403F4A,
                           lpBuffer2,
                           lpBuffer2.Length,
                           ref lpNumberOfBytesWritten);

        ResumeThread(pi.hThread);
    }

    [DllImport("kernel32.dll")]
    static extern bool CreateProcess(string lpApplicationName,
                                     string lpCommandLine,
                                     IntPtr lpProcessAttributes,
                                     IntPtr lpThreadAttributes,
                                     bool bInheritHandles,
                                     uint dwCreationFlags,
                                     IntPtr lpEnvironment,
                                     string lpCurrentDirectory,
                                     ref STARTUPINFO lpStartupInfo,
                                     out PROCESS_INFORMATION lpProcessInformation);

    [DllImport("kernel32.dll")]
    static extern bool WriteProcessMemory(IntPtr hProcess,
                                          IntPtr lpBaseAddress,
                                          byte lpBuffer,
                                          int dwSize,
                                          ref IntPtr lpNumberOfBytesWritten);

    [DllImport("kernel32.dll")]
    private static extern uint ResumeThread(IntPtr hThread);

    public const uint CreateSuspended = 0x00000004;
}

public struct PROCESS_INFORMATION {
    public IntPtr hProcess;
    public IntPtr hThread;
    public uint dwProcessId;
    public uint dwThreadId;
}

public struct STARTUPINFO {
    public uint cb;
    public string lpReserved;
    public string lpDesktop;
    public string lpTitle;
    public uint dwX;
    public uint dwY;
    public uint dwXSize;
    public uint dwYSize;
    public uint dwXCountChars;
    public uint dwYCountChars;
    public uint dwFillAttribute;
    public uint dwFlags;
    public short wShowWindow;
    public short cbReserved2;
    public IntPtr lpReserved2;
    public IntPtr hStdInput;
    public IntPtr hStdOutput;
    public IntPtr hStdError;
}

رابط الملف التنفيذي للتجربة:
https://up.top4top.net/downloadf-1107520n95-rar.html



RE: تغير قيمة ثابتة - هـآوي - 13-01-2019

شكرأ لك صديقي
لكن ليس هذا ماكنت اقصده
بجميع الاحوال البرامج التي تحمل سترنغ ثابت يمكن التعديل عليها وحفظها مباشرة بدون اي مشاكل
لكن انا اردت ان اعرف الطريقة الصحيحة للوصول للاوفست الصحيح الذي يتم التعديل عليها
كما الحال في برنامج PC
يتم الحصول على عنوان الستاك  المحجوزة عندا وضع نقطة توقف
لو قمنا بوضع نقطة توقف على العنوان التالي 0051138B
ستلاحظ انه خرج لنا النص
Stack SS:[0012FED8]=01722DCC, (UNICODE "12345")
لو حاولنا التعديل على نفس العنوان
بدفع الى قيمة ثانية او كتابة mov edx
ستلاحظ انه لن يعمل
لكن لو تم التعديل على العنوان التالي 00511346
يعمل
( ماريد معرفته كيف وصلنا الى العنوان 00511346  وعرفنا انه المكان الصحيح للتعديل )
واعتذر للإطالة وشكرا



RE: تغير قيمة ثابتة - M!X0R - 13-01-2019

للوصول إلى ذلك المكان عليك ببتبع الدالة GetComputerNameA or GetComputerNameW


RE: تغير قيمة ثابتة - هـآوي - 13-01-2019

(13-01-2019, 06:48 AM)M!X0R كتب : للوصول إلى ذلك المكان عليك ببتبع الدالة GetComputerNameA or GetComputerNameW

طريقة التتبع تنجح فقط مع البرنامج الذي يستخدم هذه الدالة
هل توجد طريقة سهلة للتبع ومعرفة الدالة المستخدمة؟؟(لو كان يستخدم البرنامج اكثر من دالة)
قمت بعمل برنامج لعمل تجربة عليه ويمكن الوصل للمكان الذي يتم به حجز النص ويمكن التعديل عليه بشكل يدوي
لكن لم اتمكن من معرفة المكان الصحيح للتعديل وعمل dump !!!!


RE: تغير قيمة ثابتة - offset - 13-01-2019

(13-01-2019, 07:29 AM)هـآوي كتب : قمت بعمل برنامج لعمل تجربة عليه ويمكن الوصل للمكان الذي يتم به حجز النص ويمكن التعديل عليه بشكل يدوي

هل تستطيع ارفاق البرنامج الثاني ؟


RE: تغير قيمة ثابتة - هـآوي - 13-01-2019

(13-01-2019, 07:37 AM)offset كتب : هل تستطيع ارفاق البرنامج الثاني ؟ 
نعم
https://up.top4top.net/downloadf-10981bx3i1-rar.html



RE: تغير قيمة ثابتة - offset - 13-01-2019

كمرحلة اولى  لكي نكون على نفس الخط
هل وصلت اخي الى هنا:
العنوان: 00511B66
اذا كان كذلك ما هي الطريقة التي عدلت بها
 
[صورة مرفقة: p_1108izbti1.png]



RE: تغير قيمة ثابتة - هـآوي - 13-01-2019

نعم اخي الكريم هذا صحيح 
هذا المكان الذي توصلت له 00511B66
قمت بالذهاب الى مكان فارغ في نافذة Hex Dump
00517A4F
وكتابة سترنغ UNICODE
وقمت بعدها بالتعديل بالاوفست 00511B66 وكتابة
MOV EDX,00517A4F


RE: تغير قيمة ثابتة - offset - 13-01-2019

جرب اخي بطريقة مختلفة:
عمل نوب NOP للاوامر الحقيقية في العنوان 00511B66
[صورة مرفقة: p_11083iuo71.png]

ثم دخول الاستدعاء الموجود في العنوان 00511B61 المسؤول عن ارجاع نتيجة الدالة
ثم كتابة MOV EDX, 00517A4F زائد عليها تعليمة RET لتجاهل اكمال النتفيذ
 
[صورة مرفقة: p_1108zx2jh2.png]
كل الطرق تؤدي الى روما Smile


RE: تغير قيمة ثابتة - هـآوي - 13-01-2019

فعلا طريقة ممتازة زادك الله من علمه لو اردنا تنفيذها بشكل برمجي وتكون القيمة متغيره هل يمكن هذا؟
يتم العمل بشكل تسلسلي للمراحل او جميع التغيرات بنفس الحظة.