现在在尝试用hook的方式从一个dll文件中dump出里面的一些算法函数,使用的代码是通过AheadlibPlus(john)生成的hook然后修改,大致的内容形式如下:
// 导出函数
#pragma comment(linker, "/EXPORT:N8JDllMain=AheadLib_J9VMDllMain,@1")
// 原函数地址指针
PVOID(*pfnN8JDllMain)(PVOID p0, PVOID p1, PVOID p2, PVOID p3, PVOID p4, PVOID p5, PVOID p6, PVOID p7, PVOID p8, PVOID p9, PVOID p10, PVOID p11, PVOID p12, PVOID p13 );
//中间是宏定义、HOOK命名空间、Aheadlib命名空间,基本没有改动
inline void WINAPI initAddress()
{
pfnN8JDllMain = (decltype(pfnN8JDllMain))GetAddress("N8JDllMain");
*****
}
//加载原始函数、释放原始模块没有更改
// 导出函数
ALCDECL AheadLib_N8JDllMain(PVOID p0, PVOID p1, PVOID p2, PVOID p3, PVOID p4, PVOID p5, PVOID p6, PVOID p7, PVOID p8, PVOID p9, PVOID p10, PVOID p11, PVOID p12, PVOID p13 )
{
prevFunc();
java_defineClass((JNIEnv*)p0,
(jclass)p1,
(jstring)p2,
(jbyteArray)p3,
(jint)p4,
(jobject)p5,
(jstring)p6, p7, p8, p9, p10, p11, p12, p13);
setFunc(pfnN8JDllMain);
endFunc();
}
//定义导出命令
jclass __stdcall java_defineClass(JNIEnv* env, jclass cls, jstring name, jbyteArray data, jint length, jobject pd, jstring source, LPVOID p7, LPVOID p8, LPVOID p9, LPVOID p10, LPVOID p11, LPVOID p12, LPVOID p13)
{
return (jclass)pfnJava_java_lang_ClassLoader_defineClassImpl((LPVOID)env, (LPVOID)cls, (LPVOID)name, (LPVOID)data, (LPVOID)length, (LPVOID)pd, (LPVOID)source, p7, p8, p9, p10, p11, p12, p13);
}
这里只是描述一下基础的代码构成,在这个java_defineClass方法里面也没有进行任何操作,现在的问题是,这个dll劫持之后,只能dump出一部分的方法函数,然后就报错弹出。
因为是另外一个程序启动的时候调用的dll文件,不方便调试,求助一下这个可能是因为什么原因,有什么处理思路。