作者drinker (冒烟中...)
看板Programming
标题Re: [问题] 用 GCC 编译出来的程式想给华生博士侦错
时间Tue Sep 3 22:10:32 2013
※ 引述《SeamusBerloz (轩摩斯)》之铭言:
<引言删除>
: 以下我写了简单的 crash 程式,由华生博士侦测後log 记录之档案,
: 节录贴出来,并於後附上 crash 原始码:
: *----> 执行执行绪识别码 0xeac 的状态倾印<----*
: eax=00000000 ebx=7ffd8000 ecx=00000000 edx=00000000 esi=00000000 edi=00000012
: eip=00401329 esp=0022ff40 ebp=0022ff68 iopl=0 nv up ei pl zr na po nc
: cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
: *** ERROR: Module load completed but symbols could not be loaded for D:\Temp\DrWaston\crash.exe
: 功能: crash
: 00401310 fc cld
: 00401311 fe00 inc byte ptr [eax]
: 00401313 0000 add [eax],al
: 00401315 7f51 jg crash+0x1368 (00401368)
: 00401317 8b45fc mov eax,[ebp-0x4]
: 0040131a 8b0d08404000 mov ecx,[crash+0x4008 (00404008)]
: 00401320 01c1 add ecx,eax
: 00401322 8b55f8 mov edx,[ebp-0x8]
: 00401325 b0ff mov al,0xff
: 00401327 20d0 and al,dl
: 错误 ->00401329 8801 mov [ecx],al ds:0023:00000000=??
: int main(void)
: {
: int i, iCounter = 0;
: for(i = 0; i < 255; i ++)
: {
: g_lpCharacterPointer[i] = (char)(iCounter & 0xff);
根据ASM code,你应该是这一行出问题
你的整个code里面 g_lpCharacterPointer 是在 TestFunction()里面才做
allocate,可是main()这边却在呼叫 TestFunction() 之前就先填字进去,
当然会crash :p
把allocate memory的动作移到main()里面 for loop前面吧
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.45.186.69
1F:推 SeamusBerloz:感谢您!不过这个程式只是个示范, 183.4.116.230 09/03 23:09
2F:→ SeamusBerloz:是我用来触发 Dr. Watson 用的, 183.4.116.230 09/03 23:10
3F:→ SeamusBerloz:(烦请参看原贴文) 183.4.116.230 09/03 23:10
4F:→ SeamusBerloz:目的在於给大家看看 gcc 所编译的程 183.4.116.230 09/03 23:10
5F:→ SeamusBerloz:被 Dr. Watson 纪录的 log 档案内容 183.4.116.230 09/03 23:10
6F:→ SeamusBerloz:关於 Label 与函数等都被化为位址偏 183.4.116.230 09/03 23:10
7F:→ SeamusBerloz:当程式巨大,想要判别是哪一段程式 183.4.116.230 09/03 23:11
8F:→ SeamusBerloz:产生存取违规,相对困难很多。 183.4.116.230 09/03 23:11
9F:→ SeamusBerloz:另外因为实际要捕捉的程式相当大, 183.4.116.230 09/03 23:11
10F:→ SeamusBerloz:出现违规存取的点,也不是固定出现, 183.4.116.230 09/03 23:11
11F:→ SeamusBerloz:需要慢慢等候运作被中止才能在提供 183.4.116.230 09/03 23:11
12F:→ SeamusBerloz:上来给大家看看了,再次感谢您的协助 183.4.116.230 09/03 23:12
13F:推 cole945:dwarf格式windbg不认,mingw也不能生pdb 111.243.156.18 09/03 23:37
14F:→ cole945:如果你能查出pc值的话. 用-g编,可以用 111.243.156.18 09/03 23:38
15F:→ cole945:mingw的objdump -dl 查行号对应 111.243.156.18 09/03 23:38
16F:推 SeamusBerloz:不好意思,不太了解你的意思... 183.4.116.230 09/04 00:06
17F:→ SeamusBerloz:pc 值是指指令二元码吗? 183.4.116.230 09/04 00:07
18F:→ SeamusBerloz:还是指 EIP 暂存器的值? 183.4.116.230 09/04 00:09
19F:推 SeamusBerloz:的确!刚刚尝试了一下,eip 的确可以 183.4.116.230 09/04 00:12
20F:→ SeamusBerloz:对应到行号,并且正好等於log中的eip 183.4.116.230 09/04 00:14
21F:→ SeamusBerloz:不知道是不是运气好?程式载入偏移 183.4.116.230 09/04 00:14
22F:→ SeamusBerloz:位址刚好相等?dll 之中也这样吗? 183.4.116.230 09/04 00:15
23F:→ SeamusBerloz:我想说,若错误发生於 dll 中怎办? 183.4.116.230 09/04 00:16
24F:→ SeamusBerloz:因为dll也是我自己写的说 -__-... 183.4.116.230 09/04 00:18
25F:推 cole945:xp的话,执行档应该不会做ASLR,所以会固定 111.243.151.96 09/04 22:35
26F:→ cole945:dll有被rebase的话,自已算一下offset orz 111.243.151.96 09/04 22:35
27F:推 SeamusBerloz:了解!没错!正猜大概要自己算偏移呢 183.4.123.29 09/04 23:15
28F:→ SeamusBerloz:多一份方案,多一分实力,多多益善 183.4.123.29 09/04 23:17
29F:→ SeamusBerloz:就是了!感谢您唷! 183.4.123.29 09/04 23:18
30F:→ drinker: 位址化偏移你首先要抓的重点是base addr 1.162.64.133 10/03 22:14
31F:→ drinker: 我猜你在log看到的偏移是 00001327 吧? 1.162.64.133 10/03 22:15