/* * 以英文版XP SP1中的samsrv.dll为逆向工程对象 * * samsrv!SampGetCurrentAdminPassword()调用了该函数。InformationClass等于 * SamUserOWFPasswordInformation时,本函数全部工作就一件,释放UserInfoBuf * 指定的内存。 */ void __stdcall SamIFree_SAMPR_USER_INFO_BUFFER ( PVOID UserInfoBuf, SAM_USER_INFORMATION_CLASS InformationClass ) { if ( NULL == UserInfoBuf ) { return; } /* * 当InformationClass等于SamUserOWFPasswordInformation时,这个函数什么 * 也没做,可以忽略对_fgu__SAMPR_USER_INFO_BUFFER()的调用。 */ _fgu__SAMPR_USER_INFO_BUFFER( InformationClass, InformationClass ); /* * 实际在调用kernel32!LocalFree()。从函数名MIDL_user_free()立即意识到 * samsrv.dll是按DCE/RPC机制实现的。 */ MIDL_user_free( UserInfoBuf ); return; } /* end of SamIFree_SAMPR_USER_INFO_BUFFER */ 说实话,我就是不能理解,愿意共享的东西、可以共享的东西真就那么少吗?老外的 垃圾也很多,不过我总是可以找到提高自己的内容。国内的呢,稍微有点意思的,就 怎么也找不着了,这TMD什么风气啊,受不了。也不是要求一定要将什么密级的文档 捅出来,那是对原作者辛勤劳动的变相剥削,咱理解。可总会有一些对别人有帮助并 且不涉密的文档吧,我就不信全是涉密文档,当我是傻子啊。以前搞Solaris内核时, 跟newchess、wangdb交流得就很愉快,那时newchess还没来nsfocus呢。早期CERNET 里也不错,TBSoft在华中系统地共享了很多Windows底层文档、代码。木棉的CPU师兄 更是我的偶像,至今还在学习当年他共享出来的东西,我尊敬并喜欢他。 这里的逆向工程,我给hume发的全是完整注释版,包括自己Hacking得到的数据结构、 宏定义、对潜在问题的思索性文字。他给我发的更是详尽得一塌糊涂,我一下子就感 受到交流的乐趣、共同进步的乐趣。可我怎么也没兴致把那些篇幅巨大的"附加内容" 贴到这里来,心理不平衡,说白了就是这样。对于某些人,只想索取,不愿付出,就 没什么好说的了。即便如此,还是尽量共享吧,己所不欲、勿施与人。就算我是五十 步笑百步,麻烦不要对我指手画脚,特烦这号人。自己如果什么也没做,就闭上嘴! 简单介绍一下我逆向samsrv.dll的目的。试着理解pwdump2的原理。虽然有源代码, 可我不仅关心如何做,还关心那帮人当初是怎么想到要这样做的,毕竟是未文档化的 技术,他们也是Hacking后得到该技术的。想理一下思路,重现他们Hacking的过程, 使我可以不再跟着别人后面吃冷饭,可以独立开始新的挑战。事实上,现在国内很多 文档的倾向是不想让你了解幕后,直勾勾地就冒出来一些结论,还夹杂着不负责任的 自然语言描述,缺乏精确的C语言描述,很烦这种文章啊,玩神密啊。 最开始是写插件,用NetUserGetInfo()查询远程用户信息。在Ethereal解码过程中意 识到与pwdump2的联系。接下来自然而然地有了逆向samsrv.dll的想法。一逆就感觉 正在接近中。看了看SampGetCurrentAdminPassword(),尚未逆它,但其总体流程很 清晰,对比pwdump2所带samdump.c,就不觉得神密了。 这个逆向不是主业,只能有空了慢慢写。打算写篇pwdump2的相关文章,介绍(科普) 这么几个知识点: 1) pwdump2在做什么。 2) 为什么pwdump2这样做就可以获取LM Hash、NTLM Hash。 3) 既然这种技术是未文档化的,那帮人又是如何得到这种技术的,他们Hacking的过 程、思想的发展可能是怎样的。 4) 在此基础上我们还能继续Hacking出其它有用的东西吗。 5) 下次让你独立确定一个课题并研究之,你会在上述研究中受到什么样的启发,比 如选题方向、研究方法、工具使用等等。 TMD,这些工作本该是CS的老师们去做的,误人一世,误国千秋!自己已经是时代与 体制的牺牲品了,可同样的悲剧竟有愈演愈烈之势,看着CS的师弟、师妹们就伤心。