冥界3大法王 发表于 2021-12-22 21:43

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:}

冥界3大法王 发表于 2021-12-22 22:07

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;
}

wsds 发表于 2021-12-22 23:06

asm 0x00007FF628DB4370,"dword {x:0xc301b0}"还是有弊端

老伙计 发表于 2021-12-23 00:02

本帖最后由 老伙计 于 2021-12-23 00:03 编辑

      大法王, 0x7f...... 打头的内存地址应该属于操作系统 dll 的占用区,难道你在和操作系统较劲???

冥界3大法王 发表于 2021-12-23 00:09

老伙计 发表于 2021-12-23 00:02
大法王, 0x7f...... 打头的内存地址应该属于操作系统 dll 的占用区,难道你在和操作系统较劲?? ...

我那个地址是 64位某最新版软件的。{:301_971:}

冥界3大法王 发表于 2021-12-23 05:13

本帖最后由 冥界3大法王 于 2021-12-23 08:55 编辑

老伙计 发表于 2021-12-23 00:02
大法王, 0x7f...... 打头的内存地址应该属于操作系统 dll 的占用区,难道你在和操作系统较劲?? ...@老伙计
再说你数数位数。。{:301_976:}
然后回答32位程序 和   64位程序的地址范围是多少?
最后得出结论:你看走眼了。{:301_971:}

only998 发表于 2021-12-23 07:47

这个不能 asm xxxxx再下一个地址asm xxxxx ret吗

冥界3大法王 发表于 2021-12-23 08:56

本帖最后由 冥界3大法王 于 2021-12-23 09:10 编辑

only998 发表于 2021-12-23 07:47
这个不能 asm xxxxx再下一个地址asm xxxxx ret吗@only998
可以啊;需要两句啊。
但我想知道模仿Ctrl+E输入时,对应是汇编命令如何完成,上边的道友已经给出了正确的格式。{:301_986:}

fq3803 发表于 2021-12-23 12:23

最好用set命令, set0x00007FF628DB4370,#B101C3#

冥界3大法王 发表于 2021-12-23 12:30

本帖最后由 冥界3大法王 于 2021-12-23 12:32 编辑

fq3803 发表于 2021-12-23 12:23
最好用set命令, set0x00007FF628DB4370,#B101C3#@fq3803 谢谢!为啥我不能多加点分,实在是不解恨呐!{:301_976:}
今天来到论坛,一下子学会三招。{:301_987:}
页: [1]
查看完整版本: asm命令怎么输入mov al,1 ;ret