• 1553阅读
  • 2回复

56.windbg-s、#(搜索字符串、地址、汇编) [复制链接]

上一主题 下一主题
离线啊冲
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-12


目录(?)[+]









s(Search Memory)

s 命令搜索内存查找指定模板

1.  寻找内存泄露的线索。比如知道当前内存泄漏的内容是一些固定的字符串,就可以在
   DLL 区域搜索这些字符串出现的地址,然后再搜索这些地址用到什么代码中,找出这些
    内存是在什么地方开始分配的。
2.  寻找错误代码的根源。比如知道当前程序返回了 0x80074015  这样的一个代码,但是不
    知道这个代码是由哪一个内层函数返回的。就可以在代码区搜索 0x80074015,找到可能
    返回这个代码的函数。
比如我的代码中有个char* g_char = "I am string";全局字符串变量我想要查找,这个肯定是放在.rdata段中,所以

[cpp] view plain copy
  1. 0:000> !dh -s 01270000  
  2.   
  3. SECTION HEADER #3  
  4.   .rdata name  
  5.     1D11 virtual size  
  6.    15000 virtual address  
  7.     1E00 size of raw data  
  8.     3A00 file pointer to raw data  
  9.        0 file pointer to relocation table  
  10.        0 file pointer to line numbers  
  11.        0 number of relocations  
  12.        0 number of line numbers  
  13. 40000040 flags  
  14.          Initialized Data  
  15.          (no align specified)  
  16.          Read Only  

//字符串搜索--------------------------------------------------------------------------------------------------------------------------------------------------

s-sa 和s-su 命令搜索未指定的ASCII和Unicode字符串。这在检查某段内存是否包含可打印字符时有用。 s-a 和s-u 命令分别用来搜索指定的ASCII和Unicode字符串。这些字符串不一定要null结尾
[cpp] view plain copy
  1. 0:000> s -sa 01270000+15000 L1D11  
  2. 0128573c  "I am string"  
  3. 01285868  "bad allocation"  
  4. 012858e0  "Stack around _alloca corrupted"  
  5. 01285908  "Local variable used before initi"  
  6. 01285928  "alization"  
  7. 0128593c  "Stack memory corruption"  
  8. 01285958  "Cast to smaller type causing los"  
  9. 0:000> s -a 01270000+15000 L1D11 "I am"  
  10. 0128573c  49 20 61 6d 20 73 74 72-69 6e 67 00 25 73 0a 00  I am string.%s..  

可以使用flag [1]在搜索输出中仅显示匹配项的地址。该选项在使用.foreach把输出通过管道传递给其他命令作为输入时很有用。  
注意有个[]号

[cpp] view plain copy
  1. 0:000> s -[1]a 01270000+15000 L1D11 "I am"  
  2. 0x0128573c  
  3. 0:000> .foreach (addr {s -[1]a 01270000+15000 L1D11 "I am"}){da ${addr}}  
  4. 0128573c  "I am string"  


// 内存地址搜索------------------------------------------------------------------------------------------------------------------------------
搜索printf的调用地址

[cpp] view plain copy
  1. 009614d4 test1!printf = <no type information>  
  2. 009682c8 test1!_imp__printf = <no type information>  
  3. 0:000> s -[1]d 00961431 L130000 009682c8  
  4. 0x0096145d  
  5.   
  6. 0:000> u 0096145d L2  
  7. test1!wmain+0x2d [d:\windbg\test1\test1.cpp @ 23]:  
  8. 0096145d c8829600        enter   9682h,0  
  9. 00961461 83c408          add     esp,8  
  10. 0:000> ub 00961461 L1  
  11. test1!wmain+0x2b [d:\windbg\test1\test1.cpp @ 23]:  
  12. 0096145b ff15c8829600    call    dword ptr [test1!_imp__printf (009682c8)]  


(反汇编)


在反汇编代码中搜索符合指定模板的数据


[cpp] view plain copy
  1. 0:001> lm m test1  
  2. start    end        module name  
  3. 00a50000 00a6b000   test1    C (private pdb symbols)  C:\Program Files (x86)\Debugging Tools for Windows (x86)\sym\test1.pdb\0142AD0EED1143078D35079F6E0C70AB5\test1.pdb  
  4. 0:001> # test1!_imp__printf 00a50000  
  5. test1!printf:  
  6. 00a614d4 ff25c882a600    jmp     dword ptr [test1!_imp__printf (00a682c8)]  
  7. 0:001> # test1!_imp__printf   ///<接着上次搜索结果地址后搜索  
  8. test1!ThreadProc+0x58 [d:\windbg\test1\test1.cpp @ 23]:  
  9. 00a61b48 ff15c882a600    call    dword ptr [test1!_imp__printf (00a682c8)]  
  10. 0:001> # test1!_imp__printf  
  11. test1!wmain+0x4d [d:\windbg\test1\test1.cpp @ 33]:  
  12. 00a630dd ff15c882a600    call    dword ptr [test1!_imp__printf (00a682c8)]  


地址也可以直接使用函数名替代
[cpp] view plain copy
  1. 0:001> # *test1!_imp__printf* test1!wmain  
  2. test1!wmain+0x4d [d:\windbg\test1\test1.cpp @ 33]:  
  3. 00a630dd ff15c882a600    call    dword ptr [test1!_imp__printf (00a682c8)]  
善者 慈悲心常在 无怨无恨 以苦为乐
默认压缩密码www.hifyl.com
文件分享密码问题:http://www.hifyl.com/read-htm-tid-4444.html
离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
离线qq728285237

只看该作者 板凳  发表于: 2016-11-09
fsafsafsa
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个