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

 eXeL@B —› Дневники и блоги —› Demon666 blog: Native Ring API (NRAPI)
Посл.ответ Сообщение

Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 01 августа 2008 22:07
· Личное сообщение · #3

Demon666 обалденно ты в тему ) , спасибо , оч пригодится ..

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 213.5 (наставник)
Активность: 0.120
Статус: Участник
забанен

Создано: 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)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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