Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
27.11.2003, 12:48
|
|||
|---|---|---|---|
Помогите переделать прогу из Delphi!!!! |
|||
|
#18+
Прячемся в чужой процесс на всяки случай исходник и текси: API Hooking при снятии дапма с прог защищенных Armadillo Copymem II. Итак, пришло время забить на всякие армкиллеры, анармы и т.п. уже сами с усами :) Ща свою собственную прогу налобаем... В WIN NT/2K/XP есть такая крутая апи как CreateRemoteThread. Она позволяет выполнить thread от лица другого процесса, т.е. в его адресном пространстве. Как это нам поможет с copymem? Еще как поможет! Для начала вспомним как работает Copymem: Процесс основной проги обращается к какой-то странице памяти, которая в текущий момент не загружена - происходит исключение. Процесс-отладчик просекает это исключение, догружает нужную страницу и исправляет возникший глюк, так что процесс основной проги и не замечает, что что-то произошло. Кто нам мешает от лица процесса основной проги прочитать все страницы памяти процесса и сохранить их на диск ? Армадилло нам все сам отдаст в раскриптованом виде :) Нам останется только исправить импорт, OEP и PE заголовок. Сразу говорю: этот метод придумал Sten еще хз когда, я просто повторяю его подвиги :) Итак как это все делается: The CreateRemoteThread function creates a thread that runs in the address space of another process. HANDLE CreateRemoteThread( HANDLE hProcess, // handle to process to create thread in LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes DWORD dwStackSize, // initial thread stack size, in bytes LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function LPVOID lpParameter, // pointer to argument for new thread DWORD dwCreationFlags, // creation flags LPDWORD lpThreadId // pointer to returned thread identifier ); Var hToken,prevst,wr:cardinal; tk,tk2:_TOKEN_PRIVILEGES; p,p2:pointer; buf:pchar; h:cardinal; pLoadlibrarya:pointer; dll:pchar; thrid:cardinal; begin //Получаем привелегии отладки (иногда это и не нужно, но все таки) OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken); LookupPrivilegeValue(nil,'SeDebugPrivilege',tk.Privileges[0].Luid); tk.PrivilegeCount:=1; tk.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(htoken,false,tk,0,tk2,prevst); //открываем процесс который собираемся дампить (тут PID я в PEditor посмотрел) h:=Openprocess(PROCESS_ALL_ACCESS,false,$558); if h=0 then showmessage('Cannot open process'); pLoadlibrarya:=getprocaddress(Loadlibrary('kernel32.dll'),'LoadLibraryA'); getmem(dll,20); dll:='inject.dll'; //пробиваем место под переменную с именем DLL p:=virtualallocex(h,0,25,MEM_COMMIT,PAGE_READWRITE); //пишем туда нашу строчку с именем DLL writeprocessmemory(h,p,dll,10,wr); //создаем thread в нужном нам процессе createremotethread(h,nil,0,pLoadlibrarya,p,0,thrid); //Тут я в качестве lpStartAddress указал адрес АПИ LoadLibraryA, а как lpParameter я передаю имя DLL. end; Т.е. вместо того чтобы долбаться и запихивать код, который хочу выполнить в это процесс, также как и строчку с именем DLL, я просто указал адрес API функции. Код этой апи есть во всех win32 приложениях, т.к. сейчас нет приложений которые не используют dll вообще. Короче такой командой я выполняю LoadlibraryA от имени нужного мне процесса и загружаю свою DLL которая может делать все что мне нужно. Теперь делаем dll которая будет просто читать память процесса, в который она внедрена: library inject; uses windows; Var c,rr:cardinal; buf:array [1..$1000] of byte; i:word; h:thandle; begin h:=createfile('c:\unpacked.exe',GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0); for i:=0 to $XX do //xx - число страниц которые будем дампить Begin zeromemory(@buf,$1000); copymemory(@buf,pointer($400000+i*$1000),$1000); writefile(h,buf,sizeof(buf),rr,nil); end; closehandle(h); messagebox(0,'Готово!','',MB_OK); end. Для чтения надо юзать именно copymemory а не Readprocessmemory. Т.к. в Readprocessmemory армадило почему-то не отлавливает исключения и в результате получаем прочитаный блок нулей :( P.S. Спасибо всем кто мне помогает на форуме reversing.net Автор: Hex ( hex@xtin.org ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.11.2003, 13:04
|
|||
|---|---|---|---|
|
|||
Помогите переделать прогу из Delphi!!!! |
|||
|
#18+
Сколько заплатишь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=20&mobile=1&tid=1439804]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
73ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 420ms |

| 0 / 0 |
