실험 목적을 위해 DLL에서 내보낼 수없는 함수에 액세스하려고합니다. 왜 이것이 나쁜 생각인지 명백한 이유를 논의하지 않고 ...액세스 위반이 아닌 내 보낸 된 DLL 함수를 호출하는 C++
나는 정확한 함수 프로토 타입을 만들었고, 코드가 내가 원하는 모듈에서 오프셋으로 점프하고 있는지 확인할 수 있습니다.
는 C++ 코드
typedef int (__stdcall *FN)(int,wchar_t *);
const DWORD_PTR funcOffset = 0x6F5B9;
int _tmain(int argc, _TCHAR* argv[])
{
FN myFunction;
DWORD dwResult;
HMODULE hModule=LoadLibrary(L"undocumented.dll");
if (hModule != NULL)
{
DWORD_PTR funcAddress = (DWORD_PTR)GetProcAddress(hModule, "DllRegisterServer") + funcOffset;
myFunction = (FN)funcAddress;
wchar_t input[] = L"someinputdata";
int result = myFunction(0,input);
std::cout << "Result: " << result << std::endl;
}
else
{
dwResult = GetLastError();
std::cerr << "Failed: " << dwResult << std::endl;
}
return 0;
}
함수 오프셋 점프하지만, I는 MOV [ESI + 8], EAX에서 액세스 위반을 얻는다. 나는이
mov edi, edi
push ebp
mov ebp, esp
sub esp, 0Ch
cmp [ebp+<wchar_t *>], 0
push esi
mov esi, ecx
jz short <some location> ; doesn't jump
push [ebp+<wchar_t *>]
call ds:_wcsdup
mov [esi+8], eax <- access violation
ECX가 호출 DS에 설정된 방지하기 위해 무엇을 할 수 : _wcsup :
__wcsdup:
75DBEFA3 mov edi,edi
75DBEFA5 push ebp
75DBEFA6 mov ebp,esp
75DBEFA8 cmp dword ptr [ebp+8],0
75DBEFAC je __wcsdup+2161Ah (75DE05BDh)
75DBEFB2 mov ecx,dword ptr [ebp+8]
75DBEFB5 push edi
75DBEFB6 xor edi,edi
75DBEFB8 lea edx,[ecx+2]
75DBEFBB mov ax,word ptr [ecx]
75DBEFBE add ecx,2
75DBEFC1 cmp ax,di
75DBEFC4 jne __wcsdup+18h (75DBEFBBh)
75DBEFC6 sub ecx,edx
75DBEFC8 sar ecx,1
75DBEFCA push ebx
75DBEFCB push 2
75DBEFCD lea ebx,[ecx+1]
75DBEFD0 push ebx
75DBEFD1 call _calloc (75DBBE55h)
75DBEFD6 mov edi,eax
75DBEFD8 pop ecx
75DBEFD9 pop ecx
75DBEFDA test edi,edi
75DBEFDC je __wcsdup+2161Eh (75DE05C1h)
75DBEFE2 push dword ptr [ebp+8]
75DBEFE5 push ebx
75DBEFE6 push edi
75DBEFE7 call _wcscpy_s (75DBBB70h)
75DBEFEC add esp,0Ch
75DBEFEF test eax,eax
75DBEFF1 jne __wcsdup+5626Fh (75E15212h)
75DBEFF7 mov eax,edi
75DBEFF9 pop ebx
75DBEFFA pop edi
75DBEFFB pop ebp
75DBEFFC ret
저는 x86 어셈블러를 잘 모릅니다. 'ecx'는 어디에 설정되어 있습니까? (이 값은 AV가 발생하는 주소 인 'esi'에 들어갑니다.) 당신은 프리 앰블 대신 함수의 중간으로 뛰어들 가능성이 있습니까? 호출 규칙이'__stdcall'이 아닌 것이 가능한가? – Cameron
오프셋이 맞습니까? 'fn'에'0x6F5B9'을 추가하는 것은'fn'을'0x6F5B9' 바이트만큼 진행하지 않고'0x6F5B9 * sizeof (DWORD)'바이트만큼 진행합니다. –
ecx가 ds : _wcsdup –