powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите переделать прогу из Delphi!!!!
3 сообщений из 3, страница 1 из 1
Помогите переделать прогу из Delphi!!!!
    #32336594
Фотография Nrisimha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прячемся в чужой процесс

на всяки случай исходник и текси:

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 )
...
Рейтинг: 0 / 0
Помогите переделать прогу из Delphi!!!!
    #32336629
Г@Д
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сколько заплатишь ?
...
Рейтинг: 0 / 0
Помогите переделать прогу из Delphi!!!!
    #32337241
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Nrisimha
Когда ты уже за ум возьмешся? Или хотябы за книжку...
Все чего-то откуда-то таскаешь, мутишь, переделываешь...
Неужели неохота свое?

Magnus
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите переделать прогу из Delphi!!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]