|
|

50精币
AKO-x64.exe+9CCB8 - 66 89 4C 24 08 - mov [rsp+08],cx
AKO-x64.exe+9CCBD - 48 83 EC 58 - sub rsp,58
AKO-x64.exe+9CCC1 - B8 FFFF0000 - mov eax,0000FFFF
AKO-x64.exe+9CCC6 - 66 3B C8 - cmp cx,ax
AKO-x64.exe+9CCC9 - 0F84 9F000000 - je AKO-x64.exe+9CD6E //je 14009CD6E
AKO-x64.exe+9CCCF - 48 8D 4C 24 30 - lea rcx,[rsp+30]
AKO-x64.exe+9CCD4 - E8 5B69FFFF - call AKO-x64.exe+93634 //call 140093634
这是要复制的原汇编代码
std::vector<unsigned char> data = { 102,137,76,36,8,72,131,236,88,184,255,255,0,0,102,59,200,15,132,159,0,0,0,72,141,76,36,48,232,91,105,255,255 };
buffer = std::make_unique<unsigned char[]>(sizeof(data));
std::uint64_t value = 0x140093634 - ((std::uint64_t)buffer.get() + 28) - 5;
std::memcpy(data.data() +29, &value, sizeof(value));
std::memcpy(buffer.get(), data.data(), data.size());
计算call地址
0054C975 - 48 83 EC 58 - sub rsp,58
0054C979 - B8 FFFF0000 - mov eax,0000FFFF
0054C97E - 66 3B C8 - cmp cx,ax
0054C981 - 0F84 9F000000 - je 0054CA26
0054C987 - 48 8D 4C 24 30 - lea rcx,[rsp+30]
0054C98C - E8 A36CB43F - call 40093634
这是计算call后写入的汇编代码,实际上call的地址比原本地址少了0x100000000,请问应该怎么正确计算call或者je的地址呢?
|
-
最佳答案
查看完整内容
我下面简单说一下
call和jmp类的算法一致,如果两者地址相差小于32位整数最大值则计算方式为:
{232}+到字节集(到整数(目标地址 - 起跳地址 - 5)) ---- call 目标地址
我这里用到整数已经说的很明显了,这里整个句子占5个字节,你上面有代码了就不赋图片了
而je这类条件跳转分为两种,1.如果跳转距离介于单字节范围内 (-127-128)时,其语句占俩字节
计算方式:xx 目标地址 - 当前地址 - 2
2.如果跳转距离介于四字节范围内,则 ...
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。 友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。 快捷通道:申请荣誉值 →
|