能力值:
( LV2,RANK:10 )
|
-
-
2 楼
好像要先把涵数的参数先压了堆栈,再用jmp指令跳到涵数入口地址
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
sorry说错了,参数已经压栈,然后call
|
能力值:
(RANK:410 )
|
-
-
4 楼
可以。
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
这是从前Binny大虾写的QQ 2005贺岁版登录口令加密算法及其源代码中的vb程序:在QQEncryptTest工程\modVB2ASM文件\LoGetCodeStart函数\
AddByteToCode &HE8
AddLongToCode lngProc - VarPtr(mAsmCodeBuffer(mlPosition)) - 4
'我加的注释:call "??0CVQQSock@@QAE@XZ,加密函数的地址-数组的首地址
其中lngProc是用GetProcAddress得到的加密函数地址(参考Private Sub cmdEncryptDll_Click(IndexAs Integer)),作者在注入的代码中并不是直接调用,而是减去了注入代码的首地址,也就是作了调整.
请问这怎么解释?
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
自己顶一下!
|
能力值:
( LV3,RANK:30 )
|
-
-
7 楼
在delphi中可以这样,这个是不知道函数名的情况下,相应的参数你按程序一样压进去就行
procedure TForm1.Button1Click(Sender: TObject);
var
I, J: THandle;
begin
I:=LoadLibrary('GameProj.dll');
//加上偏移量即可得到函数地址
J:=I+$BBA0;
asm
push ebx //delphi用汇编多数要保存这个寄存器不然会出错
call J //这样调用的话可以产生call [XXXXXXX]的效果
pop ebx
end;
FreeLibrary(I);
end;
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
thanks,可是他为何要减去封装代码的数组的首地址呢?难道是因为vb,可是别的地方也是直接调用的啊?
|
能力值:
(RANK:410 )
|
-
-
9 楼
看了一下Binny兄的代码,你将他的意思理解错了,下面的语句Binny兄并不是调用lngProc函数,而是在VB里写内联汇编代码(OPCODE)。
AddLongToCode lngProc - VarPtr(mAsmCodeBuffer(mlPosition)) - 4
这一句并不是调用lngProc的地址,而是将call lngProc的OPCODE代码写入文件,所以这一句AddLongToCode lngProc - VarPtr(mAsmCodeBuffer(mlPosition)) - 4
语句是计算Call的OPCODE代码的Call的偏移址,并不是改变函数的偏移址。
所以他的意思其实是这样的:
假如:lpgProc的偏移址是:00402000,mAsmCodeBuffer变量的地址在00401000,这一句就变成这样:
00402000-00401000=1000 ;mAsmCodeBuffer和lpgProc的之间的相对偏移址在1000的范围
所以,将上面的语句变成汇编OPCODE代码则是:
E8 00 10 00 00 Call 00xxxxxxxx <-这个Call指向lpgProc函数的偏移址。
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
谢谢小虾兄的指点,看来真得好好学学vb了。
|
能力值:
( LV9,RANK:1250 )
|
-
-
11 楼
这应该是个重定位的问题了,俺正在学习中。
|
|
|