首页
社区
课程
招聘
[旧帖] [求助]一句 C 代码 转成 Delphi 0.00雪花
发表于: 2008-5-11 22:52 3548

[旧帖] [求助]一句 C 代码 转成 Delphi 0.00雪花

2008-5-11 22:52
3548
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自已顶,    一天了.5555555
2008-5-12 23:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
再顶.又一天..........................
2008-5-13 21:37
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
真没有办法,几天也没有搞定

0040116E  |?  8B45 FC       mov     eax, dword ptr [ebp-4]
00401171  |?  8B48 3C       mov     ecx, dword ptr [eax+3C]
00401174  |.  8B55 08       mov     edx, dword ptr [ebp+8]
00401177  |.  8B040A        mov     eax, dword ptr [edx+ecx]

也不知道是什么意思,这个是汇编代码
2008-5-14 16:08
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
5
#define ibaseDD *(PDWORD)&ibase

var ibaseDD:DWORD;
begin
  ibaseDD := PDWORD(@ibase)^;
end;
2008-5-14 18:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
to 小虾

这也不对
  
原版     
/////  
if (ibaseDD[mzhead->e_lfanew]!=IMAGE_NT_SIGNATURE))
/////
printf("ibaseDD[mzhead->e_lfanew] %i\n",ibaseDD[mzhead->e_lfanew]!=);

//显示结果为 17744   而 mzhead->e_lfanew =224

我将你的代码写成函数

function ibaseDD(ibase:dword):DWORD;
begin
  result := PDWORD(@ibase)^;
end;

/////
ibaseDD(mzhead._lfanew)
////

结果还是224    mzhead._lfanew的值为224

但是这样却能得到正确结果:
function ibaseDD(ibase:dword):PDWORD;
  asm
    mov     eax, dword ptr [ebp-4]
    mov     ecx, dword ptr [eax+$3C]
    mov     edx, dword ptr [ebp+8]
    mov     eax, dword ptr [ecx+eax]
  end;

原本是
  mov     eax, dword ptr [edx+ecx]
硬是改成了才行
  mov     eax, dword ptr [ecx+eax]

怕会出现不同机器会有冲突
2008-5-14 20:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
但是这样却能得到正确结果:
function ibaseDD(ibase:dword):PDWORD;
  asm
    mov     eax, dword ptr [ebp-4]
    mov     ecx, dword ptr [eax+$3C]
    mov     edx, dword ptr [ebp+8]
    mov     eax, dword ptr [ecx+eax]
  end;

这样试了多次后不稳定,时而行时而不行
2008-5-14 20:48
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
8
我给的代码没有错,只是你给的代码不完整。你完整的代码我估计是这样的:
ibase变量保存着的是PE文件的ImageBase基地址。所以
#define ibaseDD *(PDWORD)&ibase
这个操作就是将ibase变量类型强制转换为PDWORD指针,并将ibase保存着的PE文件ImageBase地址传给ibaseDD变量。如你可以测试测试下面的代码得出的结果应该和你得出的结果是相同的。
var ibaseDD:DWORD;
      ibase:DWORD;
begin
  ibase := hInstance; // 我这里是测试,所以将自己的程序的hInstance基地址传给ibase变量
  ibaseDD := PDWORD(@ibase)^; // 这里是转换你前面的代码。
  ShowMessage(IntToStr(DWORD(PDWORD(ibaseDD + DWORD(pImageDosHeader(ibaseDD)._lfanew))^))); // 这里显示17744的值
end;
2008-5-15 09:36
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
9
而且,你的汇编代码也转换错了,应该是这样才对:
function GetPE(ibase:dword):DWORD;stdcall
  var ibaseDD:DWORD;
  asm
     mov eax,ibase   // 下面两句是#define ibaseDD *(PDWORD)&ibase代码的汇编
     mov ibaseDD,eax
     mov eax,ibaseDD // 这一句当程序被编译成EXE之后其实是mov eax,[ebp-4]
     mov ecx,[eax+$3c]
     mov edx,ibase // 这一句当程序被编译成EXE之后其实是mov edx,[ebp+8]
     mov eax,[edx+ecx]
end;

begin
  ShowMessage(GetPE(ibase)); //这样调用
end;
2008-5-15 09:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢 版主,解决了
2008-5-15 21:57
0
游客
登录 | 注册 方可回帖
返回
//