吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1257|回复: 9
收起左侧

[求助] asm命令怎么输入mov al,1 ;ret

[复制链接]
冥界3大法王 发表于 2021-12-22 21:43
本帖最后由 冥界3大法王 于 2021-12-22 22:00 编辑

比如有以下的代码需要在段首打补丁
使用x64dbg的asm命令完成:

00007FF628DB4370 <fil | 48:895C24 18             | mov qword ptr ss:[rsp+18],rbx          ==》把这里改成mov al, 1   ;第二句ret
00007FF628DB4375      | 55                                | push rbp                                 |
00007FF628DB4376      | 56                                | push rsi                                 |
00007FF628DB4377      | 57                                | push rdi                                 |


问题来:asm  00007FF628DB4370, "mov al,1" 这样只能完成一个补丁;ret怎么办?

帮助中是这样说的:
参数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"}                  失败

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
香芋 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 冥界3大法王 发表于 2021-12-22 22:07
[Asm] 纯文本查看 复制代码
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[selSize];
    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();
}


源码中是这样的:
[C++] 纯文本查看 复制代码
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[16];
    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}"还是有弊端

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
冥界3大法王 + 3 + 1 成功的,靠谱的回答!!!!!!!!

查看全部评分

老伙计 发表于 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位某最新版软件的。
 楼主| 冥界3大法王 发表于 2021-12-23 05:13
本帖最后由 冥界3大法王 于 2021-12-23 08:55 编辑
老伙计 发表于 2021-12-23 00:02
大法王, 0x7f...... 打头的内存地址应该属于操作系统 dll 的占用区,难道你在和操作系统较劲?? ...
@老伙计
再说你数数位数。。
然后回答32位程序 和   64位程序的地址范围是多少?
最后得出结论:你看走眼了。

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输入时,对应是汇编命令如何完成,上边的道友已经给出了正确的格式。
fq3803 发表于 2021-12-23 12:23
最好用set命令, set  0x00007FF628DB4370,#B101C3#

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
冥界3大法王 + 1 + 1 @fq3803 谢谢!为啥我不能多加点分,实在是不解恨呐!

查看全部评分

 楼主| 冥界3大法王 发表于 2021-12-23 12:30
本帖最后由 冥界3大法王 于 2021-12-23 12:32 编辑
fq3803 发表于 2021-12-23 12:23
最好用set命令, set  0x00007FF628DB4370,#B101C3#
@fq3803 谢谢!为啥我不能多加点分,实在是不解恨呐!
今天来到论坛,一下子学会三招。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表