Сейчас на форуме: Rio, tyns777, zombi-vadim (+7 невидимых)

 eXeL@B —› Программирование —› C# Вызвать функцию по адресу
Посл.ответ Сообщение

Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 05 ноября 2014 21:12
· Личное сообщение · #1

Вообщем, есть сторонняя программа, а мне из своей нужно вызвать в чужой функцию - как это сделать?
Функция располагается по адресу 00402AF0




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 05 ноября 2014 21:34
· Личное сообщение · #2

Никак.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 05 ноября 2014 22:21
· Личное сообщение · #3

ARCHANGEL пишет:
Никак.

Да, да, вот это ответ который я хотел увидеть. А по делу - не говори если не знаешь.




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 05 ноября 2014 22:26
· Личное сообщение · #4

Uz_
Подробней опишите условия.

Я бы например добавил атрибут MarshalByRefObject к нужному мне методу, прогрузил бы приложение через свой лоадер в отдельный AppDomain и вызывал бы требуемый метод из этого лоадера.
Но это не сработает в ряде случаев.

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 05 ноября 2014 22:45
· Личное сообщение · #5

4kusNick пишет:
Подробней опишите условия.

Есть значит игруха, ее процесс - Gothic2.exe, в игре по адресу 00402AF0 находится конструктор класса zSTRING, воот.
Нужно вызвать этот конструктор, а позже и другие функции. На C++ можно подгрузить dll в процесс и вызвать через ассемблерную вставку по типу call адресс.



Ранг: 11.9 (новичок), 22thx
Активность: 0.010
Статус: Участник

Создано: 05 ноября 2014 23:09
· Личное сообщение · #6

На C# примерно так же, только надо еще .NET Runtime сначала загрузить в процесс, потом загрузить сборку, в ней создать делегат и заюзать Marshal.GetDelegateForFunctionPointer.



Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 05 ноября 2014 23:16
· Личное сообщение · #7

TOM_RUS пишет:
На C# примерно так же, только надо еще .NET Runtime сначала загрузить в процесс, потом загрузить сборку, в ней создать делегат и заюзать Marshal.GetDelegateForFunctionPointer.

dll'ку на С# грузить в процесс и там вызывать? 0_0




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 06 ноября 2014 00:09 · Поправил: Nimnul
· Личное сообщение · #8

Есть такой опкод в msil, забей в своей длл перемычку. Например void Call(int adr); Потом ildasm'ом декомпильни библиотеку и отредактируй тело метода, вставив туда calli. После чего собери ее назад ilasm'ом

это будет выглядеть как то так:
...
ldarg.0
calli
...

Будет вызвана функция по адресу adr. Но если тебе нужно передать в функцию параметры, их нужно перед вызовом положить на стек. Если тебе известна сигнатура вызываемой функции напиши ее, я помогу с msil

-----
have a nice day




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 06 ноября 2014 00:19
· Личное сообщение · #9

Мне тут проще вариант дали, только вот нужные функции типа Write и флаг All не нашел, а так:
Code:
  1. public void Call(IntPtr injAddress, IntPtr callAddress, params int[] funcArgs)
  2. {
  3.     var tHandle = OpenThread(ThreadAccess.All, false, this.Process.Threads[0].Id);
  4.     if (SuspendThread(tHandle) == 0xFFFFFFFF)
  5.         throw new Win32Exception();
  6.  
  7.     var context = new CONTEXT { ContextFlags = ContextFlags.Control };
  8.     if (!GetThreadContext(tHandle, ref context))
  9.         throw new Win32Exception();
  10.  
  11.     var retaddr = Write<uint>(0xDEAD);
  12.  
  13.     var bytes = new List<byte>();
  14.  
  15.     #region ASM
  16.  
  17.     // push eip (stored refernse to next inctruction)
  18.     bytes.Add(0x68);
  19.     bytes.AddRange(BitConverter.GetBytes(context.Eip));
  20.  
  21.     // pushad (stored general registers)
  22.     bytes.Add(0x60);
  23.     // pushfd (stored flags)
  24.     bytes.Add(0x9C);
  25.  
  26.     // pushed to the stack function arguments
  27.     for (int i = funcArgs.Length - 1; i >= 0; --i)
  28.     {
  29.         // push param_address
  30.         bytes.Add(0x68);
  31.         bytes.AddRange(BitConverter.GetBytes(funcArgs[i]));
  32.     }
  33.  
  34.     // mov eax, callAddress
  35.     bytes.Add(0xB8);
  36.     bytes.AddRange(BitConverter.GetBytes(callAddress.ToInt32()));
  37.  
  38.     // call eax
  39.     bytes.Add(0xFF);
  40.     bytes.Add(0xD0);
  41.  
  42.     // add esp, arg_count * pointersize (__cdecl correct stack)
  43.     bytes.Add(0x83);
  44.     bytes.Add(0xC4);
  45.     bytes.Add((byte)(funcArgs.Length * IntPtr.Size));
  46.  
  47.     // mov [retaddr], eax
  48.     bytes.Add(0xA3);
  49.     bytes.AddRange(BitConverter.GetBytes(retaddr.ToInt32()));
  50.  
  51.     // popfd (restore flags)
  52.     bytes.Add(0x9D);
  53.     // popad (restore general registers)
  54.     bytes.Add(0x61);
  55.     // retn
  56.     bytes.Add(0xC3);
  57.  
  58.     #endregion
  59.  
  60.     var oldProtect = MemoryProtection.ReadOnly;
  61.  
  62.     // Save original code and disable protect
  63.     var oldCode = this.ReadBytes(injAddress, bytes.Count);
  64.     if (!VirtualProtectEx(this.Process.Handle, injAddress, bytes.Count, MemoryProtection.ExecuteReadWrite, out oldProtect))
  65.         throw new Win32Exception();
  66.  
  67.     this.Write(injAddress, bytes.ToArray());
  68.  
  69.     context.Eip = (uint)injAddress.ToInt32();
  70.  
  71.     if (!SetThreadContext(tHandle, ref context) || ResumeThread(tHandle) == 0xFFFFFFFF)
  72.         throw new Win32Exception();
  73.  
  74.     for (int i = 0; i < 0x100; ++i)
  75.     {
  76.         System.Threading.Thread.Sleep(15);
  77.         if (this.Read<uint>(retaddr) != 0xDEAD)
  78.             break;
  79.     }
  80.  
  81.     // restore protection and original code
  82.     this.Write(injAddress, oldCode);
  83.  
  84.     if (!FlushInstructionCache(this.Process.Handle, injAddress, bytes.Count))
  85.         throw new Win32Exception();
  86.  
  87.     if (!VirtualProtectEx(this.Process.Handle, injAddress, bytes.Count, oldProtect, out oldProtect))
  88.         throw new Win32Exception();
  89.  
  90.     this.Free(retaddr);
  91. }


Добавлено спустя -58 минут
Нашел так-же такое дело на Delphi:
Code:
  1. function CallRemoteProc(ProcessId: CARDINAL; FuncAddr: POINTER; FuncArg: PFunctionData): BOOL;
  2. var
  3. RemotePMem: POINTER;
  4. HProcess, RealWrite, MyThread, CRT : CARDINAL;
  5. begin
  6.    HProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
  7.    if HProcess = 0 then
  8.    begin
  9.       Result := FALSE;
  10.       Exit;
  11.       end
  12.    else RemotePMem := VirtualAllocEx(HProcess, NIL, SizeOf(FuncArg^) * 2, MEM_COMMIT, PAGE_READWRITE);
  13.    if not Assigned(RemotePMem) then
  14.    begin
  15.       CloseHandle(HProcess);
  16.       Result := FALSE;
  17.       Exit;
  18.       end
  19.    else if not WriteProcessMemory(HProcess, RemotePMem, FuncArg, SizeOf(FuncArg^) * 2, RealWrite) then
  20.    begin
  21.       CloseHandle(HProcess);
  22.       Result := FALSE;
  23.       Exit;
  24.       end
  25.    else CRT := CreateRemoteThread(HProcess, NIL, 0, FuncAddr, RemotePMem, 0, MyThread);
  26.    if CRT = 0 then
  27.    begin
  28.       CloseHandle(HProcess);
  29.       Result := FALSE;
  30.       Exit;
  31.       end
  32.    else
  33.    CloseHandle(HProcess);
  34.    Result := TRUE;
  35. end;





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 06 ноября 2014 00:27 · Поправил: Nimnul
· Личное сообщение · #10

Что то ничего простого не вижу . Я как то мутил вызов функций через подмену возвращаемого адреса, и то выглядело менее страшно и работало почти также быстро как обычный call

-----
have a nice day




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 06 ноября 2014 00:28
· Личное сообщение · #11

Nimnul пишет:
Что то ничего простого не вижу . Я как то мутил вызов функций через подмену возвращаемого адреса, и то выглядело менее страшно и работало почте таже быстро как обычный call

Мне бы примерчик.

Добавлено спустя -59 минут
Nimnul пишет:
Что то ничего простого не вижу . Я как то мутил вызов функций через подмену возвращаемого адреса, и то выглядело менее страшно и работало почти также быстро как обычный call

Блин, и вообще, через dll не желательно в моем случае.




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 06 ноября 2014 00:32
· Личное сообщение · #12

Uz_

Еще раз если я правильно понял у тебя есть C# из него тебе надо вызвать Native по адресу?

-----
have a nice day





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 06 ноября 2014 00:37
· Личное сообщение · #13

А по делу - не говори если не знаешь.
А я продолжаю утверждать, что никак. Вначале нам надо заинжектить свой говнокод на дотнете, который для этих целей ну совсем не подходит. Как это сделать, описано --> тут <--

Т.к. целевой процесс сам по себе не на дотнете, то, как вы понимаете, некоторые из описанных тут вариантов ну вообще не подходят. Но, допустим, заинжектились и всё получилось.

Дальше вы начинаете вызвать этот конструктор, а позже и другие функции (цитата).
И тут вы понимаете, что тупо дергать функции из другого приложения - вообще не лучшая идея. Они могут быть связаны друг с другом объектами синхронизации, инициализировать глобальные переменные, синглтоны. В общем, скорее всего, желаемые результат не будет достигнут. Поэтому возвращаемся к сокращённому варианту "НИКАК". Вы просто неправильно решаете задачу.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 06 ноября 2014 00:41
· Личное сообщение · #14

ARCHANGEL пишет:
А по делу - не говори если не знаешь.
А я продолжаю утверждать, что никак. Вначале нам надо заинжектить свой говнокод на дотнете, который для этих целей ну совсем не подходит. Как это сделать, описано --> тут <--

Т.к. целевой процесс сам по себе не на дотнете, то, как вы понимаете, некоторые из описанных тут вариантов ну вообще не подходят. Но, допустим, заинжектились и всё получилось.

Дальше вы начинаете вызвать этот конструктор, а позже и другие функции (цитата).
И тут вы понимаете, что тупо дергать функции из другого приложения - вообще не лучшая идея. Они могут быть связаны друг с другом объектами синхронизации, инициализировать глобальные переменные, синглтоны. В общем, скорее всего, желаемые результат не будет достигнут. Поэтому возвращаемся к сокращённому варианту "НИКАК". Вы просто неправильно решаете задачу.

То что я пытаюсь сделать - уже реализовано, и не через dll.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 06 ноября 2014 00:44 · Поправил: ARCHANGEL
· Личное сообщение · #15

Пока писал, появились и другие посты. Т.е. оказывается, что и классические способы для вас подходят, и вы всё ещё не оставили планов на изврат.

Ну, тогда всё достаточно тривиально. Определяетесь с разрядностью игры, я так понял, что там х86. Потом выделяете память в другом процессе, пишете туда шеллкод, передаёте на него управление.

Пройдёмся по этапам. Выше код уже привели, разберём суть.

1. Выделить память. Для этого юзается VirtualAlloEx. Для его вызова нам нужен дескриптор процесса, в котором память будет выделяться. Для этого дёргаем OpenProcess.
2. Шеллкод в самом простом случае - набор инструкций push и retn в конце. push передают параметры (если соглашение stdcall или cdecl), а последние push retn эмулируют call. Так просто писать проще, потому что push базонезависимы.
3. Выполнить это можно, дёрнув CreateRemoteThread.

И, конечно, это всё же не очень удобно на дотнете. Но я практически уверен, что это не то, что нужно сделать. Вот опишите задачу, какая ваша конечная цель? Зачем вам дёргать эту функцию?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 06 ноября 2014 00:45 · Поправил: Uz_
· Личное сообщение · #16

Nimnul пишет:
Еще раз если я правильно понял у тебя есть C# из него тебе надо вызвать Native по адресу?

Есть процесс игры, в нем по некому адресу лежит функция, мне эту функцию надо вызвать.

Проще говоря, представим программу(a.exe) в которой есть функция, к примеру:
void Func(){
MessageBox.Show("abc");
}
Функция располагается допустим по адресу 00402AF0

А мы, через нашу программу на C#(b.exe) вызываем эту функцию из памяти программы a.exe

Мы вызываем и получаем MessageBox с текстом abc.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 06 ноября 2014 01:10
· Личное сообщение · #17

Uz_ я вот тут все это читал.. и молчал.. все что касается .НЕТ както хорошо обсуждалось с пол года назад.. НЕТУ ТАМ по факту адресов.. .НЕТ предкомпиляцию делает.. код перед выполнением. я может сильно не прав.. но как по мне.. надо решать вопрос либо на стадии патчинга, чтоб уже в память разворачивался правильный попатченный код, либо уже в памяти ловить. вообще то все это попахивает дурным скрещиванием гибона с насорогом

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 06 ноября 2014 03:07
· Личное сообщение · #18

Uz_ пишет:
А мы, через нашу программу на C#(b.exe) вызываем эту функцию из памяти программы a.exe


Ну тогда вызов функции это меньшее из проблем что тебя ожидает. Тут надо делать инъекцию длл. А делать инъекцию .Net длл, в процесс не .Net это жесть, потому что нужно подгрузить весь рантайм. Правильно делать dll на C и мутить дальше.

-----
have a nice day




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 06 ноября 2014 03:23
· Личное сообщение · #19

Nimnul пишет:
Ну тогда вызов функции это меньшее из проблем что тебя ожидает. Тут надо делать инъекцию длл. А делать инъекцию .Net длл, в процесс не .Net это жесть, потому что нужно подгрузить весь рантайм. Правильно делать dll на C и мутить дальше.

я вот человеку пытаюсь об этапах рассказать.. но чую что не был услышан

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 06 ноября 2014 13:01 · Поправил: Uz_
· Личное сообщение · #20

Nimnul пишет:

Ну тогда вызов функции это меньшее из проблем что тебя ожидает. Тут надо делать инъекцию длл. А делать инъекцию .Net длл, в процесс не .Net это жесть, потому что нужно подгрузить весь рантайм. Правильно делать dll на C и мутить дальше.

Проехали, пробовал на С++ - ничего. Инжектил dll'ку и через нее исполнял команды - программа не реагирует а dll'ка останавливается на вызове. Вот собсна код вызова:взят из проекта Gothic 2 Ext
Code:
  1. /*////////////////////////////////////////////////////////////////////////////
  2.  
  3. This file is part of the G2Ext SDK headers.
  4.  
  5. //////////////////////////////////////////////////////////////////////////////
  6.  
  7. The G2Ext SDK headers
  8.  
  9. Copyright © 2009, 2010 by Paindevs and Patrick Vogel
  10.  
  11. All Rights reserved.
  12.  
  13. THE WORK (AS DEFINED BELOW) IS PROVIDED
  14. UNDER THE TERMS OF THIS CREATIVE COMMONS
  15. PUBLIC LICENSE ("CCPL" OR "LICENSE").
  16. THE WORK IS PROTECTED BY COPYRIGHT AND/OR
  17. OTHER APPLICABLE LAW. ANY USE OF THE WORK
  18. OTHER THAN AS AUTHORIZED UNDER THIS LICENSE
  19. OR COPYRIGHT LAW IS PROHIBITED.
  20.  
  21. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED
  22. HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE
  23. TERMS OF THIS LICENSE. TO THE EXTENT THIS
  24. LICENSE MAY BE CONSIDERED TO BE A CONTRACT,
  25. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED
  26. HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF
  27. SUCH TERMS AND CONDITIONS.
  28.  
  29. Full license at http://creativecommons.org/licenses/by-nc/3.0/legalcode
  30.  
  31. /////////////////////////////////////////////////////////////////////////////*/
  32.  
  33. #ifndef __API_G2_MACROS_H__
  34. #define __API_G2_MACROS_H__
  35.  
  36. #ifndef __G2EXT_API_HEADER
  37. #define __G2EXT_API_HEADER
  38. #endif  //__G2EXT_API_HEADER
  39.  
  40. #ifdef _G2EXT_COMPILE_SPACER
  41. #error Cannot use gothic headers on spacer dll (_G2EXT_COMPILE_SPACER defined)
  42. #endif
  43.  
  44. #pragma warning(disable:4731) // -- suppress C4731:"frame pointer register 'ebp' modified by inline assembly code"
  45.  
  46. // -- call macro from GothicX (thx, Zerxes!)
  47.  
  48. #define XCALL(uAddr)                  \
  49.          __asm { mov esp, ebp      }    \
  50.          __asm { pop ebp            }       \
  51.          __asm { mov eax, uAddr    }  \
  52.          __asm { jmp eax            }
  53.  
  54. #undef __G2EXT_API_HEADER
  55.  
  56. #endif //__API_G2_MACROS_H__


И на Delphi пробовал, но там программа попросту висла

Добавлено спустя -58 минут
VodoleY пишет:

Uz_ я вот тут все это читал.. и молчал.. все что касается .НЕТ както хорошо обсуждалось с пол года назад.. НЕТУ ТАМ по факту адресов.. .НЕТ предкомпиляцию делает.. код перед выполнением. я может сильно не прав.. но как по мне.. надо решать вопрос либо на стадии патчинга, чтоб уже в память разворачивался правильный попатченный код, либо уже в памяти ловить. вообще то все это попахивает дурным скрещиванием гибона с насорогом

Может мы друг друга не так поняли? В .Net нет адресов, но я то через программу на Net работаю с обычной программой? Почему бы и нет? Ведь в Net есть Write\Read ProcessMemory

Добавлено спустя -55 минут
Вот кстати код dll'ки и инжектора на Delphi http://rghost.ru/private/58913448/cae3293cf30e222b4edb776d09dc6b65




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 06 ноября 2014 13:19
· Личное сообщение · #21

Uz_
Возвращаемся к пройденному материалу.

Они могут быть связаны друг с другом объектами синхронизации, инициализировать глобальные переменные, синглтоны. В общем, скорее всего, желаемые результат не будет достигнут.

Но в вашем случае виной всему какие-то корявые реализации людей, пишущих какой-то наркоманский код:
Code:
  1. #define XCALL(uAddr)                  \
  2.          __asm { mov esp, ebp      }    \
  3.          __asm { pop ebp            }       \
  4.          __asm { mov eax, uAddr    }  \
  5.          __asm { jmp eax


Это вообще тут к чему? Мне влом это комментировать, но я не могу придумать, как через этот макрос вызвать что-то, кроме краша. Посмотрите в иде, как делается вызов функции.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 06 ноября 2014 13:24
· Личное сообщение · #22

ARCHANGEL пишет:
Это вообще тут к чему? Мне влом это комментировать, но я не могу придумать, как через этот макрос вызвать что-то, кроме краша. Посмотрите в иде, как делается вызов функции.

Где посмотреть? в IDE чтоль? Не владею особо терминологией.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 06 ноября 2014 13:28
· Личное сообщение · #23

В IDA Pro. Вы ж как-то нашли адрес, где, по вашему мнению, начинается код конструктора. Вот там и посмотрите, как выглядит вызов фунции. В Ida это можно сделать поиском xref. (Х на функции надавите, и счастье).

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: Uz_

Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 06 ноября 2014 13:28
· Личное сообщение · #24

Кстати мне тот код через CheatEngine удалось заинжектить в процесс.

Добавлено спустя -56 минут
ARCHANGEL пишет:
В IDA Pro. Вы ж как-то нашли адрес, где, по вашему мнению, начинается код конструктора. Вот там и посмотрите, как выглядит вызов фунции. В Ida это можно сделать поиском xref. (Х на функции надавите, и счастье).

А, понял, спасибо вам. Щас попробую

Добавлено спустя -46 минут
Ну, вызов осуществляется через
Code:
  1. call адрес





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 06 ноября 2014 17:27 · Поправил: Nimnul
· Личное сообщение · #25

Uz_ пишет:
Проехали, пробовал на С++ - ничего. Инжектил dll'ку и через нее исполнял команды - программа не реагирует а dll'ка останавливается на вызове. Вот собсна код вызова:взят из проекта Gothic 2 Ext


Если у вас не получилось сделать на C++ то на C# подавно не получиться. Этож класика инъекция длл в процесс, по этому поводу есть куча мануалов и примеров. А раз программа не реагирует, это не значит что язык плохой... Нужно брать отладчик и разбираться что произошло. Возможно вы использовали не то соглашение о вызове функций их несколько... Или банально не те размеры переменных лежат на стеке, например должно было лежать 2х байтовое число, а у вас на стеке 4х байтовое... Возможно у вас не правильный адрес возврата или миллион других причин может быть. А если в проге используются потоки, то без глубокого реверсинга вобще не обойтись. Поскольку есть вероятность, что вам и не нужно вызывать код функций, а нужно заинлайнить callback на ваш код, когда происходит штатный вызов функции проги в контексте того потока в котором она работает, в народе это называется hook

-----
have a nice day





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 06 ноября 2014 17:36
· Личное сообщение · #26

Я, пожалуй, соглашусь с Nimnulом. Ну, про 2-х байтовое число на стеке - перебор, я думаю, в остальном же всё так.
Uz_
Не сочтите за грубость, нет абсолютно никакой цели кого-то обидеть. Просто я знаю, как это происходит. Вы сидели, писали какие-то программки на шарпе, а потом подумали, что вы уже умеет программировать, и решили, что пора писать читы (или зачем оно вам всё это надо?). Где-то что-то прочитали мельком, погуглили, и в бой. А по факту - ассемблера толком не знаете, про конвенции вызовов не слышали (в шарпе-то какие конвенции), чем длл от сборки отличается представления мало. А нужно теперь изучить системное программирование под винду, почитать что-то на тему реверс-инженерии, попробовать что-то попроще и вот тогда уже браться за читы.

Конкретно здесь, может, всё получится, но особого понимания процесса оно вам не принесёт.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 06 ноября 2014 17:40
· Личное сообщение · #27

ARCHANGEL

Про двух байтовое число я образно . Можно легко представить такую же ситуацию с int32 и int64

-----
have a nice day




Ранг: 46.8 (посетитель), 20thx
Активность: 0.040
Статус: Участник

Создано: 06 ноября 2014 21:15
· Личное сообщение · #28

Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows
Джеффри Рихтер
Глава 22. Внедрение DLL и перехват API вызовов.

Я сам на C# пишу.
Но для этих целей лучше C/C++/ASM.

На геймЭнджин вроде автоматизировать можно действия, в IDA тоже.

| Сообщение посчитали полезным: Uz_

Ранг: 12.0 (новичок)
Активность: 0.020
Статус: Участник

Создано: 07 ноября 2014 00:57
· Личное сообщение · #29

Я не чит пытаюсь писать. А так - спасибо всем, буду дальше копать.


 eXeL@B —› Программирование —› C# Вызвать функцию по адресу
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати