HiJackDLL64劫持测试情况
本帖最后由 lucky_789 于 2015-1-13 18:11 编辑HiJackDLL64劫持dll的函数很成熟,测试了无数遍了。为了测试dll导出数组,昨晚学习了一晚上的dll编程。测试结果出乎意料{:soso_e127:},也可能是编程出现错误。现将情况报告一下。
为了测试,建3个项目:原带输出数组的DLLSample.dll、劫持的DLLSample.dll、测试程序testDll.exe
1、原带输出数组的DLLSample.dll
//DLLSample.h
#ifdef DLLSAMPLE_EXPORTS
#define DLLSAMPLE_API __declspec(dllexport)
#else
#define DLLSAMPLE_API __declspec(dllimport)
#endif
extern DLLSAMPLE_API int arrMyNum[]; //输出数组
DLLSAMPLE_API int GetArrNum(int x); //输出函数
// DLLSample.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "DLLSample.h"
// 这是导出变量的一个示例
int arrMyNum = {0};
// 这是导出函数的一个示例。
int GetArrNum(int x)
{
arrMyNum = x * 1;
arrMyNum = x * 2;
arrMyNum = x * 3;
arrMyNum = x * 4;
return 1;
}
如果这样,导出函数和数组长的这样:
神奇生成的就是这样:
添加一个def吧:
DLLSample.def:
LIBRARY "DLLSample"
EXPORTS
GetArrNum
arrMyNum DATA这样看的就和常见的一样了:
2、测试程序testDll.exe:
//testDll.cpp
#include <Windows.h>
#include <stdio.h>
#include "DLLSample.h"
#pragma comment(lib, "DLLSample.lib")
int main()
{
int x;
x = 100;
GetArrNum(x); //测试导出函数
printf("%d\n", arrMyNum); //测试数组
printf("%d\n", arrMyNum);
printf("%d\n", arrMyNum);
printf("%d\n", arrMyNum);
::system("pause");
return 0;
}
OK,编译成功,运行结果:
3、建立劫持项目
先将DLLSample.dll改名为DLLSample.PYG,用神奇生成模板:
DLLSample.def
NsHiJack.asm
NsHiJack.h
新建另一个DLLSample.dll(劫持用),将上述3个文件拷贝到项目中:
编译:
正在编译资源清单...
Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
Copyright (C) Microsoft Corporation.All rights reserved.
正在链接...
LINK : 没有找到 C:\myProcs\test\DLLSample\x64\Debug\DLLSample.dll 或上一个增量链接没有生成它;正在执行完全链接
x64\Debug\NsHiJack.obj : warning LNK4003: 无效的库格式;已忽略库
x64\Debug\NsHiJack.obj : warning LNK4003: 无效的库格式;已忽略库
正在创建库 C:\myProcs\test\DLLSample\x64\Debug\DLLSample.lib 和对象 C:\myProcs\test\DLLSample\x64\Debug\DLLSample.exp
x64\Debug\NsHiJack.obj : warning LNK4003: 无效的库格式;已忽略库
正在嵌入清单...
Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
Copyright (C) Microsoft Corporation.All rights reserved.
x64\Debug\NsHiJack.obj : warning LNK4003: 无效的库格式;已忽略库
x64\Debug\NsHiJack.obj : warning LNK4003: 无效的库格式;已忽略库
正在创建库 C:\myProcs\test\DLLSample\x64\Debug\DLLSample.lib 和对象 C:\myProcs\test\DLLSample\x64\Debug\DLLSample.exp
x64\Debug\NsHiJack.obj : warning LNK4003: 无效的库格式;已忽略库
生成日志保存在“file://c:\myProcs\test\DLLSample\DLLSample\x64\Debug\BuildLog.htm”
DLLSample - 0 个错误,6 个警告
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
成功。
将新的DLLSample.dll复制到testDll.exe目录,运行:
结果是错误的。
劫持是成功的:
问题出在哪里呢?
跟进去:
走出来就不对了:
是否要用指针取数组?晚上再测试了
问题可能在这里
lpk 的导出数组是dll初始化(dllmain 或 代码已直接赋值)的时候就已经赋值了,而你的导出数组是需要在调用某个函数后才给予赋值。劫持dll是在初始化的时候就把你导出的数组的数据进行了COPY,大约问题就出在这里。这种的话劫持貌似无解(需要在调用赋值函数的时候再次对导出数据赋值)。 好大个HyperSnap水印~ Nisy 发表于 2015-1-13 14:49
问题可能在这里
lpk 的导出数组是dll初始化(dllmain 或 代码已直接赋值)的时候就已经赋值了,而你的导 ...
原来是这样啊{:soso_e154:}。还有导出的类没有测试,回头找空也测试一下。
qqlinhai 发表于 2015-1-13 15:41
好大个HyperSnap水印~
时间太匆忙了,没来得及“注册”{:soso_e113:}
什么时候可以放出来工具啊,
页:
[1]