能力值:
( LV8,RANK:120 )
|
-
-
2 楼
步骤是这样的 ...我 DUMP出来一段 机器码 然后 存到 数据段 。,,,再在代码段找一个地方写入存下来的 机器码 为什么它显示的指令和以前不一样呢??
求解???
|
能力值:
( LV12,RANK:340 )
|
-
-
3 楼
因为很多指令的操作数是相对的.
假如0x00401000处有条指令,是jmp 0x00401002.
因为是近跳转,所以偏移数用1字节表示,jmp 0x00401002的机器码就是EB 00,EB是操作码,00是偏移(有符号).
一般的相对偏移地址都是从下一条指令开始算起的.即从0x00401002-0x00401002 = 0.
所以EB 00反汇编出来的跳转地址永远指向下一条指令.
你把这指令写到0x00402000,反汇编出来的就是jmp 0x00402002.
|
能力值:
( LV8,RANK:120 )
|
-
-
4 楼
谢谢大神解答,byte copy->address 和 dword copy->address 有什么区别嘛?
又是怎么样规定 我的机器码在 内存中他的排列呢??
比如
00401000 > $ B9 0A000000 MOV ECX,0A
这个 它占5个字节。。。
我把B9 0A000000 写入到指定code段位置后 他的指令 会在我 写入后发生变化.....
比如 变成XCHG xxx,xxx 。。。。。
原谅小白》。。。
|
能力值:
( LV8,RANK:120 )
|
-
-
5 楼
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
oldprotect dd 0
newbyte byte 06ah,000h,06ah,000h,06ah,000h,0e8h,007h,000h,000h
xx dd 0
.code
start proc x,y,z:dword
.if y==DLL_PROCESS_ATTACH
invoke GetModuleHandle,NULL
push eax
pop xx
add xx,0100BH
invoke VirtualProtect,xx,1190,PAGE_EXECUTE_READWRITE,offset oldprotect
;mov eax,offset newbyte
;mov ecx,[eax+2]
mov ecx,13
cld
mov edi ,xx
mov esi,offset newbyte
rep movsb
.endif
start endp
这个也是 写入后 代码就不一样了。。
|
能力值:
( LV8,RANK:120 )
|
-
-
6 楼
写入后就变成这样了。。。00401014 |. 000B ADD BYTE PTR DS:[EBX],CL
00401016 |. 1040 8B ADC BYTE PTR DS:[EAX-75],AL
00401019 |? C08B C08BC08B C0 ROR BYTE PTR DS:[EBX+8BC08BC0],0C0 ; 移位常量超出 1..31 的范围
|
能力值:
( LV12,RANK:340 )
|
-
-
7 楼
那是因为反汇编器的算法可能是线性反汇编..导致识别错误了指令头..
前面填充一堆nop应该就可以正确识别了.
|
能力值:
( LV8,RANK:120 )
|
-
-
8 楼
感谢感谢。!!!
|
|
|