Сейчас на форуме: (+3 невидимых) |
eXeL@B —› Дневники и блоги —› Demon666 blog: Native Ring API (NRAPI) |
Посл.ответ | Сообщение |
|
Создано: 30 июля 2008 09:17 · Личное сообщение · #1 Как привык писать всемогущий Archer - всем варнинги, если вы себя без лишней скромности считаете профессионалом, то для вас здесь ничего нового не будет, но вы можете поделиться своими знаниями с другими! долго думал, что выбрать если честно. И подумал, чтобы сразу выше потолка не прыгнуть, как раз для начала самое то... кто любит и умеет что-то делать, предлагаю поучаствовать в проекте, если конечно хоть немного заденет. Native Ring API (NRAPI) The native ring application programming interface (NRAPI) is a helper library вот подумал, что красиво сабж звучит, по этому решил на таком названии и остановится у Microsoft есть imagehlp.dll и psapi.dll, ну это будет наш гибрид %)) ссылки на исходники для более детального знакомства, если вдруг у кого нет на СИ demonteam.narod.ru/download/imagehlp.rar (211kb) demonteam.narod.ru/download/psapi.rar (13kb) кстати у вас при этом есть возможность сравнить стиль написания кода предложенный мной с кодом от Microsoft %)) и вот пожалуй надо сказать пару слов о трудах Клерка, ссылка demonteam.narod.ru/download/ntpatch.rar (160kb) мне его стиль не очень, черточек много в названиях да и лишнего кода там много, но может кому проще в Native окунутся будет как раз по его исходникам на ASM`е кстати критика по стилю кодинга библы приветствуется, но с существенными комментариями ;) demonteam.narod.ru/download/nrapi.rar (18kb) как обычно предлагаю, если кто напишет свою хотя бы одну API, отпостите здесь свой кодес, я его добавлю в общую библиотеку чтобы ее могли юзать все кому интересен будет сабж, короче.. не жадничайте, плз! у меня не очень много времени бывает, так что бывает смогу отписаться только через неделю, так что не обращайте особого внимания, если есть чего обсудить без меня, и еще просьба не гнобить ньюбиков жаждущих поиметь новых знаний, плз!!! !!!Вопросы типа: у меня компилер не скомпилил и выдает такую-то ошибку, здесь писать не надо - идите в таком случае учите RTFM!!! а да забыл сказать, что кодес мы в dll будем юзать C++ нам сказали что это стандарт, но asm-кодеров мы незабываем никогда. Поэтому пишите на asm`е(только сами(копипаст не приветствуется, но можно)) и постите здесь, а мы его уже переведем в C++ и так хватит уже угарного треша, пора и к делу что у нас есть на данный момент из макросов RVATOVA(base, offset) GetImageDosHeader(base) GetImageNtHeaders(base) GetNumberOfSections(base) // Microsoft macro IMAGE_FIRST_SECTION in winnt.h GetFirstImageSectionHeader(base) GetImageExportDirectory(base) GetImageTlsDirectory(base) описывать для чего они нужны смысла не вижу, из имен макросов можно сразу понять для чего они... макросы были выбраны для работы с PE-форматом не случайно они сокращают код в исходнике, имеют более читабельный вид и при компиляции создается оптимальный бинарный код далее имена экспортируемых функций (тут суть не в том чтобы уже сразу заюзать готовый код) ULONG CalcHash(LPSTR name_api) NTSTATUS NrGetSystemModuleInformation(LPSTR ModuleName, PSYSTEM_MODULE_INFORMATION smi) NTSTATUS NrMapViewOfFile(LPSTR DosPathModuleName, HANDLE hProcess, PFILE_MAP_INFORMATION file_map_information) NTSTATUS NrUnmapViewOfFile(PFILE_MAP_INFORMATION file_map_information) NTSTATUS NrWriteVirtualMemoryProtect(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG BufferLength, PULONG ReturnLength) NTSTATUS NrReadVirtualMemoryProtect(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer,ULONG BufferLength, PULONG ReturnLength) NTSTATUS NrGetProcAddress(PVOID hModule, PULONG pArraryProcHash, PULONG pArraryReturnVaOfFunctions) бывает есть в наличии адрес и нужно узнать полный путь модуля, которому принадлежит этот адрес в его адресном пространстве или базовый адрес по которому загружен модуль, вот эта API ищет инфу о модуле на входе хендл процесса и адрес – на выходе заполненная информацией о модуле структура MODULE_INFORMATION NTSTATUS NrFindModule(HANDLE hProcess, PVOID Address, PMODULE_INFORMATION module_information) да я понимаю что этого совсем мало для релиза, можно сказать совсем ничего, но ведь цель не выложить готовое, а постараться самим КОМАНДОЙ создать что-то, а это просто в качестве примера – так сказать направление.. было бы не плохо, если у кого-нибудь есть хорошие ссылочки на чтиво по теме, запостите тут чтобы у новичков больше инфы было P. S. буду рад услышать мнение тех кто умеет/знает больше.. ЗЫ: у меня аттачи здесь не цепляются ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 01 августа 2008 21:02 · Личное сообщение · #2 Хех. Не знаю, почему автор приватно постенг прислал, но очень даже все и интересно написано Хотелось бы видеть нечто вроде этого: DWORD BinarySearch(BYTE* DATA,int SizeOfDATA,BYTE* Pattern,BYTE* SearchMask,int PatternLen) { ///////////////////////////////////////////////////////////////////// ///// // Example: // // BYTE Pattern[]= {0x00, 0x01, 0x00, 0x03}; // // {0x00, 0x01, 0x00, ??}; // BYTE SearchMask[]= {0, 0, 0, 1}; // int PatternLen=sizeof Pattern; // BYTE Data[]={0x01 ,0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01}; // int DataLen=sizeof Data; // // BinarySearch((unsigned char *)Data,DataLen,(unsigned char *)Pattern,(unsigned char *)SearchMask,PatternLen) // // if successfull find needed pattern, returns an offset to it // in this example it will return 3 ///////////////////////////////////////////////////////////////////// ///// bool Result; int Count; if (SizeOfDATA<PatternLen) { return PE_ERROR; } for (int i=0;i<SizeOfDATA;i++) { Count=0; Result=TRUE; if (DATA[i]==Pattern[0]) { for (int j=0;j<PatternLen;j++) { Count++; if (DATA[i+j]!=Pattern[j]) { Count--; Result=FALSE; if (SearchMask[j]==1) { Count++; Result=TRUE; } } } if ((Result==TRUE)&&(Count==PatternLen)) { return i; } } } return PE_ERROR; } Очень часто просто приходится искать некую последовательность байт в коде по маске. Моя функа не оптимизирована и хреновая (как о ней отозвались на форуме когда речь зашла о бинарном поиске по маске). Хотя я её применил в одном своём проекте довольно успешно =) Уверен что ты сможешь помочь в улучшении этой функи ;) я точно не помню, но где-то видел даже несколько топиков по этой теме Вообщем тут почесав мозг, решил зарелизить приватный алго на asm`е уровень сложности где-то средний, тут выложить кодес не проблема.. вот как его снабдить тех.документацией по себе знаю что бывает довольно тяжко, если нет описалова для кодеса вот такой паттерн мона заюзать в нем: C0 ?A ?? (11???01?) * 26 3? * 5C то, что в (11???01?) - это побитный поиск(8bit) (должно быть ровно 8, в скобках – 0 или 1 или ?) * - это любой бинарный байт(ы)(тут ограничение 100 байт(я уже сейчас точно не помню)) единственное что могу еще добавить не вариант больше или вообще без лимита, просто даже по одной из причин что может найти на начале и в самом конце(короче думаю ты поймешь если нужно будет) там юзается рекурсия я вот не помню скорее всего без лимитная ? – тут пожалуй все стандартно как и у всех, ну разве что мона и по тетраде(старшей/младшей) осуществлять поиск прототип для СИ extern "C" ULONG __stdcall BinWildcard(void *Base, unsigned long Length, char *szPattern); Base – адрес с которого начинается поиск Length – это длина того ГДЕ ИЩЕТСЯ szPattern – указатель на строку ASCII типа C0?A??(11???01?)*263?*5C заканчивающиеся нулем возвращает -1, если ничего не нашел, или адрес если нашел короче не знаю есть ли в природе быстрее алгоритм, но всяких там Гуано Педрасов уделает эт точно %))) там в алго парсер он сам переводит строку в нужный ему формат для поиска короче ниже это уже угарный трешь asm-кодеров (вообщем приватный сленг), но если в asm`е шаришь, то там ничего сложного нет! demonteam.narod.ru/download/modx86.rar вот как подключать к C/C++ проекту, вариантов очень много.. каждый выбирает для себя сам, короче эт уже RTFM мну его разжевывать не очень любит ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
|
Создано: 01 августа 2008 22:07 · Личное сообщение · #3 |
|
Создано: 03 августа 2008 20:07 · Личное сообщение · #4 Вот ща тупо на клавиши жму и слышу такой текст из песни: (еще музыка такая, разрушающая сознание) Blind me eyes, I can't see What is being done to me In my mind, only pain All the memories are drained и все таки мне его жалко... Иногда нужно заюзать чужой код в своем проекте, но этот чужой код может быть очень большой - к примеру 10 мегабайт, а нам нужно только около 1 мегабайта. Особенно это бывает актуально при рипе - когда много кода, а нужно рипнуть только нужный код или есть библа 10 мегабайт и ее таскать с собой из-за одной API – это АХТУНГ! Меня вообще добивают неудачники кодящие на C# - сам код, который они пишут, весит обычно не больше 100kb, но они делают инсталл и в него пихают стандартные сборки, которые уже у всех обычно установлены и в результате вместо полезного кода (100 килобайт), мы получаем проги от 1 до 10 мегабайт... да и вообще тут даже все это дело под большим вопросом, а писали ли они вообще этот код или просто тупо скопипастили и теперь им барыжнечают... ведь сейчас что-то писать самому это не есть гуд, можно просто банально тупо зайти на Google Code Search www.google.com/codesearch вбить нужный кодес и нажать на Search, гы-гы - а тут у нас как обычно проблема, че-то много нагуглило бывает даже глаза разбегаются от предоставленной халявы %)) вступайте и копилируйте вместе - сейчас уже это не актуально ИМХО GoogleCodeSearch - вы еще так ни разу не гуглели? Тогда мы идем к вам! все пишут и я напишу %)) тут пользы от этого кода ноль(но может кому и интересно будет понять что он делает), он чич-то для примера. Показывает как заюзать нужную API из чужого кода в ASM`е на примере адского MessageBox`а все как обычно, но будет всего одно отличие, в скомпиленом бинарике будет только тот код, который нам нужен и ничего кроме. в архиве динамик и статик скомпиленные варианты и исходники на ASM`е, короче все че надо чтобы разобраться как это работает, там есть. demonteam.narod.ru/download/UsedObj.rar (18kb) тут тоже из статика код выложу (чтобы гуглился) .386 .model flat,stdcall option casemap:none NrGetProcAddress PROTO :DWORD,:DWORD,:DWORD NrGetKernel32 PROTO NrBinWildcard PROTO :DWORD,:DWORD,:DWORD NrWriteVirtualMemoryProtect PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD include kernel32.inc includelib kernel32.lib includelib user32.lib includelib ntdll.lib includelib nrapi_static.lib cha MACRO name_api LOCAL hash hash = 0 FORC char, <name_api> hash = (((hash SHL 7) OR (hash SHR (32-7))) XOR '&char') ENDM EXITM <hash> ENDM API Struct LoadLibrary dd ? FreeLibrary dd ? EndKernel32 dd ? MessageBox dd ? EndUser32 dd ? API EndS .data? api API <?> hUser32 dd ? .data szUser32 db "user32.dll",0 hash_api API <cha(LoadLibraryA),cha(FreeLibrary),0,cha(MessageBoxA),0> szPattern db "54686973*696E20444F",0 .code UsedObj: invoke NrGetKernel32 invoke NrGetProcAddress, eax, addr hash_api, addr api push offset szUser32 call api.LoadLibrary mov hUser32, eax invoke NrGetProcAddress, eax, addr hash_api.MessageBox, addr api.MessageBox invoke NrBinWildcard, hUser32, 1000h, addr szPattern mov edi,eax add eax,13 mov esi,eax invoke GetCurrentProcess invoke NrWriteVirtualMemoryProtect, eax, esi, addr szUser32, 11, 0 push 0 push offset szUser32 push edi push 0 call api.MessageBox push hUser32 call api.FreeLibrary ret end UsedObj еще две мелочи пофиксил - может там еще че есть.. ну да ладно потом, если попадется там NrBinWildcard возвращала смещение, а не адрес - забыл просто, закомментил одну строчку и все гуд работает и в NrGetProcAddress дописать два плюса надо было, чтобы массив заполнялся пока вроде все пашет... ----- ЗЫ: истЕна где-то рядом, Welcome@Google.com |
eXeL@B —› Дневники и блоги —› Demon666 blog: Native Ring API (NRAPI) |