首页
社区
课程
招聘
[求助]WriteProcessMemory写JMP跳转不成功,求解决方法[已解决]
发表于: 2008-12-2 14:21 4937

[求助]WriteProcessMemory写JMP跳转不成功,求解决方法[已解决]

2008-12-2 14:21
4937
原内容
004865DD  |.  BA 30664800   MOV EDX,Fa.00486630
004865E2  |.  8BC4          MOV EAX,ESP
004865E4  |.  B9 11000000   MOV ECX,11
004865E9  |.  E8 E69EFAFF   CALL Fa.004304D4

正确要改为这样的
004865DD  |.  BA 30664800   MOV EDX,Fa.00486630
004865E2    - E9 199A6E00    JMP 00B70000
004865E7      90             NOP
004865E8      90             NOP
004865E9  |.  E8 E69EFAFF   CALL Fa.004304D4

我写的代码老是成这样,失败
004865DD    BA 30664800      MOV EDX,Fa.00486630
004865E2    EB 00            JMP SHORT Fa.004865E4
004865E4    00D8             ADD AL,BL
004865E6    0090 90E8E69E    ADD BYTE PTR DS:[EAX+9EE6E890],DL
004865EC    FA               CLI
004865ED    FFBA             ???                                      ; 未知命令

Delphi 代码
Type
PJmpCode = ^TJmpCode;
  TJmpCode = Packed Record
    JmpCode: Byte;
    Address: Pointer;
    MovEAX: Array[0..1] Of Byte;
  End;

       {在目标进程中分配内存}
      MemData := VirtualAllocEx(CurProc, Nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

      {把自定义函数写入到目标进程中}
      WriteProcessMemory(CurProc, MemData, @GetDataCode, 4096, Written);

//debug 显示地址
      MessageBox(0,PChar('$' + IntToHex(LongInt(MemData), 8)), '', 0);

    JmpCode.JmpCode := $EB;
      JmpCode.Address := MemData; //地址是$00B7000,失败的就是不知为啥会变成$00D80000
      JmpCode.MovEAX[0] := $90;
      JmpCode.MovEAX[1] := $90;
      WriteProcessMemory(CurProc, Pointer($004865E2), @JmpCode, 7, Written);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 219
活跃值: (58)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
现在小改了一下,但还是有问题
现在写的记录不知怎的多了2个0了
正确的
E8 00 B7 00 00 00 90 90

现在成这样了,E8后成多两个0了,我声明用的是Byte,怎么是占两个字节了
E8 00 00 B7 00 00 90 90
JmpCode.JmpCode := $E8; //用CALL
      JmpCode.Address := MemData; 
      JmpCode.MovEAX[0] := $90;
      JmpCode.MovEAX[1] := $90;
      WriteProcessMemory(CurProc, Pointer($004865E2), @JmpCode, 7, Written);
2008-12-2 14:33
0
雪    币: 219
活跃值: (58)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
好像我理解的错了

应改的是JMP 00B70000
而不是对应的HEX值,这个更难倒我了。。。
2008-12-2 14:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
内存中结构对齐方式改为byte,即=1
不然compiler会自动补0
2008-12-2 15:14
0
雪    币: 219
活跃值: (58)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
现在问题是JMP不了自已写入目标进程的那一段代码

JMP 地址老是不对
2008-12-2 15:20
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
6

Intel64 and IA-32 Architectures Software Developer's Manuals/Volume.2A - Instruction Set Reference, A-M.pdf    543页

不知道你是不知道还是忘了跳转指令里放的是地址差
上传的附件:
2008-12-2 16:07
0
雪    币: 219
活跃值: (58)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
已解决。。。
2008-12-2 18:07
0
游客
登录 | 注册 方可回帖
返回
//