如何转化编译如下的C代码,倾家荡产-- 200分(200分)

  • 主题发起人 主题发起人 xuqy
  • 开始时间 开始时间
X

xuqy

Unregistered / Unconfirmed
GUEST, unregistred user!
本人实在看不懂如下代码,是关于捕捉系统的任意一函数调用的.
如何转化后在delphi中编译它.<要变成汇编吗?,怎么变>
我倾家荡产,奉献所有的分数 200分,
BOOL
InstallProbe1(void)
{
WORD selCS , selDS ;
char FAR * lpJmp ;
char FAR * lpCode ;
selCS = FP_SEG((void FAR *)ExtTextOut);
selDS = AllocCStoDSAlias(selCS ) ;
lpCode = MK_FP ( selDS , FP_OFF( (void FAR * ) ExtTextOut ) ) ;
_fmemcpy( OldCode , lpCode , 5 );
lpCode[0] = 0xEA ;
lpJmp = (char FAR * )&amp;Jmp2Me;
lpCode[1]=lpJmp[0];
lpCode[2]=lpJmp[1];
lpCode[3]=lpJmp[2];
lpCode[4]=lpJmp[3];
FreeSelector(selDS );
return TRUE;
}
 
16位程序?
win32下无法这么做的.
这段代码是找到ExtTextOut函数的入口地址, 把这段内存作为自己程序数据段, 然后替换前5字
节(跳转到自己的程序).
win32下应该是无法编译通过的.
哪抄来的?
该程序只适用于win 3.1
 
Xixi, 这就是我提供的用于屏幕抓词的C程序中的原码呀!
这段代码是科大的高手所为,
简单解释如下:
selCS = FP_SEG((void FAR *)ExtTextOut);
// 获得ExtTextOut函数的代码段的段地址
selDS = AllocCStoDSAlias(selCS ) ;
//准备用数据段的方式访问代码段,从而可以修改ExtTextOut函数的入口部分
lpCode = MK_FP ( selDS , FP_OFF( (void FAR * ) ExtTextOut ) ) ;
//得到可以写的段中的ExtTextOut函数的入口地址指针
_fmemcpy( OldCode , lpCode , 5 );
// 记住开头的5字节,以备跳转到自己的程序之后恢复用
lpCode[0] = 0xEA ;
// 二进制指令,无条件跳转
lpJmp = (char FAR * )&amp;Jmp2Me;
// 跳转地址为自己写的结构中记录的地址
lpCode[1]=lpJmp[0];
// 把自己需要跳转到的地址依次写到无条件跳转指令
lpCode[2]=lpJmp[1];
// 的目标地址部分
lpCode[3]=lpJmp[2];
lpCode[4]=lpJmp[3];
FreeSelector(selDS );
// 修改代码段结束
如果您想将这段代码改称Delphi也不是不可以,不过我曾经给过说明的,
在Delphi中只要直接使用那个例子程序中提供的编译好的DLL就行了,很
简单的,参照那个对话框的例子就行了
有什么问题再联系

 
WINNT下的程序,请看:
BOOL
InstallProbeExtTextOutA(void)
{
PTShareData pData=NULL;
HANDLE hMapFile =NULL;
TLongJmp Jmp2Me ;
DWORD dwPro ;
DWORD nWriten;
MEMORY_BASIC_INFORMATION memInfo ;
DWORD dwOldProtect;
DWORD dwOldProtect2;
GetShareMem(pData);
if ( pData==NULL){
return FALSE;
}

memset ( &amp;memInfo , 0 , sizeof(MEMORY_BASIC_INFORMATION));
dwPro = VirtualQuery(pData->ExtTextOutA , &amp;memInfo ,sizeof(MEMORY_BASIC_INFORMATION) );

if ( dwPro != sizeof(MEMORY_BASIC_INFORMATION) ){
return FALSE ;
}
if (!VirtualProtect(pData->ExtTextOutA , JMPMYCODESIZE , PAGE_EXECUTE_WRITECOPY , &amp;dwOldProtect )){
Say("Can not change the memory RW flag!");
return FALSE ;
}

Jmp2Me.JmpOp = JMPOPCODE ;
Jmp2Me.Addr = (LPVOID)((LONG)MyExtTextOutA - (LONG)pData->ExtTextOutA - JMPMYCODESIZE) ;
if(!WriteProcessMemory(GetCurrentProcess(),pData->ExtTextOutA, &amp;Jmp2Me , JMPMYCODESIZE ,&amp;nWriten)){
FreeShareMem(pData);
//Say("Write failed!");
return FALSE;
}
VirtualProtect(pData->ExtTextOutA , JMPMYCODESIZE , dwOldProtect , &amp;dwOldProtect2 );
FreeShareMem(pData);
return TRUE;
}
 
请看如下的网站,我不想抢人饭碗的,但我想知道其中的奥秘.
>>如何用delphi编写具有“屏幕抓字”功能的电子字典?
>>请您访问我的个人网页:“屏幕抓字教程”
>>http://grwy.online.ha.cn/happyDelphi
>>详尽地描述了编写电子字典的关键技术:“屏幕抓字”(即指即译,鼠标取词)的原
>>理,及如何拦截WIN9X中的API函数,如何在IE4,IE5测试版和IE5正式版中实现屏幕抓
字。
>>您可免费下载:
>>拦截WIN 9x 系统 API 函数的拦截引擎TWORM类;
>>可与金山词霸媲美的屏幕抓字的DLL;
>>如果您觉得我的TWROM会对编程提供一个全新的思路,也请帮忙宣传。
 
接受答案了.
 
API HOOK、屏幕取词的完整解决方案见我的《delphi深入windows核心编程》一书,
解决了IE、win98下的高技术难题,支持windows98/2000/xp,
我的主页http://wenjinshan.yeah.net
 
后退
顶部