能力值:
( LV9,RANK:180 )
|
-
-
2 楼
eax:= new()
call eax
-----------------
...
...
ret
|
能力值:
( LV9,RANK:330 )
|
-
-
3 楼
楼上兄弟的意思是,在原程序中 吧eax初始化成新申请的地址,然后call eax,把jmp指令改成call
|
能力值:
(RANK:410 )
|
-
-
4 楼
是这样的,这个用法就是将新申请的内存代码作为一个子程序来调用使用,这样的话新申请的内存代码最后只须一个ret而不用另外计算返回地址就可以返回到原来的地方继续执行。
|
能力值:
( LV9,RANK:330 )
|
-
-
5 楼
jmp call 后面的偏移如何计算。
jmp 地址 + 指令长度 + 偏移 =目标地址
但是怎么我算的不是这样,比如说下面这个call,结果不是目标地址
10015CC2 E8 D9DAFEFF CALL 100037A0
10015cc2 + 5 + FFFEDAD9 = 1100037A0
该如何计算偏移呢?
|
能力值:
( LV9,RANK:330 )
|
-
-
6 楼
应该是
15CC2 + 5 + FFFEDAD9 = 1000037A0
jmp call 地址取RAV 而不是取VA.
|
能力值:
( LV9,RANK:180 )
|
-
-
7 楼
delta = 目标 - 来源
= 100037A0-(10015CC2+5) = FFFEDAD9
所以是 10015CC2 E8 D9DAFEFF CALL 100037A0
没错
|
能力值:
(RANK:410 )
|
-
-
8 楼
就是你算得结果没错,1100037A0最后一位"1"超过32溢出的部份会被计算机丢弃的。
|
能力值:
( LV9,RANK:330 )
|
-
-
9 楼
再请教下比如下面这个CALL
10015CC2 E8 D9DAFEFF CALL 100037A0
我要吧这个call 的地址该成我新分配的内存地址。
程序里如何写?
分配新地址,里面是修改代码
LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );
如何把call lpBuf ,写成代码?我用的C
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
如果你分配好的空间里面所写入的代码的最后确实是用ret返回的,而不是jmp返回的,并且那里的汇编代码是不需要重定位的,那么你根本不需要去计算偏移量。
你可以将你的lpBuf转换成函数指针,再调用之就可以了:
((void (*)())lpBuf)();
|
能力值:
( LV9,RANK:330 )
|
-
-
11 楼
我需要吧原程序的10015CC2 E8 D9DAFEFF CALL 100037A0
改成call我新分配的地址,现在问题是,操作码我如何算出来。要算出5字节的操作码,写原来call地址。
|
能力值:
(RANK:410 )
|
-
-
12 楼
// 大概就像下面的写法(注:下面的写法要注入到要写的进程内部和去除了写保护才有效)
*(ULONG*)0x10015cc3 = (ULONG)lpBuf-(0x10015cc2+5) ; 这里计算偏移。
|
能力值:
( LV9,RANK:330 )
|
-
-
13 楼
已经实现,多谢楼上个为兄弟帮助。特别是小虾版主
|
|
|