|
|
|
[求助]运行期间解密出来的算法,要怎么取出来?
很多人都不清楚的小技巧:IDA中将用虚拟内存分配的节Segment的属性"Debugger Segment"取消,会将虚拟内存中的节保留在数据库中。 Enjoy it. |
|
[讨论]关于lea eax, [ebp-4]的小问题
lea eax, [ebp-4]确实是等价于mov eax, ebp-4 但x86的指令集虽然没有直接实现寄存器和立即数作数学运算后赋值给另一个寄存器的mov指令,但却实现了更强大的mov指令:lea指令。 lea reg1, [reg2+reg3+disp32] lea reg1, [reg2+disp32] lea reg1, [reg2+disp8] |
|
|
|
[求助]反汇编问题!!!
这是VC编译器的魔术,具体来说就是cl.exe。 当你在选项中使用了堆栈检查选项时,如/GZ, /RTCs, /RTC1时,在函数开头就会将所有堆栈变量赋值CCCCCCCC,你已经看到是在对变量初始化之前。 我不清楚你的程序为什么会多出了0x40的空间,也许你VS IDE的默认编译选项Options或makefile会告诉你我答案。 Enjoy it. |
|
[求助]一小段汇编如何用c表示
我并不认为这是一个函数,反而我认为它是两个函数。 回头仔细看看,retn和mov之间被楼主省略掉了,证实了我的想法。 不知道lz为什么这样误导? 40454C到404556是函数调用,没什么好说的。 404260到40426D,有意思,是许多IDE都应该有的库函数,功能是为单向链表增加节点。411028存放的是这个单向链表的首节点。 Enjoy it. |
|
[求助]请问能否通过某种方法使中文字符串像英文字符串一样被识别?
Strings SubView子视图、标题为string、有一个方向箭头的信息栏中 点击左键,为当前显示的字符串排序;点击右键,出现右键菜单,点击其中的Setup菜单项,出现“Setup Strings Window”窗口,可以在里面设置你想显示的字符串类型。 勾选"Unicode"可以使得它支持中文字符;勾选"Ignore instructions/data definitions",取消"display only defined strings"可以获得更多结果。 |
|
[求助]弱弱地问一个关于IDA的问题。
既然文件开头就有代码,你可以将文件以Binary/Raw File的方式载入,它就会从文件开头开始向后反编译。 |
|
|
|
[求助]BaseOfCode和PointerToRawData的区别?
PE文件格式中有些域可以适用于其它文件类型,或者被MS废弃。 这样的话,有些域对于exe文件来说就是不可信的。 BaseOfCode就是这样的一个数据域 你可以简单地忽略这个数据域,不应该把它作为可信的数据。在编程中也不应该依赖BaseOfCode这个数据域。 你可以作一个简单地实验:在windows下,不管它是0x0,还是0xffffffff,对exe文件的运行都没有任何影响。 |
|
[求助]ida的hexray反编译得到的c语言的阅读问题
[预备知识] I.在面向对象的程序中会发现使用了许多类型的指针:指针的指针,指针的指针的指针,函数的指针,函数的指针的指针... II.在C语言中指针在和一个整数相加减时,那个整数表示指针所指的数据类型的数据的个数 比如C的 int * abc; abc += 5; 换成汇编就变成了 add abc, 0x14 III.这里的扩号不是强制类型转换就是用来定义函数指针 IV.搞清楚Xray的绕口令,还不如自己来弄 [解题] sub_10018000(*(void **)(v2 + 8)); -> 调用一个名叫sub_10018000的函数,v2是一个dword数据,和整数8相加,相加的结果强制类型转换成指向任意数据类型的指针的指针,将它所指向的指针作为参数传给函数sub_10018000。 ((int (__thiscall *)(char *))**(_DWORD **)&v4)(&v4); &v4表示地址 (DWORD **)表示将&v4强制转换成指向DWORD指针的指针 *(DWORD **)&v4得到的结果是一个整数的指针 **(DWORD **)&v4得到的结果是一个整数 将这个整数强制类型转换成一个函数,调用约定为__thiscall, 返回结果是int类型,参数是char *类型 |
|
[求助]softice hwnd task命令求助
看过我写的,就明白了 Who are most familiar with Windows? May be SoftICE, but not always. This is a common scenario: When you Ctrl+D, and input "hwnd", it is "Unable to find a desktop Window". How to resolve it ... By TnTTOOLS, The Art OF Reverse Engineering. The system setup a session for every logged-in user. win32k.sys is loaded to generate the 4 Desktop: Desktop, Default Desktop, Disconnect Desktop, Winlogon Desktop. Yes, 4, four, for, ... Even Spy++ just think there is only one desktop. Figure 1. Properties ----------------------------------------------------------- ClassName: #32769 TID, Process: csrss.exe Handle: 0x00010002, 0x00010004, 0x0001000c, 0x00010014 WndProc: win32k!_xxxDesktopWndProc Module: win32k.sys ----------------------------------------------------------- We can see their only difference is the handle value. Because these handle values are fixed. I guess that are hard coded. Figure 2. Root -------------------------------------------------------- Desktop, 10002 | |---- Desktop, Default, 10014 |---- Dekstop, Disconnect, 10004 |---- Desktop, Winlogon, 1000c -------------------------------------------------------- The root node of windows, controls is Desktop, Handle 10002. Figure 3. Default Desktop and its children ---------------------------------------------------------------------------- Default Desktop | |-- Shell_TrayWnd 任务栏 | |-- | |-- | | |-- Progman | | | |-- SHELLDLL_DefView | | | |-- SysListView32, WindowName: FolderView | | | | | SysHeader32 | |-- ... ---------------------------------------------------------------------------- now, where is our familiar desktop? I know what you mean: the desktop full of a crusty picture and icons. The desktop with the wallpaper is Default Desktop, in master of win32k.sys; The desktop full with misc icons is SysListView32, named FolderView, in master of shell32.dll. When Explorer.exe is loaded, its WinMain creates the two windows: the task bar and the desktop.Guess, what is this desktop? Just the named-FolderView desktop. Are you confused? Now, loop loop back to the beginning of the article. End Loop Next time, if you want to wander the object tree of windows in Softice, just input "Hwnd 10002". |
|
[求助 mov edi, [esp+1Ch+arg_8]怎么理解啊
mov edi, [esp+1Ch+arg_8] 将入栈参数赋值给edi arg_0, arg_4, arg_8, arg_12都是指的入栈参数 arg是英文argument的简写。 IDA的强势就在于此,它可以自动分析函数入口的堆栈操作,然后推出传递给函数的各个参数。 但注意如果是壳、病毒,IDA经常会分析出错,需要人工干预。 |
|
[求助]哪个哥哥帮我看看这段反汇编的代码啊?
004210D7 -> 004210F8 从程序上下文来看:从[esi+10]取80位扩展浮点数A,经过运算得B存在st(0)中,如果结果B小于A则跳转。 浮点数运算时根据结果设置状态字,就像整数运算根据结果设置EFLAGS。 fcomp的结果影响FPU状态字的第8位,第9位,第10位,第15位(Code0, Code1, Code2, Code3), fstsw ax将状态字转存到寄存器ax中, test ah, 5,测试Code0, Code2 jpo表示当(Code0=1,Code2=0)或(Code0=0,Code2=1)时则跳转。 而fcomp中定义了当Code0=1, Code2=0,Code4=0时表示st(0)<src,没有定义Code0=0, Code2=1表示什么。 综上可得。 004210FA -> 0042110A 从程序上下文来看:从[esi+10]取80位扩展浮点数A,与[edi*4+8CB8A4]处的B比较,如果结果A大于B则跳转。 同上 test ah, 41,测试Code0, Code3 jpe表示当(Code0=1,Code3=1)或(Code0=0,Code3=0)时则跳转。 而fcomp中定义了当Code0=0, Code3=0,Code2=0时表示st(0)>src,没有定义Code0=1, Code3=1, Code2=0时表示什么。 这是编译器作为例程来使用的。 fcomp ... test ah, 41h jpe greater fcomp ... test ah, 05h jpo less fcomp ... test ah, 44h jpe equal Enjoy it. |
|
[求助]关于相对基址加变址相对寻址方式有效地址的计算
我是菜鸟,没看出来这样算的原理。 50000+01223+00054+ffffe = 51277 + fffffe = not 51277 = AED89 - ffffe = AED8B = not AED8B = 51275 我想:还是按CPU的硬件逻辑来好些吧:所有的数都用补码来表示,补码相加后,将溢出位去掉。 |
|
[求助]关于相对基址加变址相对寻址方式有效地址的计算
你的思路是对的,正数的补码和负数的补码可以一起相加,只是最后结果确实要把第六位丢掉,是因为在IA16位的环境下没有办法表示。 DS:DX最多只能显示5个十六进制位(从你的思路知道我不用解释),最大只能是0xFFFFF。就算DS=FFFF,DX=FFFF,最大也是这个数,即向上溢出。如果结果小于可以表示的最小数,就是向下溢出。 这也就是为什么DOS实模式中只能访问1MB的内存的原因(不使用其它技巧时) |
|
[求助]'Windows NT 用户请注意:已安装了 WinIce/SoftIce 服务,这意味这你正在运行调试器!'
这是ASProtect壳的提示信息,你有两种办法 (1)先脱壳后调试 (2)用插件隐藏好OD Good Luck! |
|
[原创]ESP定律背后的原理之一:0x12FFC4,为什么是这个数
操作系统的不同,源代码的实现有可能不同,这个值有可能不同。这个道理,我在文章中说明了。 2K, XP, Vista, Checked Version, Free Version都有可能不同。 我明白你们的意思,我写下来只是想弄清楚在堆栈上面到底存储了些什么东西。并不是探讨堆栈的顶端是否固定的问题。 |
|
[原创]ESP定律背后的原理之一:0x12FFC4,为什么是这个数
------------------- 注意:并不是所有程序加载时,ESP的值是0012FFC4,这个值是什么由操作系统决定,将SizeOfStackCOmmit改大ESP就会变,这是因为操作系统从这个页向上找一个足够大地方当作stack了(感谢forgot解释)。 ------------------- 我曾仔细看过这段话,正是这句话引发了我探究的兴趣,这句话的错误在于错误理解了域SizeOfStackCommit, SizeOfStackReserve的作用,SizeOfStackCommit表示提交到物理内存的虚拟内存的大小,SizeOfStackReserve表示分配给当前程序的大小,注意是大小,不是地址。它们决定了程序初始化时堆栈空间的Commited内存的大小和Reserved内存的大小,但不是地址。 堆栈空间的顶端的值是否固定,我没有逆向windows,所以没有发言权,但不管堆栈空间的顶端是0x00130000,还是0x00120000,还是0x00110000,只要这里我提到的几个函数的源代码实现不变,最后几位的值就不会变:0x0012FFC4, 0x0011FFC4, 0x0010FFC4。 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
能力排名:
No.{{ rank_num }}
等 级:
LV{{ rank_lv-100 }}
活跃值:
在线值:
浏览人数:{{ visits }}
最近活跃:{{ last_active_time }}
注册时间:{{ user_info.create_date_jsonfmt }}
勋章
兑换勋章
证书
证书查询 >
能力值