[Asm] 纯文本查看 复制代码 004013C3 8965 E8 MOV DWORD PTR SS:[EBP-0x18],ESP
004013C6 FF15 44404000 CALL NEAR DWORD PTR DS:[<&KERNEL32.GetVersion>] ; kernel32.GetCommandLineA
004013CC 33D2 XOR EDX,EDX
004013CE 8AD4 MOV DL,AH
004013D0 8915 28554000 MOV DWORD PTR DS:[0x405528],EDX
004013D6 8BC8 MOV ECX,EAX
004013D8 81E1 FF000000 AND ECX,0xFF
004013DE 890D 24554000 MOV DWORD PTR DS:[0x405524],ECX
004013E4 C1E1 08 SHL ECX,0x8
004013E7 03CA ADD ECX,EDX
004013E9 890D 20554000 MOV DWORD PTR DS:[0x405520],ECX
004013EF C1E8 10 SHR EAX,0x10
004013F2 A3 1C554000 MOV DWORD PTR DS:[0x40551C],EAX
004013F7 33F6 XOR ESI,ESI
004013F9 56 PUSH ESI
004013FA E8 A1090000 CALL TraceMe.00401DA0
004013FF 59 POP ECX
00401400 85C0 TEST EAX,EAX
00401402 75 08 JNZ SHORT TraceMe.0040140C
00401404 6A 1C PUSH 0x1C
00401406 E8 B0000000 CALL TraceMe.004014BB
0040140B 59 POP ECX
0040140C 8975 FC MOV DWORD PTR SS:[EBP-0x4],ESI
0040140F E8 E1070000 CALL TraceMe.00401BF5
00401414 FF15 40404000 CALL NEAR DWORD PTR DS:[<&KERNEL32.GetCommandLineA>] ; kernel32.GetCommandLineA
0040141A A3 185A4000 MOV DWORD PTR DS:[0x405A18],EAX
通过信息窗口修改内存,反汇编窗口未修改
上面的图中地址 004013C6 是调用GetVersion 函数,
如果我们通过信息窗口将 GetVersion 函数改成 GetCommandLineA 函数.
会发现反汇编的内容没有变, 下图是 od yzdbg x32dbg 和 cpudbg 修改后的图.
图中未修改的地方有黄圈标注, 已修改的用红圈标注.
yzdbg信息窗口修改BUG
yzdbg修改后, 数据窗口的值修改了,并且高亮红色显示,
其它的包括数据窗口中的API名,以及反汇编窗口中的API名称都未修改,
yzdbg备注没有显示API.
od信息窗口bug
od修改后, 同样反汇编窗口和数据窗口的API名没有刷新,
但是od的备注里面的API是改变了.
x32dbg信息窗口BUG
x32dbg 修改后的效果和od是一样的.只是少了一个备注.
cpudbg信息窗口修改无BUG
最后测了一下我们的cpudbg调试器, 可以看到所有地方都修改了.
只是我们的数据窗口还未添加IAT识别.备注栏也没添加API函数名.
------------------------------------------------------------------
试想一下,如果有一个壳将程序代码段中用到的IAT随机写入其它API.
然后通过TLS或者构造来还原,那使用这些调试器的用户看到了是不是造成混淆?
实际上我并没有这样测试过,因为随意修改IAT, 也许程序初始化或其它地方在未到达EP前有调用,
也会导致程序出问题. 想要做到随意修改IAT,那得大量的测试才行.得保证其它地方未使用到.
实时刷新反汇编和数据窗口开销也是有点大的. 也许单步步入和步过用户察觉不到.
但如果是trace的话,就能明显感觉到性能下降了.
|