Сейчас на форуме: zds (+6 невидимых)

 eXeL@B —› Программирование —› Сплайсинг.Вероятно плутаю с арифметикой адресов а может и нет.Подскажите.
Посл.ответ Сообщение

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

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

Кидает походу в начало затычки,а не на оригинальный код за затычкой.Мозги уже кипят с этой адресной арифметикой.
[С]
typedef int (WINAPI *MessageBoxADYn)(_In_opt_ HWND hWnd,_In_opt_ LPCSTR lpText,_In_opt_ LPCSTR lpCaption,_In_ UINT uType);
typedef void (WINAPI *WINAPIBackRoutine)();

BYTE *orig;
BYTE jmp[5];

#pragma pack(push,1)
struct JmpShell
{
unsigned char op;
DWORD adr;
};
#pragma pack(pop)

void SetHOOK(DWORD adr,DWORD GateAdr)
{
SetLastError(0);
DWORD prev=0;
VirtualProtect((void*)adr,5,PAGE_EXECUTE_READWRITE,&prev);
orig=(BYTE*)VirtualAlloc(0,10,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
memcpy(orig,(void*)adr,5);
DWORD BackShell=((DWORD)orig)+5;
JmpShell *jback=(JmpShell *)BackShell;
jback->op=0xe9;
jback->adr=(adr-5) - ((DWORD)orig+5);
JmpShell *jsh=(JmpShell*)adr;
jsh->op=0xe9;
jsh->adr=GateAdr-adr-5;
VirtualProtect((void*)adr,5,prev,&prev);
}
void Back()
{
WINAPIBackRoutine BB=(WINAPIBackRoutine)orig;
BB();
}
void /*WINAPI*/ Gate(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
printf("!");
Back();
}
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE u32=LoadLibrary(L"user32.dll");
MessageBoxADYn MB=(MessageBoxADYn)GetProcAddress(u32,"MessageBoxA");
SetHOOK((DWORD)MB,(DWORD)&Gate);
//MB(0,"","",MB_OK);
printf("func adr: %X\n",MB);
MessageBoxA(0,"","",MB_OK);
//printf("%d",GetLen((BYTE*)MB));
/*int sum=0,curlen=0;
BYTE *seek=(BYTE*)MB;
for(;;)
{
curlen=GetLen(seek);
sum=sum+curlen;
seek=(BYTE*)( ((DWORD)seek)+curlen );
printf("%d SUMlen: %d \n",curlen,sum);
_getch();
}*/
_getch();
return 0;
}

[/С]



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 12 апреля 2014 21:44 · Поправил: Vovan666
· Личное сообщение · #2

Давай уж скомпилированный вариант, глаза болят от кривоскопиррованного копи-паста.



Ранг: 50.0 (постоянный), 31thx
Активность: 0.090.1
Статус: Участник

Создано: 12 апреля 2014 21:48
· Личное сообщение · #3

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



Ранг: 95.1 (постоянный), 247thx
Активность: 0.260.01
Статус: Участник

Создано: 12 апреля 2014 23:06
· Личное сообщение · #4

kruasancheg пишет:
начало затычки

Это новая функция такая ? Затычка.

-----
TEST YOUR MIGHT




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

Создано: 12 апреля 2014 23:23 · Поправил: kruasancheg
· Личное сообщение · #5

Vovan666 пишет:
Давай уж скомпилированный вариант, глаза болят от кривоскопиррованного копи-паста.


Code:
  1. jback->adr=(АдресОригинальной функции-5) - ((DWORD)БлокПамяти с ОригинальнымКодом и Джампом на код За Трамплином+5);
Как будет правильно ?

81b5_12.04.2014_EXELAB.rU.tgz - splaice.exe



Ранг: 21.0 (новичок), 19thx
Активность: 0.010.03
Статус: Участник

Создано: 13 апреля 2014 12:58
· Личное сообщение · #6

Code:
  1. #include <windows.h>
  2.  
  3. void SetHOOK(DWORD dwNewFunc, DWORD dwOrigFunc)
  4. {
  5.          DWORD OldProtect;
  6.          VirtualProtect(LPVOID(dwOrigFunc), 5, PAGE_EXECUTE_READWRITE, &OldProtect);
  7.  
  8.          *(DWORD*)(dwOrigFunc) = 0xE9;//JMP
  9.          *(DWORD*)(dwOrigFunc+1) = dwNewFunc - (dwOrigFunc+5);
  10. }
  11.  
  12. int __stdcall Gate(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
  13. {
  14.          return MessageBoxExA(hWnd,"NewMessageBoxA", lpCaption, uType, 0);
  15. }
  16.  
  17. int _tmain(int argc, _TCHAR* argv[])
  18. {
  19.          MessageBoxA(0,"test","test",MB_OK);
  20.          SetHOOK((DWORD)&Gate, (DWORD)MessageBoxA);
  21.          MessageBoxA(0,"test2","test2",MB_OK);
  22.          return 0;
  23. }




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

Создано: 13 апреля 2014 14:33
· Личное сообщение · #7

в MessageBoxExA входит джамп на тело оригинальной ф-ции,или я чего то не допонимаю?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 13 апреля 2014 16:15
· Личное сообщение · #8

--> Link <--
--> Link <--
еще примеры
для разнообразия



Ранг: 21.0 (новичок), 19thx
Активность: 0.010.03
Статус: Участник

Создано: 13 апреля 2014 16:19
· Личное сообщение · #9

вместо MessageBoxA(0,"test2","test2",MB_OK) вызывается Gate->MessageBoxExA(hWnd,"NewMessageBoxA", lpCaption, uType, 0) просто как пример работы хука. MessageBoxExA можно убрать. если нужно вызывать оригинальную функу MessageBoxA, то в SetHOOK нужно сохранять оригинальные байты перед их изменением, а перед вызовом MessageBoxA восстанавливать их, после вызова опять ставить хук.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 13 апреля 2014 17:23
· Личное сообщение · #10

soft пишет:
сохранять оригинальные байты перед их изменением, а перед вызовом MessageBoxA восстанавливать их, после вызова опять ставить хук

Плохая практика, которая приведёт к тому, что на нескольких потоках рано или поздно этот комбайн навернётся.




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 13 апреля 2014 22:09
· Личное сообщение · #11

Archer пишет:
на нескольких потоках

совсем не так часто такое бывает, зависит от цели. а ТС - чудик, лучше бы в детурс смотрел

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




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

Создано: 13 апреля 2014 23:42 · Поправил: kruasancheg
· Личное сообщение · #12

Code:
  1. typedef int (WINAPI  *MessageBoxADYn)(_In_opt_ HWND hWnd,_In_opt_ LPCSTR lpText,_In_opt_ LPCSTR lpCaption,_In_ UINT uType);
  2.  
  3. BYTE *orig;
  4.  
  5. #pragma pack(push,1)
  6. struct JmpShell
  7. {
  8.          unsigned char op;
  9.          DWORD adr;
  10. };
  11. #pragma pack(pop)
  12.  
  13. void SetHOOK(DWORD FuncAdr,DWORD GateAdr)
  14. {
  15.          DWORD prev=0;
  16.          VirtualProtect((void*)FuncAdr,5,PAGE_EXECUTE_READWRITE,&prev);
  17.          orig=(BYTE*)VirtualAlloc(0,/*10*/4096,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);//оригинальные 5 байт+джамп на оригинальное тело ф-ции
  18.          memcpy(orig,(void*)FuncAdr,5);
  19.          DWORD BackShell=((DWORD)orig)+5;
  20.          JmpShell *jback=(JmpShell *)BackShell;
  21.          jback->op=0xe9;
  22.          jback->adr=(FuncAdr+5) - ( ((DWORD)orig) +5);//возврат на тело оригинальной ф-ции
  23.          /****************************************************************/
  24.          JmpShell *jsh=(JmpShell*)FuncAdr;
  25.          jsh->op=0xe9;
  26.          jsh->adr=GateAdr-FuncAdr-5;//переход на заглушку
  27.          VirtualProtect((void*)FuncAdr,5,prev,&prev);
  28. }
  29.  
  30. int WINAPI Gate(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
  31. {
  32.          printf("%s %s\n",lpText,lpCaption);
  33.          MessageBoxADYn OrigBox=(MessageBoxADYn)orig;
  34.          _asm
  35.          {
  36.                  int 3
  37.          }
  38.          /*почему то за бряком перед жампом, торчит это - pop ebp*/
  39.          int ret=OrigBox(hWnd,lpText,lpCaption,uType);
  40.          return ret;
  41. }
  42. int _tmain(int argc, _TCHAR* argv[])
  43. {
  44.          HMODULE u32=LoadLibrary(L"user32.dll");
  45.          DWORD funcAdr=(DWORD)GetProcAddress(u32,"MessageBoxA");
  46.          SetHOOK((DWORD)funcAdr,(DWORD)&Gate);
  47.          printf("func adr: %X\n",funcAdr);
  48.          MessageBoxA(0,"hhtgmgh","km.hj.h",MB_OK);
  49.          _getch();
  50.          return 0;
  51. }

Поясните странность плз - в иде начало мессаджбокса начинаеться так:
Code:
  1. mov     edi, edi
  2. push    ebp
  3. mov     ebp, esp

А в ольке за бряком вижу такое вот:
Code:
  1.  
  2. int3
  3. pop ebp                    
  4. jmp eax





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 14 апреля 2014 02:50
· Личное сообщение · #13

soft пишет:
*(DWORD*)(dwOrigFunc+1) = dwNewFunc - (dwOrigFunc+5);

Неправильное выражение,так будет работать в случае если код подменной функции будет ниже хученого кода, если выше то вы обломитесь, в арифметеке
Code:
  1. *(DWORD*)(dwOrigFunc+1) =0xFFFFFFFF - dwOrigFunc + dwNewFunc - 4 ;


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 14 апреля 2014 03:13
· Личное сообщение · #14

kruasancheg пишет:
Поясните странность плз

Оба варианта выдернуты под режимом отладки? Очевидно что во втором варианте кто-то поставил int 3 прерывание в начале функции. Проще говоря - кто-то поставил софтварный бряк

-----
Research For Food





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 14 апреля 2014 08:31
· Личное сообщение · #15

MessageBoxExA - не используйте это.




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 14 апреля 2014 09:17
· Личное сообщение · #16

ajax пишет:
совсем не так часто такое бывает

Ну да, периодические краши-это так мило. Особенно когда происходят не особо часто и непредсказуемо.

ClockMan пишет:
Неправильное выражение,так будет работать в случае если код подменной функции будет ниже хученого кода

А не смущает, что код идентичный? Имеется в виду для х86, конечно. Для х64 дальше 2 гб в любом случае таким переходом не дотянется.



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

Создано: 14 апреля 2014 10:16 · Поправил: kruasancheg
· Личное сообщение · #17

daFix пишет:
Оба варианта выдернуты под режимом отладки? Очевидно что во втором варианте кто-то поставил int 3 прерывание в начале функции. Проще говоря - кто-то поставил софтварный бряк

Я его поставил.Разве не видно???
Тут кто то что то читает до конца, перед тем как отвечать.Или только троллят???



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

Создано: 14 апреля 2014 11:43
· Личное сообщение · #18

Мой велосипед на базе дизассемблера mediana
Code:
  1. #pragma pack(push)
  2. #pragma pack(1)
  3. typedef struct {
  4.          UCHAR opcode;
  5.          ULONG_PTR offset;
  6. } t_jmp;
  7.  
  8. typedef struct {
  9.          LPVOID address;
  10.          LPVOID stub;
  11.          SIZE_T stub_size;
  12. } t_splice;
  13. #pragma pack(pop)
  14.  
  15. t_splice *SetHook(LPVOID lpApiFn, LPVOID lpHook, LPVOID *lpStub)
  16. {
  17.          if ((lpApiFn == NULL) || (lpHook == NULL) || (lpStub == NULL))
  18.                  return NULL;
  19.  
  20.          t_splice *splice = malloc(sizeof(t_splice));
  21.          if (!splice)
  22.                  return NULL;
  23.  
  24.          t_jmp jmp  = { 0 };
  25.          jmp.opcode = (UCHAR)0xE9;
  26.          jmp.offset = (ULONG_PTR)lpHook - (ULONG_PTR)lpApiFn - 5;
  27.  
  28.          struct INSTRUCTION instr;
  29.          struct DISASM_INOUT_PARAMS params;
  30.          uint8_t sf_prefixes[MAX_INSTRUCTION_LEN];
  31.  
  32.          params.arch        = ARCH_ALL;
  33.          params.sf_prefixes = sf_prefixes;
  34.          params.mode        = DISASSEMBLE_MODE_32;
  35.          params.options     = DISASM_OPTION_APPLY_REL | DISASM_OPTION_OPTIMIZE_DISP;
  36.          params.base        = (uint64_t)lpApiFn;
  37.  
  38.          unsigned int res;
  39.          SIZE_T nStubLen = 0;
  40.          uint8_t *lpCurPtr = (uint8_t *)lpApiFn;
  41.          while (nStubLen < sizeof(t_jmp))
  42.          {
  43.                  res          = medi_disassemble(lpCurPtr, &instr, &params);
  44.                  lpCurPtr    += res;
  45.                  params.base += res;
  46.                  nStubLen    += res;
  47.          }
  48.  
  49.          LPVOID lpWrap = (LPVOID)malloc(nStubLen + sizeof(t_jmp));
  50.          if (lpWrap == NULL) {
  51.                  free(splice);
  52.                  return NULL;
  53.          }
  54.  
  55.          memcpy(lpWrap, lpApiFn, nStubLen);
  56.  
  57.          t_jmp jmpret  = { 0 };
  58.          jmpret.opcode = (UCHAR)0xE9;
  59.          jmpret.offset = (ULONG_PTR)lpApiFn + nStubLen - (ULONG_PTR)lpWrap - nStubLen - 5;
  60.  
  61.          memcpy((LPVOID) ((ULONG_PTR)lpWrap + nStubLen), &jmpret, sizeof(t_jmp));
  62.  
  63.          DWORD dwOldProt = 0;
  64.          VirtualProtect(lpWrap, nStubLen + sizeof(t_jmp), PAGE_EXECUTE_READWRITE, &dwOldProt);
  65.  
  66.          VirtualProtect(lpApiFn, sizeof(t_jmp), PAGE_EXECUTE_READWRITE, &dwOldProt);
  67.          memcpy(lpApiFn, &jmp, sizeof(jmp));
  68.          VirtualProtect(lpApiFn, sizeof(t_jmp), dwOldProt, &dwOldProt);
  69.          *lpStub = lpWrap;
  70.  
  71.          FlushInstructionCache(GetCurrentProcess(), lpApiFn, sizeof(jmp));
  72.          splice->address   = lpApiFn;
  73.          splice->stub      = lpWrap;
  74.          splice->stub_size = nStubLen;
  75.          return splice;
  76. }





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 14 апреля 2014 11:43 · Поправил: ajax
· Личное сообщение · #19

kruasancheg
троллят. ибо кг/ам
Veliant
под PC-архитектуру флашить смысла нет. так же, как GCP вернет -1 для текущего всегда. но, с точки зрения хорошего кодерства - все верно
Archer
lock exchange или типа того - давно видел забавный вариантик для многопотока. обычно бывают конкретные случаи, в них делать крит секции и тп - смысла нет. с точки зрения не писателя аверов, или мудреного софта

пофлудю. ресурс превращается в "дайте здесь и щаз же, гугль забанен"

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 14 апреля 2014 12:00
· Личное сообщение · #20

kruasancheg пишет:
Я его поставил.Разве не видно???

Раз 10 перечитал ваше сообщение и так не уловил сути вопроса. Так что каков вопрос - таков ответ.

soft пишет:
вместо MessageBoxA(0,"test2","test2",MB_OK) вызывается Gate->MessageBoxExA(hWnd,"NewMessageBoxA", lpCaption, uType, 0) просто как пример работы хука. MessageBoxExA можно убрать. если нужно вызывать оригинальную функу MessageBoxA, то в SetHOOK нужно сохранять оригинальные байты перед их изменением, а перед вызовом MessageBoxA восстанавливать их, после вызова опять ставить хук.

Выделяем память, копируем в неё первые байты программы и после них лепим прыжок на оставшуюся часть функции. В начале похученной функции ставим переход на свой обработчик, а в его конце переход на выделенную память. Как-то красивее и надёжнее

-----
Research For Food




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

Создано: 14 апреля 2014 13:19 · Поправил: kruasancheg
· Личное сообщение · #21

daFix пишет:
Выделяем память, копируем в неё первые байты программы и после них лепим прыжок на оставшуюся часть функции. В начале похученной функции ставим переход на свой обработчик, а в его конце переход на выделенную память. Как-то красивее и надёжнее
А у меня как по вашему?Суть вопроса - ПОЧЕМУ ОНО ТАК НЕ РАБОТАЕТ.




Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 14 апреля 2014 13:33
· Личное сообщение · #22

kruasancheg
Киньте скомпиленный файл

-----
Research For Food




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

Создано: 14 апреля 2014 14:54
· Личное сообщение · #23

daFix пишет:
kruasanchegКиньте скомпиленный файл



2700_14.04.2014_EXELAB.rU.tgz - splaice.exe



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

Создано: 14 апреля 2014 15:35 · Поправил: Veliant
· Личное сообщение · #24

ну как минимум, обратный jmp внутрь MessageBoxExA промахивается на +5 байт
во-вторых копировать строго 5 байт - полнейший бред, потому что могут инструкции быть другие

kruasancheg пишет:
На +5 от чего?

От того адреса, который должен быть



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

Создано: 14 апреля 2014 15:42
· Личное сообщение · #25

Veliant пишет:
ну как минимум, обратный jmp внутрь MessageBoxExA промахивается на +5 байт
На +5 от чего?




Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 14 апреля 2014 22:51
· Личное сообщение · #26

kruasancheg
C:\Documents and Settings\1\Мои документы\Downloads\2700_14.04.2014_EXELAB.rU\splaice.exe не является приложением Win32."
Скомпильте без рантаймов, а то ни как не удаётся запустить

-----
Research For Food




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 15 апреля 2014 00:35 · Поправил: Модератор
· Личное сообщение · #27

daFix см. DosHeader->OptionalHeader->MajorSubsystemVersin

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


Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 15 апреля 2014 01:34 · Поправил: Модератор
· Личное сообщение · #28

kruasancheg
Чтобы не заморачиваться, можешь использовать конструкцию:
Code:
  1. push addr
  2. ret

Тогда не будет проблем вычислением длины прыжка.

А вообще, сейчас у тебя тут ошибка
kruasancheg пишет:
jback->op=0xe9;
jback->adr=(FuncAdr+5) - ( ((DWORD)orig) +5);//возврат на тело оригинальной ф-ции


Надо :
jback->op=0xe9;
jback->adr=FuncAdr - ( ((DWORD)orig) +5);

-----
Research For Food





Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 15 апреля 2014 02:28
· Личное сообщение · #29

kruasancheg

Сайда сурсы глянте, там патч реализован.



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

Создано: 17 апреля 2014 09:16
· Личное сообщение · #30

Спасибо всем кто про адрес написал.Сгуглил для себя алгоритм
Code:
  1. DWORD _CalculateDispacement(DWORD lpFirst, DWORD lpSecond,int stubLen)
  2. {
  3.          return lpSecond - ( (lpFirst) + stubLen );
  4. }

Теперь все как надо работает.


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


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