2012-05-21 04:12:37 -07:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2011-08-10 22:55:11 -07:00
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "nsWindowsDllInterceptor.h"
|
|
|
|
|
2012-04-10 12:52:56 -07:00
|
|
|
using namespace mozilla;
|
|
|
|
|
2011-08-29 04:23:35 -07:00
|
|
|
struct payload {
|
|
|
|
UINT64 a;
|
|
|
|
UINT64 b;
|
|
|
|
UINT64 c;
|
|
|
|
|
|
|
|
bool operator==(const payload &other) const {
|
|
|
|
return (a == other.a &&
|
|
|
|
b == other.b &&
|
|
|
|
c == other.c);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2011-10-13 07:01:52 -07:00
|
|
|
extern "C" __declspec(dllexport) __declspec(noinline) payload rotatePayload(payload p) {
|
2011-08-29 04:23:35 -07:00
|
|
|
UINT64 tmp = p.a;
|
|
|
|
p.a = p.b;
|
|
|
|
p.b = p.c;
|
|
|
|
p.c = tmp;
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
2011-08-10 22:55:11 -07:00
|
|
|
static bool patched_func_called = false;
|
|
|
|
|
2011-08-29 04:23:35 -07:00
|
|
|
static payload (*orig_rotatePayload)(payload);
|
2011-08-10 22:55:11 -07:00
|
|
|
|
2011-08-29 04:23:35 -07:00
|
|
|
static payload
|
|
|
|
patched_rotatePayload(payload p)
|
2011-08-10 22:55:11 -07:00
|
|
|
{
|
|
|
|
patched_func_called = true;
|
2011-08-29 04:23:35 -07:00
|
|
|
return orig_rotatePayload(p);
|
2011-08-10 22:55:11 -07:00
|
|
|
}
|
|
|
|
|
2011-08-29 04:23:45 -07:00
|
|
|
bool TestHook(const char *dll, const char *func)
|
|
|
|
{
|
|
|
|
void *orig_func;
|
|
|
|
WindowsDllInterceptor TestIntercept;
|
|
|
|
TestIntercept.Init(dll);
|
|
|
|
if (TestIntercept.AddHook(func, 0, &orig_func)) {
|
|
|
|
printf("TEST-PASS | WindowsDllInterceptor | Could hook %s from %s\n", func, dll);
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
printf("TEST-UNEXPECTED-FAIL | WindowsDllInterceptor | Failed to hook %s from %s\n", func, dll);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-22 05:18:52 -07:00
|
|
|
int main()
|
2011-08-10 22:55:11 -07:00
|
|
|
{
|
2011-08-29 04:23:35 -07:00
|
|
|
payload initial = { 0x12345678, 0xfc4e9d31, 0x87654321 };
|
|
|
|
payload p0, p1;
|
|
|
|
ZeroMemory(&p0, sizeof(p0));
|
|
|
|
ZeroMemory(&p1, sizeof(p1));
|
2011-08-10 22:55:11 -07:00
|
|
|
|
2011-08-29 04:23:35 -07:00
|
|
|
p0 = rotatePayload(initial);
|
2011-08-10 22:55:11 -07:00
|
|
|
|
|
|
|
{
|
2011-08-29 04:23:35 -07:00
|
|
|
WindowsDllInterceptor ExeIntercept;
|
|
|
|
ExeIntercept.Init("TestDllInterceptor.exe");
|
|
|
|
if (ExeIntercept.AddHook("rotatePayload", reinterpret_cast<intptr_t>(patched_rotatePayload), (void**) &orig_rotatePayload)) {
|
2011-08-10 22:55:11 -07:00
|
|
|
printf("TEST-PASS | WindowsDllInterceptor | Hook added\n");
|
|
|
|
} else {
|
|
|
|
printf("TEST-UNEXPECTED-FAIL | WindowsDllInterceptor | Failed to add hook\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2011-08-29 04:23:35 -07:00
|
|
|
p1 = rotatePayload(initial);
|
2011-08-10 22:55:11 -07:00
|
|
|
|
|
|
|
if (patched_func_called) {
|
|
|
|
printf("TEST-PASS | WindowsDllInterceptor | Hook called\n");
|
|
|
|
} else {
|
|
|
|
printf("TEST-UNEXPECTED-FAIL | WindowsDllInterceptor | Hook was not called\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2011-08-29 04:23:35 -07:00
|
|
|
if (p0 == p1) {
|
2011-08-10 22:55:11 -07:00
|
|
|
printf("TEST-PASS | WindowsDllInterceptor | Hook works properly\n");
|
|
|
|
} else {
|
|
|
|
printf("TEST-UNEXPECTED-FAIL | WindowsDllInterceptor | Hook didn't return the right information\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
patched_func_called = false;
|
2011-08-29 04:23:35 -07:00
|
|
|
ZeroMemory(&p1, sizeof(p1));
|
2011-08-10 22:55:11 -07:00
|
|
|
|
2011-08-29 04:23:35 -07:00
|
|
|
p1 = rotatePayload(initial);
|
2011-08-10 22:55:11 -07:00
|
|
|
|
|
|
|
if (!patched_func_called) {
|
|
|
|
printf("TEST-PASS | WindowsDllInterceptor | Hook was not called after unregistration\n");
|
|
|
|
} else {
|
|
|
|
printf("TEST-UNEXPECTED-FAIL | WindowsDllInterceptor | Hook was still called after unregistration\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2011-08-29 04:23:35 -07:00
|
|
|
if (p0 == p1) {
|
2011-08-10 22:55:11 -07:00
|
|
|
printf("TEST-PASS | WindowsDllInterceptor | Original function worked properly\n");
|
|
|
|
} else {
|
|
|
|
printf("TEST-UNEXPECTED-FAIL | WindowsDllInterceptor | Original function didn't return the right information\n");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2011-08-29 04:23:45 -07:00
|
|
|
if (TestHook("user32.dll", "GetWindowInfo") &&
|
|
|
|
#ifdef _WIN64
|
|
|
|
TestHook("user32.dll", "SetWindowLongPtrA") &&
|
|
|
|
TestHook("user32.dll", "SetWindowLongPtrW") &&
|
|
|
|
#else
|
|
|
|
TestHook("user32.dll", "SetWindowLongA") &&
|
|
|
|
TestHook("user32.dll", "SetWindowLongW") &&
|
|
|
|
#endif
|
|
|
|
TestHook("user32.dll", "TrackPopupMenu") &&
|
|
|
|
TestHook("ntdll.dll", "LdrLoadDll")) {
|
|
|
|
printf("TEST-PASS | WindowsDllInterceptor | all checks passed\n");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
2011-08-10 22:55:11 -07:00
|
|
|
}
|