请选择 进入手机版 | 继续访问电脑版

大富翁Delphi开发技术网站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 119|回复: 0

[未解决] 请懂C++代码的转成delphi

[复制链接]

4

主题

13

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2017-9-28 23:07:37 | 显示全部楼层 |阅读模式
开发交流
支持版本: Delphi 7 
资源分类: 函数 

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <string>
#include <vector>
using namespace std;

#define  HAS_DOG

#ifdef HAS_DOG
#define HOOK_ADDRESS_POINT 0x00418B37
DWORD CodeAddress=0x0069A1A8;
#else
#define HOOK_ADDRESS_POINT 0x00417287
DWORD CodeAddress=0x0065E798;
#endif
#define HOOK_ADDRESS_POINT_NEXT HOOK_ADDRESS_POINT+0x5

#define HOOK_EXENAME "PRJ.exe" //被注入EXE

char gTemp[100]={0};
char *p1=NULL,*p2=NULL,*p3=NULL,*p4=NULL,*p5=NULL;
char MFname[MAX_PATH]={0};
DWORD colcount=0;
DWORD rowno=0;
FILE *logFile=NULL;

static string ExtractFileDir( const char * FileName )
{
        char drive[MAX_PATH],dir[MAX_PATH];
        _splitpath(FileName,drive,dir,NULL,NULL);
        strcat(drive,dir);
        return drive;
}

void init(HMODULE hModule);
void ET_hookBlood();
void showmsg(const char*p1,const char*p2,const char*p3,const char*p4,const char*p5,int rowno,int colcount);



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                init(hModule);
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}



void init(HMODULE hModule)
{
        char dllPath[MAX_PATH]={0};

        GetModuleFileName(NULL,dllPath,MAX_PATH);
        //判断如果是ETCom.exe加载则执行,否则跳过.
        if(strstr(dllPath,HOOK_EXENAME))
        {
                memset(dllPath,0x00,sizeof(dllPath));
                GetModuleFileName(hModule,dllPath,MAX_PATH);
                string recDir=ExtractFileDir(dllPath);
                recDir+="\\ETCom.rec";
                strcpy(MFname,recDir.c_str());
                logFile=fopen(MFname,"w");
                fclose(logFile);
                logFile=NULL;

                BYTE write[5];                       
                DWORD address, *temp;   
                write[0] = 0xE9;               
                __asm
                {
                        mov ecx,offset ET_hookBlood  
                                mov address,ecx              
                                sub address,HOOK_ADDRESS_POINT_NEXT
                                add address,3
                }
                temp = (DWORD *)&write[1];      
                *temp = address;                 
                WriteProcessMemory(GetCurrentProcess(), (LPVOID)HOOK_ADDRESS_POINT, write, sizeof(write), NULL);
        }       
}


void ET_hookBlood()
{
        __asm {
                call CodeAddress
        }
        __asm{
                mov rowno,edi
                mov colcount,eax
                        mov ecx,dword ptr ss:[esp+0x10]
                mov p1,ecx
                        mov ecx,dword ptr ss:[esp+0x14]
                mov p2,ecx
                        mov ecx,dword ptr ss:[esp+0x18]
                mov p3,ecx
                        mov ecx,dword ptr ss:[esp+0x1C]
                mov p4,ecx
                        mov ecx,dword ptr ss:[esp+0x20]
                mov p5,ecx
        }

        if(rowno==1)
                logFile=fopen(MFname,"w");

        if(colcount==2 || colcount==3)       
                showmsg(p1,p2,p3,p4,p5,rowno,colcount);

        __asm
        {
                mov ecx,HOOK_ADDRESS_POINT_NEXT         
                        jmp ecx
        }
}
void showmsg(const char*p1,const char*p2,const char*p3,const char*p4,const char*p5,int rowno,int colcount)
{
#ifdef HAS_DOG       
        if(/*(DWORD)p4==0x32 || */!isalpha(*p4))
#else
        if((DWORD)p4==0x32 || !isalpha(*p4))
#endif
        {
                if(colcount==3)                        sprintf(gTemp,"%s        %s        %s        %s        %d",p1,p2,p3,p5,rowno);
                if(colcount==2)                        sprintf(gTemp,"%s        %s        %s        %s(标)        %d",p1,p2,p3,p5,rowno);
        }
        else
        {
                if(colcount==3)                        sprintf(gTemp,"%s        %s        %s        %s        %d",p1,p2,p3,p4,rowno);
                if(colcount==2)                        sprintf(gTemp,"%s        %s        %s        %s(标)        %d",p1,p2,p3,p4,rowno);
        }
        fprintf(logFile,"%s\n",gTemp);
        fflush(logFile);
}


//////////////////////////////////
// ETCom_Net_GetListDataDLL.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "ETCom_Net_GetListDataDLL.h"

#include <string>
#include <vector>
using namespace std;
// TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用
static string ExtractFileDir( const char * FileName )
{
        char drive[MAX_PATH],dir[MAX_PATH];
        _splitpath(FileName,drive,dir,NULL,NULL);
        strcat(drive,dir);
        return drive;
}

static vector<string>& splitEx(const string& src, string separate_character,vector<string> &strs)
{
        int separate_characterLen = separate_character.size();
        int lastPosition = 0,index = -1;
        while (-1 != (index = src.find(separate_character,lastPosition)))
        {
                strs.push_back(src.substr(lastPosition,index - lastPosition));
                lastPosition = index + separate_characterLen;
        }
        string lastString = src.substr(lastPosition);
        if (!lastString.empty())
                strs.push_back(lastString);
        return strs;
}


int getdata(int nCol,char *outBuf,int bufLen)//=>errCode
{
        char buffer[256]={0};
        char exePath[MAX_PATH]={0};
        string strOut="";

        if(outBuf==NULL || bufLen==0 || nCol<1) return -1;//输入参数不正确
        GetModuleFileName(NULL,exePath,MAX_PATH);
        string recDir=ExtractFileDir(exePath);
        recDir+="\\ETCom.rec";
        FILE *fp=NULL;

        fp=fopen(recDir.c_str(),"r");
        if (!fp)
                return -2;//打开文件失败

        while (!feof(fp))                                   
        {   
                fgets(buffer,200,fp);                     
                if(strlen(buffer)>0)
                {
                        string src=buffer;
                        vector<string> strs;
                        splitEx(src, "\t",strs);
                        if(nCol>strs.size())
                        {
                                fclose(fp);  
                                return -1;//输入参数不正确
                        }
                        strOut+=strs[4-nCol];
                        strOut+="\t";
                }
        }   
        fclose(fp);
        if(bufLen<strOut.size()+1) return -3;//缓存块不够大
        strcpy(outBuf,strOut.c_str());
        return 0;
}

转载请保留当前帖子的链接:http://www.dfwlt.com/forum.php?mod=viewthread&tid=2460 谢谢!

搜索简单,分享不易,且分享且珍惜,您难道不想分享下您的心得?如果觉得本文章好的话,您可以在我们网站上注册,然后发布您的好的心得,让大家共同进步,谢谢!

最新添加

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

申请友链|Archiver|手机版|小黑屋|大富翁Delphi开发技术网站 ( 苏ICP备12065705号-4

GMT+8, 2017-12-14 10:34 , Processed in 0.094207 second(s), 30 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表