lucky_789 发表于 2015-1-13 14:33:26

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目录,运行:



结果是错误的。

劫持是成功的:


问题出在哪里呢?



跟进去:


走出来就不对了:
是否要用指针取数组?晚上再测试了

Nisy 发表于 2015-1-13 14:49:54

问题可能在这里
lpk 的导出数组是dll初始化(dllmain 或 代码已直接赋值)的时候就已经赋值了,而你的导出数组是需要在调用某个函数后才给予赋值。劫持dll是在初始化的时候就把你导出的数组的数据进行了COPY,大约问题就出在这里。这种的话劫持貌似无解(需要在调用赋值函数的时候再次对导出数据赋值)。

qqlinhai 发表于 2015-1-13 15:41:32

好大个HyperSnap水印~

lucky_789 发表于 2015-1-13 18:07:03

Nisy 发表于 2015-1-13 14:49
问题可能在这里
lpk 的导出数组是dll初始化(dllmain 或 代码已直接赋值)的时候就已经赋值了,而你的导 ...

原来是这样啊{:soso_e154:}。还有导出的类没有测试,回头找空也测试一下。

lucky_789 发表于 2015-1-13 18:08:15

qqlinhai 发表于 2015-1-13 15:41
好大个HyperSnap水印~

时间太匆忙了,没来得及“注册”{:soso_e113:}

zhluosss 发表于 2016-7-1 10:10:17

什么时候可以放出来工具啊,
页: [1]
查看完整版本: HiJackDLL64劫持测试情况