У меня такая проблема: в eax база файла(кернел32.длл) чтобы перейти к нт заголовку мы добавляем к eax 3C далее чтобы перейти к DataDirectory в опциональном заголовке к eax надо добавить 118 (или 76 в hex). Вот теперь в eax адрес datadirectory, в уроках iczelinon'a написано чтобы перейти к таблице эскпорта мы должны размер IMAGE_DATA_DIRECTORY(8 байт) умножить на ноль и за тем результат добавить к адресу DataDirectory. В результате мы получем адрес структуры IMAGE_DATA_DIRECTORY с rva на таблицу экспорта. Так как 8*0 = 0 (как ни странно!11) то к eax ни че добавлять не надо правильно? Ну и затем я пробую поместить в edi VirtualAddress из IMAGE_DATA_DIRECTORY и эксепшн. вот кодес Код (Text): format PE GUI 5.0 include '%fasminc%\win32ax.inc' include '%fasminc%\macro\masm.inc' section '.code' code writeable readable executable Msg db 'MessageBoxA',0 macro GetKernelBase{ xor eax,eax mov eax,[fs:eax+30h] mov eax,[eax+0ch] mov esi,[eax+1ch] lodsd mov eax,[eax+08h] } include '%fasminc%\PE.INC' entry $ GetKernelBase;получаем базу кернел32.длл mov edi,eax add eax,[eax+3ch];Переходим к NTHeader add eax,[eax+118];пеhеходим к DataDirectory assume eax:IMAGE_DATA_DIRECTORY mov edi,[eax.VirtualAddress];тут exception ret
а что получается на асме? eax + сколько? кстати да, ты б под олькой посмотрел, че там и как, какие адреса в регистрах и т.д.
Это разные вещи. Код (Text): add eax,[eax+118] Прибавить к eax содержимое памяти по адресу eax+118 Код (Text): lea eax,[eax+118] Прибавить к eax 118.
Во-первых, не 76h, а 78h = 120. Во-вторых, если хочется получить адрес структуры IMAGE_DATA_DIRECTORY, то нужно добавлять 78h, а не содержимое памяти [eax+78h] (это содержимое - первый элемент IMAGE_DATA_DIRECTORY).
MSoft плюс нисколько патамуш VirtualAddress первый член структуры IMAGE_DATA_DIRECTORY и в ольке я смотрел к нт переходит все а дальше говорю эксепшн
вот поправил код Код (Text): format PE GUI 5.0 include '%fasminc%\win32ax.inc' include '%fasminc%\macro\masm.inc' section '.code' code writeable readable executable Msg db 'MessageBoxA',0 macro GetKernelBase{ xor eax,eax mov eax,[fs:eax+30h] mov eax,[eax+0ch] mov esi,[eax+1ch] lodsd mov eax,[eax+08h] } include '%fasminc%\PE.INC' entry $ GetKernelBase;получаем базу кернел32.длл add eax,[eax+3ch];Переходим к NTHeader add eax,76h;пеhеходим к DataDirectory assume eax:IMAGE_DATA_DIRECTORY mov eax,[eax.VirtualAddress] assume eax:IMAGE_EXPORT_DIRECTORY mov eax,[eax.NumberOfFunctions];exception ret подскажите пожалуйста что не так?
Потому что VirtualAddress из IMAGE_DATA_DIRECTORY - это RVA, он является не абсолютным адресом, а смещением относительно начала образа. add eax,edi нужно для доступа к IMAGE_EXPORT_DIRECTORY.
Хоть бы что Ты б и писал что он к структуре неправильно обращается. Это ж не лучше, то что у него вообще неправильно было.
еще один вопрос Код (Text): format PE GUI 5.0 include '%fasminc%\win32ax.inc' include '%fasminc%\macro\masm.inc' section '.code' code writeable readable executable Msg db 'MessageBoxA',0 KernelBase dd ? KernelExport dd ? macro GetKernelBase{ xor eax,eax mov eax,[fs:eax+30h] mov eax,[eax+0ch] mov esi,[eax+1ch] lodsd mov eax,[eax+08h] mov [KernelBase],eax } macro GetKernelExport{ mov edi,eax add edi,[eax+3ch];Переходим к NTHeader add edi,78h;пеhеходим к DataDirectory mov esi,[edi] add eax,esi } include '%fasminc%\PE.INC' entry $ GetKernelBase;получаем базу кернел32.длл GetKernelExport;получаем указатель на таблицу экспорта assume eax:IMAGE_EXPORT_DIRECTORY mov ebx,[eax.AddressOfNames] mov esi,ebx _find: push ebx add ebx,[KernelBase] mov edi,Msg cmp ebx,edi jz _ret pop ebx add ebx,4 jmp _find _ret: ret _ok: jmp _ret Не мог понять из за чего тут эксепшн. Например если запустить на выполнение под отладчиком, то некоторое время программа работает, потом останавливается(возникает эксепшн) листинг пустой, ebx содержит искомый MessageBoxA а на вершине стека адрес возврата и все. В чем проблема?
еще один вопрос Код (Text): format PE GUI 5.0 include '%fasminc%\win32ax.inc' include '%fasminc%\macro\masm.inc' section '.code' code writeable readable executable Msg db 'MessageBoxA',0 KernelBase dd ? KernelExport dd ? macro GetKernelBase{ xor eax,eax mov eax,[fs:eax+30h] mov eax,[eax+0ch] mov esi,[eax+1ch] lodsd mov eax,[eax+08h] mov [KernelBase],eax } macro GetKernelExport{ mov edi,eax add edi,[eax+3ch];Переходим к NTHeader add edi,78h;пеhеходим к DataDirectory mov esi,[edi] add eax,esi } include '%fasminc%\PE.INC' entry $ GetKernelBase;получаем базу кернел32.длл GetKernelExport;получаем указатель на таблицу экспорта assume eax:IMAGE_EXPORT_DIRECTORY mov ebx,[eax.AddressOfNames] mov esi,ebx _find: push ebx add ebx,[KernelBase] mov edi,Msg cmp ebx,edi jz _ret pop ebx add ebx,4 jmp _find _ret: ret _ok: jmp _ret Не мог понять из за чего тут эксепшн. Например если запустить на выполнение под отладчиком, то некоторое время программа работает, потом останавливается(возникает эксепшн) листинг пустой, ebx содержит искомый MessageBoxA а на вершине стека адрес возврата и все. В чем проблема? PS сорри за повторный пост , это инет тупит.
я чет не пойму, ты MessageBoxA в кернеле ищешь??? и ты сравниваешь адреса или пытаешься сравнить строки через cmp reg,reg???