能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自已顶, 一天了.5555555
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
再顶.又一天..........................
|
能力值:
( 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]
也不知道是什么意思,这个是汇编代码
|
能力值:
(RANK:410 )
|
-
-
5 楼
#define ibaseDD *(PDWORD)&ibase
var ibaseDD:DWORD;
begin
ibaseDD := PDWORD(@ibase)^;
end;
|
能力值:
( 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]
怕会出现不同机器会有冲突
|
能力值:
( 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;
这样试了多次后不稳定,时而行时而不行
|
能力值:
(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;
|
能力值:
(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;
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
谢谢 版主,解决了
|
|
|