2013-08-15 2 views
2

у меня есть этот код:перекинув в довольно большое применение

.text:0045A020  ; int __thiscall CMapConnection__OnItemOptionCombination(CMapConnection *this, _tagRequestMAP_COMPOSITION_OPTIONITEM *prcreq) 
.text:0045A020  [email protected]@@[email protected]@@Z proc near 

.text:0045A020 
.text:0045A020 000     push ebp 
.text:0045A021 004     mov  ebp, esp 
.text:0045A023 004     sub  esp, 440h  ; Integer Subtraction 
.text:0045A029 444     mov  eax, ___security_cookie 
.text:0045A02E 444     xor  eax, ebp  ; Logical Exclusive OR 
.text:0045A030 444     mov  [ebp+var_2F0], eax 
.text:0045A036 444     push esi 
.text:0045A037 448     push edi 
.text:0045A038 44C     mov  [ebp+this], ecx 
.text:0045A03E 44C     mov  eax, [ebp+this] 
.text:0045A044 44C     mov  ecx, [eax+534h] 
.text:0045A04A 44C     mov  [ebp+pPlayer], ecx 
.text:0045A050 44C     cmp  [ebp+pPlayer], 0 ; Compare Two Operands 
.text:0045A057 44C     jnz  short loc_45A063 ; Jump if Not Zero (ZF=0) 
.text:0045A057 
.text:0045A059 44C     mov  eax, 1 
.text:0045A05E 44C     jmp  loc_45A97B  ; Jump 

Длинных вещи короткие, мне нужно сделать на следующий: - крюк в начало функции - сделать некоторые проверки (, выделяет код требуется для этих проверок) - на основании результата проверки мне нужно либо позволить функции продолжать нормальный курс, либо переходить в раздел, где он вызывает некоторые ошибки или просто останавливает его.

Я должен сделать это с базовым пониманием asm.

Из того, что я читал, я могу сделать это с крючком, но вот моя проблема: Функции проверки необходимо прочитать _tagRequestMAP_COMPOSITION_OPTIONITEM * prcreq данных о , так что он может собрать некоторые цифры.

.text:0041A464 784C    mov  ecx, [ebp+pPacket] ; jumptable 00417B7A case 27 
.text:0041A467 784C    add  ecx, 4   ; Add 
.text:0041A46A 784C    mov  [ebp+var_1874], ecx 
.text:0041A470 784C    mov  edx, [ebp+var_1874] 
.text:0041A476 784C    push edx    ; prcreq 
.text:0041A477 7850    mov  ecx, [ebp+this] ; this 
.text:0041A47D 7850    call [email protected]@@[email protected]@@Z ; 

Вот как вызывается оригинальная функция.

Мои вопросы:

  1. Как я читать данные из кода * pcreq в C++? Является ли это возможным?
  2. Можно ли вызвать другую функцию из моего крючка, передавая ей те же параметры, что и функция hooked?
  3. Я вообще не возился с параметрами функции OnItemCombination, мне нужно переделать стек, когда я выхожу из своего крючка?
+0

Это действительно хороший вопрос! –

ответ

2

Поскольку вы не можете «приостановить» программу, чтобы вставить DLL/так и выполнить проверки (или, по крайней мере, я никогда не слышал о такой вещи), вы можете изменить код запуска в порядке для обхода переменной.
Пока программа вращается, выполните проверки в инъецированную DLL /, а затем получите статический указатель, используемый для этой переменной, и измените его, чтобы разрешить продолжение введенной программы.

Для этого, вероятно, потребуется некоторое умение.

Нетерпеливо ждет больше ответов,

Приветствия.

Update:

Вот что я имел в виду.

изменить код запуска программы для вращения в цикле, как показано ниже. Используя инструкции jmp и cmp.

static bool spin = true; 
while(spin){ } 

Затем введите свою DLL/так и выполните свои проверки. Как только вы закончите. Измените spin на false и разрешите продолжить программу.

Чтобы изменить spin, вам нужно будет найти статический указатель. Вы можете это сделать, изучив инструкции или с помощью программы, такой как CheatEngine.

+0

У меня нет доступа к исходному коду. Этот вывод осуществляется с помощью IDA. –

+0

@ user1796703 Я не имел в виду исходный код, я имел в виду код сборки. 'startup code' –

+0

Являются ли крючки обработанными асинхронно? Я думал о чем-то вроде этого: 1. Подключиться к началу функции 2. Делать проверки 3. В зависимости от результата пусть функция будет следовать курсу или перейти на адрес, где он регистрирует ошибки. –

1
+0

Это похоже на 1/10 ответа. Найти алгоритм перехвата - это легкая часть, как насчет того, что он успешно подключил код? –

+0

Разве EasyHook не предназначен для C#? –

+0

@ user1796703 Это управляемый код, C# или C++. EasyHook требует .NET независимо от того, как вы к нему подходите. –

Смежные вопросы