asm命令怎么输入mov al,1 ;ret
本帖最后由 冥界3大法王 于 2021-12-22 22:00 编辑比如有以下的代码需要在段首打补丁
使用x64dbg的asm命令完成:
00007FF628DB4370 <fil | 48:895C24 18 | mov qword ptr ss:,rbx ==》把这里改成mov al, 1 ;第二句ret
00007FF628DB4375 | 55 | push rbp |
00007FF628DB4376 | 56 | push rsi |
00007FF628DB4377 | 57 | push rdi |
问题来:asm00007FF628DB4370, "mov al,1" 这样只能完成一个补丁;ret怎么办?{:301_971:}
帮助中是这样说的:
参数1: 地址
参数2:指令文本; //所以又尝试了格式化的部分 {x: 16进制内容}
参数3:剩余用NOP填充
asm 00007FF628DB4370, "mov al,2","C3" //(参数3最垃圾了,随便啥都是90,或许修改源码能解决
asm 00007FF628DB4370,{x:b001c3} 失败
asm 00007FF628DB4370,"{x:b0 01 c3}" 失败
asm 00007FF628DB4370,"b001c3" 失败
asm 00007FF628DB4370, x:"B001C3" 失败
asm 00007FF628DB4370, {x:"B001C3"} 失败
{:301_1006:}
void CPUDisassembly::binaryFillNopsSlot()
{
HexEditDialog hexEdit(this);
dsint selStart = getSelectionStart();
dsint selSize = getSelectionEnd() - selStart + 1;
WordEditDialog mLineEdit(this);
mLineEdit.setup(tr("Size"), selSize, sizeof(duint));
if(mLineEdit.exec() != QDialog::Accepted || !mLineEdit.getVal())
return;
selSize = mLineEdit.getVal();
byte_t* data = new byte_t;
mMemPage->read(data, selStart, selSize);
hexEdit.mHexEdit->setData(QByteArray((const char*)data, selSize));
delete [] data;
hexEdit.mHexEdit->fill(0, QString("90"));
QByteArray patched(hexEdit.mHexEdit->data());
mMemPage->write(patched, selStart, patched.size());
GuiUpdateAllViews();
}
源码中是这样的:
bool assembleat(duint addr, const char* instruction, int* size, char* error, bool fillnop)
{
int destSize = 0;
Memory<unsigned char*> dest(16 * sizeof(unsigned char), "AssembleBuffer");
unsigned char* newbuffer = nullptr;
if(!assemble(addr, dest(), 16, &destSize, instruction, error))
{
if(destSize > 16)
{
dest.realloc(destSize);
if(!assemble(addr, dest(), destSize, &destSize, instruction, error))
return false;
}
else
return false;
}
//calculate the number of NOPs to insert
int origLen = disasmgetsize(addr);
while(origLen < destSize)
origLen += disasmgetsize(addr + origLen);
int nopsize = origLen - destSize;
unsigned char nops;
memset(nops, 0x90, sizeof(nops));
if(size)
*size = destSize;
// Check if the instruction doesn't set IP to non-executable memory
if(!isInstructionPointingToExMemory(addr, dest()))
{
String Title;
String Text;
Title = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Non-executable memory region"));
Text = GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Assembled branch does not point to an executable memory region!"));
GuiDisplayWarning(Title.c_str(), Text.c_str());
}
bool ret = MemPatch(addr, dest(), destSize);
if(ret)
{
if(fillnop && nopsize)
{
if(size)
*size += nopsize;
// Ignored if the memory patch for NOPs fail (although it should not)
MemPatch(addr + destSize, nops, nopsize);
}
// Update GUI if any patching succeeded
GuiUpdatePatches();
}
else
{
// Tell the user writing is blocked
strcpy_s(error, MAX_ERROR_SIZE, GuiTranslateText(QT_TRANSLATE_NOOP("DBG", "Error while writing process memory")));
}
return ret;
} asm 0x00007FF628DB4370,"dword {x:0xc301b0}"还是有弊端 本帖最后由 老伙计 于 2021-12-23 00:03 编辑
大法王, 0x7f...... 打头的内存地址应该属于操作系统 dll 的占用区,难道你在和操作系统较劲??? 老伙计 发表于 2021-12-23 00:02
大法王, 0x7f...... 打头的内存地址应该属于操作系统 dll 的占用区,难道你在和操作系统较劲?? ...
我那个地址是 64位某最新版软件的。{:301_971:} 本帖最后由 冥界3大法王 于 2021-12-23 08:55 编辑
老伙计 发表于 2021-12-23 00:02
大法王, 0x7f...... 打头的内存地址应该属于操作系统 dll 的占用区,难道你在和操作系统较劲?? ...@老伙计
再说你数数位数。。{:301_976:}
然后回答32位程序 和 64位程序的地址范围是多少?
最后得出结论:你看走眼了。{:301_971:}
这个不能 asm xxxxx再下一个地址asm xxxxx ret吗 本帖最后由 冥界3大法王 于 2021-12-23 09:10 编辑
only998 发表于 2021-12-23 07:47
这个不能 asm xxxxx再下一个地址asm xxxxx ret吗@only998
可以啊;需要两句啊。
但我想知道模仿Ctrl+E输入时,对应是汇编命令如何完成,上边的道友已经给出了正确的格式。{:301_986:} 最好用set命令, set0x00007FF628DB4370,#B101C3#
本帖最后由 冥界3大法王 于 2021-12-23 12:32 编辑
fq3803 发表于 2021-12-23 12:23
最好用set命令, set0x00007FF628DB4370,#B101C3#@fq3803 谢谢!为啥我不能多加点分,实在是不解恨呐!{:301_976:}
今天来到论坛,一下子学会三招。{:301_987:}
页:
[1]