-
-
未解决 [分享]回答12年自己的提问,关于脚本变量内存地址一事 10雪币
-
发表于: 6天前 75
-
就是提问:求找脚本变量地址的调试方法
方法就是搜索特殊值,比如0x11223344这样比较容易识别的数值。
然后改写数值通过弹出窗口确认地址。弹出主要是为了让脚本暂停。
=========================================
调试js找出脚本变量读写的地方
hcper @ 2014-8-16
WScript.echo("begin");
var k;
k=0x11223344;
WScript.echo(k);//这里时搜索初值
k+=0x44332211;
WScript.echo(k);//这里确认变量地址
k=0x31313131;//这里写入
k+=0x11111111;//这里读出及写入
WScript.echo(k);
WScript.echo("end");
弹出第二个消息框时,搜索赋值过的初始值,还好副本不多,不然麻烦了。
0:006> s -d 0 L?70000000 11223344
0013edc4 11223344 baadf00d 00000008 00184bb8
00184bc0 11223344 baadf00d abababab abababab
00488acc 11223344 baadf00d 00000010 baadf00d
0048a188 11223344 baadf00d 00150084 40000060
为了确认以上那个才是变量对应的内存地址,这里修改初始值,通过后面的消息框弹出的值对比确认。
0:006> ed 0013edc4 1
0:006> ed 00184bc0 2
0:006> ed 00488acc 3
0:006> ed 0048a188 4
通过后面第三个消息框显示的值发现增加了3,所以是上面搜索的第三个地址
0:003> ? 0n1144201748
Evaluate expression: 1144201748 = 44332214
下内存断点找出读写的代码地址
0:003> ba r4 00488acc ".echo =rw=;dd 00488acc l1;ub @eip l1;g"
0:003> g
=rw=
00488acc 31313131
jscript!CScriptRuntime::Run+0x20d5:
3e372bf1 894808 mov dword ptr [eax+8],ecx 这里写入31313131
=rw=
00488acc 31313131
jscript!CScriptRuntime::Run+0x1fd6:
3e36b55e 8b5108 mov edx,dword ptr [ecx+8] 这里读出31313131
=rw=
00488acc 42424242
jscript!CScriptRuntime::Run+0x20d5:
3e372bf1 894808 mov dword ptr [eax+8],ecx 这里写入42424242
找到脚本整形变量读写地址后,做个调试脚本就可以很方便的调试了。
0:006> bu 3e372bf1 ".echo =write=;r;g"
0:006> bu 3e36b55e ".echo =read=;r;g"
0:006> bl
0 e 3e372bf1 0001 (0001) 0:**** jscript!CScriptRuntime::Run+0x20d5 ".echo =write=;r;g"
1 e 3e36b55e 0001 (0001) 0:**** jscript!CScriptRuntime::Run+0x1fd6 ".echo =read=;r;g"
=read=
eax=0048a180 ebx=0013f298 ecx=00488ac4 edx=baadf00d esi=0048a784 edi=0048aa4f
eip=3e36b55e esp=0013f108 ebp=0013f280 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
jscript!CScriptRuntime::Run+0x1fd6:
3e36b55e 8b5108 mov edx,dword ptr [ecx+8] ds:0023:【00488acc】=31313131
=write=
eax=00488ac4 ebx=0013f298 ecx=42424242 edx=0048a180 esi=0048a170 edi=0048aa56
eip=3e372bf1 esp=0013f108 ebp=0013f280 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
jscript!CScriptRuntime::Run+0x20d5:
3e372bf1 894808 mov dword ptr [eax+8],ecx ds:0023:【00488acc】=31313131
所以,以后就可以用整数读写地址下断点了(局部变量除外),这样就很容易找到脚本变量的地址。
其他类型变量的地址,可以通过赋值到整形变量,或者读取自整形变量,在整形变量读写的地方
就可以看到其他变量地址了。
或者也可以用这个结论找出其他类型的变量读写的地方。