Windows 程序的手术刀-- DynC

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/

大家在拿到一个没有源码的Windows程序时,如果想了解它的行为,最直接的方法恐怕
就是祭起 OllyDBG了吧。但是很多情况下OllyDBG尽管能够看出程序的行为,但是对于某些
时间敏感或者大量的函数调用、数据交换——比如监控socket、监控消息循环等等, OllyDBG
的设断->查看->运行这样的方法就很让人抓狂了。如果要想改变程序行为,在OllyDBG里就
要写汇编代码了,而且一不小心,辛辛苦苦写出的代码就会丢失。这时你可能会使用注入
DLL 的方式来做监控,但是这样自己需要编写一个DLL、一个DLL Injector,并且所有的跟
监控不相关的逻辑都必须自己实现(Hook,传出监控结果等等)。
如果你要做的就是像这样类似于手术的工作,有一个专门的工具可以帮助你实现
——DynC!
DynC全名叫“DynC动态分析C 语言编译器”,名字当然是作者起的。在Google上搜索
“dync pediy” 就可以找到这个工具。尽管是个 2007 年写成的工具,在 Windows 7 上依
然可用。
这是一个专门用来向其他进程注入代码的工具,代码使用 C 语言编写,提供了
LoadLibrary、GetProcAddress 函数,以及专门用来做 Hook 的 HookFunc、HookAPI 函数,
用作输出的 print、hex。编写的代码会根据选中的进程,现场编译并且将代码注入进程。
基本用法我就不作介绍了,大家可以根据下文的命令猜个七七八八的,或者在作者的帖子里
学习。  

当时看到的时候就知道,这绝对算得上是神器,只是神器的威力一直没有发挥的地方。
终于有一天,我希望了解一下短信/电话号码备份软件是怎么读取 SIM 卡的,但是机器上并
没有 VC,于是便想到了 DynC。  

实际应用  

DynC分两部分,一部分是Server,运行后会在托盘上显示一个图标;一部分是Client,
用来操作。
打开窗口后,执行以下命令:
lk
连接成功!
ls 

 
 
ListProcess ==> ALL
---------------------------------------------------------------------------
-
     ……
     3944 : C:\Program Files\Dekart\SIM Manager\SIMManager.exe
  ……
---------------------------------------------------------------------------
-
at 3944
SetCurrentDirectory C:\Program Files\Dekart\SIM Manager
Attach PID:3944
Open DYNC File:SIMManager.exe.dyn
Load DYNC File: 1942 bytes

这时目标就已经设定好了,可以打开“源代码编辑”窗口进行代码编写了。
这是我用来截获通信的代码,只Hook 了一个SCardTransmit函数   
 /* 省略了一些函数声明 */
int hHook; /* Hook的句柄 */
typedef unsigned long DWORD;
typedef struct _scioreq { /* SCardTransmit相关的结构 */
  DWORD dwProtocol;
  DWORD cbPciLength;
} SCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
/* 编写代码的时候要注意,Windows 的 API 一定要加上 WINAPI 这个标记,不然 DynC
会把函数当做C调用约定的,而不是stdcall调用约定 */
long WINAPI (*SCardTransmit)( /* 函数原型、指针 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,

  DWORD *pcbRecvLength) = 0;
long WINAPI my_sct( /* 挂钩函数 */
 int hCard,
 LPSCARD_IO_REQUEST pioSendPci,
 char *pbSendBuffer,
  DWORD cbSendLength,
 LPSCARD_IO_REQUEST pioRecvPci,
 char *pbRecvBuffer,
  DWORD *pcbRecvLength)
{
long ret;
 print("--> ");
  hex(pbSendBuffer, cbSendLength); /* 输出 pbSendBuffer指向的内容 */

 DisableHook(hHook);/* 禁用 Hook,因为是通过 inline hook 实现的,所以调用
原函数的时候要先恢复hook */
 ret = SCardTransmit( /* 调用原函数 */
  hCard,
  pioSendPci,
  pbSendBuffer,
  cbSendLength,
  pioRecvPci,
  pbRecvBuffer,
  pcbRecvLength);
 EnableHook(hHook); /* 启用 Hook */
 print("<-- ");
  hex(pbRecvBuffer, *pcbRecvLength); /* 输出pbRecvBuffer 的内容*/


 return ret;
}
//代码初始化函数,加载时运行
void InitInstance(void)
{
  SCardTransmit = 
  GetProcAddress(LoadLibrary("winscard.dll"), "SCardTransmit");
  hHook = HookFunc(SCardTransmit, my_sct); /* 挂钩,很方便吧 */

//代码注销函数,退出时运行
void ExitInstance(void)
{
 UnHook(hHook);
 print("exit\n");

 

}

编写代码完成了,就可以在控制台里面执行了:   
run
Compile Success.
Code Size:2895 bytes
InjectRemoteThread Success.

这时候我们让程序读取SIM卡,就可以看到通信的内容了!

转自寂涯网络 www.jybase.net

原帖地址http://www.jybase.net/windows/20111106578.html

你可能感兴趣的:(windows,程序,监控,编译器,手术刀)