有没大神呀,把程序某个exe dll 打包工具修改下名字后还能让exe正常运行,也就是软件正常工作

感谢评语:
本页链接:
满意答案像这类故障一般原因比较复杂,可能是系统和软件之间冲突,也可能是软件和软件之间有冲突,从而造成系统运行某些服务程序时出现错误,也很难查检测出故障根源所在,即使用常规方法修复,也未必能根本解决问题。所以通常最简单、最根本、最快捷和最有效的方法就是重装系统。当然,你可以先尝试下述方法修复,如不行还是重装系统为上选:第一、看看是否是系统或者软件的问题:方法1,找一找是否有软件不正常运行,造成和系统冲突,如果只是某个应用程序出错,解决方法如下:彻底卸载和清除此程序,及其注册表,然后重新安装该程序,最后更新到最新的稳定版本,不要安装测试版。 方法2,如果程序(包括:一个或者多个)都出现该内存不能为&written&,解决办法如下:首先卸载相关的旧的版本或者测试版的应用程序,更换正式版或者稳定版的应用程序;如果不行,再排除是不是病毒木马引起的,使用口碑较好的杀毒软件进行彻底查杀;如果故障依旧,也可以尝试通过“该内存不能为writte”的通用解决方法来修复出错程序,具体方法:打开“开始”菜单运行中输入cmd 回车,在命令提示符下输入“for %1 in (%windir%\system32\*.ocx) do regsvr32 /s %1”,之后,再输入以下内容并回车 “for %1 in (%windir%\system32\*.dll) do regsvr32 /s %1”(注:命令都不包括双引号,另外此命令修复的过程可能持续较长时间,请一定耐心等待修复进程完全结束)。  方法3、更新和修复所有系统漏洞,这样通过系统本身更新或打补丁来修复出错的程序;或者并用杀毒软件全屏查杀病毒,尝试来消除错误。方法4、开机不断点击F8键,进入系统操作选单(如果是Win8,Win8.1,Win10系统,在看见开机画面后长按电源键关机,短时间内重复三次左右可以进入WinRE {Windows 恢复环境},但有的用户可能需要直接断开电源。这样开机后应该能出现高级恢复的界面了),选“最后一次正确配置”,重启电脑,看能否解决。方法5、开机不断点击F8键,进入系统操作选单(如果是Win8,Win8.1,Win10系统,在看见开机画面后长按电源键关机,短时间内重复三次左右可以进入WinRE {Windows 恢复环境},但有的用户可能需要直接断开电源。这样开机后应该能出现高级恢复的界面了),然后寻找“安全模式”,并进入“安全模式”,如能成功进入,依次单击“开始”→“所有程序”→“附件”→“系统工具”→“系统还原”,出现“系统还原对话框”,选择“恢复我的计算机到一个较早的时间”。 这样可以用Windows系统自带的系统还原功能,还原到以前能正常开机的时候一个还原点。(如果有的话)方法6、尝试静电释放处理。关机后将您的电脑电源线及电池拆下;长按开机键(30秒以上),然后尝试重新开机。方法7、用系统安装光盘或者系统安装U盘,放入光驱或者插入USB接口,重启电脑,进入光盘安装系统状态或者进入U盘安装系统状态,等到启动界面闪过后,不要选安装系统,而是选修复系统,对目前系统进行修复(可能会运行很长时间,2-4小时都可能),耐心等待修复完成,看看是否能解决问题。(本文结尾,详述了:U盘设置为第一启动顺位设备的方法)如以上7种方法全部无效,那就只有重装系统了。第二、看看是否是硬件的问题:1)主板有问题:BIOS没电,记不到硬盘信息,如果你的系统日期不正确的话,很可能是这个原因。解决办法:更换BIOS电池,重新进BIOS内检测硬盘。2)IDE线质量不好或插得不牢。解决办法:换一条IDE线或将IDE线插在主板另一个IDE槽里,连硬盘的线不要与其它IDE设备一起连接,例如光驱,分开两条IDE线连,正确设置主/从盘。3)进BIOS设置硬盘启动试试(看看是不是设置错误)。4)还有一种情况,内存松脱,重新插拔一下、清一下灰也可以解决问题(有时是因为它引起的)。5)此外,显卡驱动冲突也会蓝屏造成不能进系统,需要更新显卡驱动程序。6)硬盘出现严重故障,已经损坏,可能需要更换硬盘。7)内存损坏,也会造成不能开机,需要更换内存。8)如果显卡损坏,更换显卡。9)主板损毁,这个必须更换主板。10)机器灰尘太多散热有问题,必须对电脑清灰和除尘,或者增加散热装置。 11)自己解决不了,建议去电脑店检修一下。另附,重装系统安装方法:建议你用”电脑店超级U盘启动盘制作工具V6.2(UEFI启动体验版)“制作U盘启动盘或者光盘启动盘来安装操作系统。为了顺利安装系统,不会中途卡机和当机,你必须先把你的所要安装系统的分区进行格式化,如果硬盘内有一两个系统恢复和保护性分区,它会阻止安装非本机OEM的系统,解决方法:就是彻底删除系统分区,并删除所有恢复性或保护性的小分区(一般大小为100--500M),再安装系统。最流行的的系统安装方法:用U盘做成系统启动安装盘具体方法:准备好一个等于或者大于4GB的U盘,先完成格式化。a、从电脑店U盘工具官方网站 (前面加:http://)-下载”电脑店超级U盘启动盘制作工具V6.1(UEFI启动体验版)“。b、运行程序之前请尽量关闭杀毒软件和安全类软件(本软件涉及对可移动磁盘的读写操作,部分杀软的误报可能会导致制作失败!)下载完成之后Windows XP系统下直接双击运行即可,Windows Vista或Windows7/8系统请点右键以管理员身份运行。 &U盘启动安装盘的具体制作:1. 默认模式:默认模式1.1:打开主程序,插入U盘/SD卡等可移动设备,在磁盘列表里会自动列出当前电脑中所有的可移动磁盘的盘符、型号、容量等信息。默认模式1.2:选择你要制作启动的可移动磁盘,启动模式USB-HDD或USB-ZIP可选,默认采用USB-HDD模式。(chs模式主要针对某些不能检测的Bios,一般不需要勾选此项!如果你想把U盘剩余部分转成NTFS格式可以勾选NTFS选项,注意:格式化成NTFS会影响U盘启动部分功能的使用,除非需要存储超过4G的单文件,否则不建议勾选此项!)默认模式1.3:尽量退出杀毒软件和安全类软件以免制作失败,点击“一键制作启动U盘”按钮,程序会提示是否继续,确认所选U盘无重要数据后点是开始制作.(注意:使用电脑店U盘启动盘制作工具2.0以及之前版本制作过的U盘如果制作失败请先执行初始化U盘)默认模式1.4:制作过程根据电脑配置和U盘芯片的不同耗时长短也不同,请耐心等待。制作完成后正确设置电脑BIOS即可从U盘启动了。为了验证U盘启动制作是否成功,可以运行模拟启动。注:模拟启动仅供测试U盘启动是否制作成功,不可用于测试内部DOS和PE系统。2. & ISO模式:ISO模式2.1:切换到ISO模式或者直接点击主程序左上角的ISO制作,程序会切换到ISO制作界面。ISO模式2.2:点击“一键制作启动U盘”按钮后程序会在“D:\电脑店ISO\”文件夹下创建DND.ISO镜像。ISO模式2.3:打开ISO模式的一键制作启动U盘,点击ISO模式里的按钮,按照图中推荐选项进行选择,最后点击写入按钮等待写入完成。(如需刻录光盘,点击“刻录光盘”按钮进行刻录操作!)注:ISO模式同样支持将Win7或者Win8系统镜像写入U盘做成系统安装盘。按以上步骤制作好U盘的系统安装盘,即可安装Win7或者Win8系统了。小注:把U盘设置为第一启动顺位设备的方法1:开启电脑,根据开机的时候,刚一闪过的第一次开机画面,在屏幕下方显示的白色提示文字,一般是出现“DEL”,那么按下 “del(delete)”键;如果是别的,根据提示可以尝试按F2、F8、F10、F12等等,就可以进入BIOS 。因为各种型号的电脑根据主板的不同,BIOS设置也略有不同,你先在里面菜单里找到带有“BOOT”字样的这一大项,然后进入细项,选择里面的,First Boot:这个的意思就是电脑启动的第一引导驱动,就在这里选择(用上下箭头,或者屏幕下方有英文提示)”USB“字样的设备,然后按F10保存后重新启动,当电脑重启后,里有可以支持的U盘启动盘时,会在屏幕上面显示进入U盘的系统安装界面。把U盘设置为第一启动顺位设备的方法2:开启电脑,根据开机第一个启动画面,在电脑最下方的显示的提示,不停地F9(也可能是F2或者F12),可进入快速启动设备选择项菜单,在菜单里选择:”USB“字样的设备,也可进入U盘启动引导。(进入步骤同方法1)通过U盘安装系统的过程基本是傻瓜式的,按照系统安装界面的提示步骤一步步执行即可,很简单,亦不在此赘述。)*08其他答案(14)Win7不兼容VB6.0的,所以能否正常安装VB6.0也要看运气,网上各种所谓的安装方法,也是碰运气的。是否只有安装VB6.0企业版才会出现此问题,请更换一个完整版的VB6.0安装试试,或者下载 Visual Studio 6.0 试试吧,VB6.0只是VS6.0中的一个组件。不单独装VB6的电脑把VS6整个装进去是可以的,但是运行时会出现兼容性警告,右击属性已管理员身份运行此程序,选择兼容模式运行。如果安装所有的msi软件程序都不可以,就是windows installer服务有问题,你已经试过注册MSI.dll,自动启用windows installer服务等不管用的情况下,请重新安装其他版本WIN7系统(安装完整版本非GHOST的)希望对你有所帮助。*0网上下载windows installer重新安装一下。*0win7 64旗舰版的windows installer正常运行可以重新安装系统升级系统也行*0重装系统试试*0
最新解决问题列表
猜你感兴趣懂彙編咊OD技術的進 EXE程序作爲DLL加載 然後遠程註入調用圅數!|易语言俱乐部 - 易语言俱乐部 - Powered by phpwind
查看完整版本: [--
懂彙編咊OD技術的進 EXE程序作爲DLL加載 然後遠程註入調用圅數!
懂汇编和OD技术的进 EXE程序作为DLL进行加载调用~~~~~~~~~~~~!这是我收藏的一篇文章 曾经也拿出来做过试过 可惜没有调用成功 今天拿出来和大家一起研究... [attachment=245508] 这是文章中提到的附件...使用EXE直接注入其他程序这多么邪恶阿 还不用释放DLL 还可避免杀毒拦截... Exe程序作为DLL进行加载调用第三方exe程序里面的函数;1、让第三方exe启动,然后自己程序注入进去调用之;2、让第三方exe启动,然后远程读入其内容;3、把第三方exe,当作DLL进行加载,并调用里面的函数。前2个方法容易实现,但无法摆脱让exe运行的缺点,今天我们讨论第三条思路,把exe向dll一样加载,然后调用里面的函数。就此,主要面临以下三个问题:1、导入表修复;2、重定位dll数据,也就是exe数据。其实这2个问题归结起来都是重定位问题,这里就不再解释重定位原理和原因了。有些人认为PE文件重定位,就要搞重定位表,exe要输出函数,就要搞导出表,这些其实是不必要的,只要理解了他们的原理,自己实现反而更方便。当然,另外一点原因是我现在基本忘却PE结构了。以下方法不涉及给exe增加导出表或者重定位表。举例来说碰到的问题和解决思路,exe里面有如下代码:&&&&&&&& push&&&& 425570&&&&&&&&&&&&&&&&&&&&&&&&&&&&; /kernel32.dll&&&&&&&& call&&&& dword ptr [425280]&&&&&&&&&&&&&&&&; \GetModuleHandleA这个很正常,也很简单, 0x425570 指向一个字符串, [425280] 里面是 GetModuleHandleA 函数指针,也就是导入表内容。但如果把这个exe作为DLL进行LoadLibrary,你会发现这2行代码仍然如此,一点也没变,但却无法执行了,因为这时候涉及到的这2个指针,指向的内容已经不是我们预想的了,需要把它们重定位,才能让他们指向预期目的地。重定位方法也很简单: 1、 0x425570 ,这个地址,用当前自身模块基地址加上 0x25570 ,就是新的地址;2、 0x425280 ,这个地址,用当前自身模块基地址加上 0x25280 ,就是新的地址;理解了这一点,就知道我们需要作什么了。口说无凭,动手为真,下面我们举例来进行说明。就采用壳狼最近写的antidebugger测试程序吧,当然没经过他的同意 :)目的:加载 AntiDebug.exe,调用它的第一个标签里面的 Find Debugger 功能,里面有20多个选项,我们争取把它调用完!调用函数: 简单跟踪以下,他这些反调试手段都在一个函数体内,调用方式如下:00404FCC&&&&.&& 50&&&&&&&&&&&& push&&&& eax00404FCD&&&&.&& 8BCB&&&&&&&&&& mov&&&&&&ecx, ebx&&&&&&&& //这句无所谓,可以nop00404FCF&&&&.&& E8 ECF1FFFF&&&&call&&&& 实现方式也很简单:&&&& hMod = LoadLibrary(ExePath);&&&&&&&& DWORD FindDebugerCall = (DWORD)hMod + 0x41C0;&&&&&&&& _asm{&&&&&&&& push 0xFFFFFFFF&&&&&&&&&&//这里是调用标记,如果为这个参数,表示所有的反调试功能都选了&&&&&&&& mov&& eax, FindDebugerCall&&&&&&&&&&&& }&&&&&&
最终我们的目的就是要让上面这个函数正常运行。为此,我们要作以下大量工作。 一、修复输入表 &&&& 思路很简单,首先根据被加载dll的模块基地址,找到其导入表,然后根据其函数名,自己获取导入函数地址,重新填入到正常位置。&&&&&&&& 在此感谢鸡蛋壳,让我在茫茫网海搜到了他的一些代码并加以改之。&&&&&&&& pDosHeader = (PIMAGE_DOS_HEADER)hM&&&& pNTHeaders = (PIMAGE_NT_HEADERS)((BYTE *)hMod + pDosHeader-&e_lfanew);&&&& pOptHeader = (PIMAGE_OPTIONAL_HEADER)&(pNTHeaders-&OptionalHeader);&&&& pImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE *)hMod + pOptHeader-&DataDirectory[1].VirtualAddress);&&&& while(pImportDescriptor-&FirstThunk)&&&& {&&&&&&&& //获取dll名称&&&&&&&& char * dllname = (char *)((BYTE *)hMod + pImportDescriptor-&Name);&&&&&&&& pThunkData = (PIMAGE_THUNK_DATA)((BYTE *)hMod + pImportDescriptor-&OriginalFirstThunk);&&&&&&&& int no = 1;&&&&&&&& while(pThunkData-&u1.Function)&&&&&&&& {&&&&&&&&&&&& if ((pThunkData-&u1.Ordinal &&& IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG)&&&&&&&&&&&& {&&&&&&&&&&&&&&&& //获取函数名称&&&&&&&&&&&&&&&& char *funname = (char *)((BYTE *)hMod + (DWORD)pThunkData-&u1.AddressOfData + 2);&&&&&&&&&&&&&&&& myaddr = (int*)GetProcAddress(GetModuleHandle(dllname), funname);&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&& PDWORD lpAddr = (DWORD *)((BYTE *)hMod + (DWORD)pImportDescriptor-&FirstThunk) +(no-1);&&&&&&&&&&&& MEMORY_BASIC_INFORMATION&&&&&&&&&&&&&& VirtualQuery(lpAddr,&mbi,sizeof(mbi));&&&&&&&&&&&& VirtualProtect(lpAddr,sizeof(DWORD),PAGE_READWRITE,&dwOLD);&&&&&&&&&&&& WriteProcessMemory(GetCurrentProcess(), &&&&&&&&&&&&&&&& lpAddr, &myaddr, sizeof(DWORD), NULL);&&&&&&&&&&&& VirtualProtect(lpAddr,sizeof(DWORD),dwOLD,0);&&&&&&&&&&&& no++;&&&&&&&&&&&& pThunkData++;&&&&&&&& }&&&&&&&& pImportDescriptor++;&&&& }&&&&&&&& 这个东西搞完,DLL(也就是加载的exe,后面都叫dll)里面的API和其他导入函数可以正常使用了。&&&&二、重定位代码段指针 &&&& 重定位意义比较广泛,大体有三类数据需要重定位。&&&&&&&& 1、代码段指针。比如我上面举例的 push&&&& 425570 ,这个0x425570是个字符串指针。再比如 mov&&&&&&edi, dword ptr [425400] , 这里面的 0x425400,也是指针,也需要重定位;&&&&&&&& 2、数据段指针。比如这个exe里面,用到了一些SEH结构,SEH结构里面含有指向函数体的指针,比如:&&&&&&&& SEH异常处理结构:&&&& 0042BA94&& E0 1C 40 00 E6 1C 40 00 00 00 00 00 FE FF FF FF&& ?@.?@.....? &&&& 0042BAA4&& 00 00 00 00 D8 FF FF FF 00 00 00 00 FE FF FF FF&& ....? ....? &&&& 0042BAB4&& 28 20 40 00 2E 20 40 00 00 00 00 00 FE FF FF FF&& ( @.. @.....? &&&& 0042BAC4&& 00 00 00 00 D4 FF FF FF 00 00 00 00 FE FF FF FF&& ....? ....? &&&& 0042BAD4&& 95 24 40 00 9B 24 40 00 00 00 00 00 FE FF FF FF&& ?@.?@.....? &&&& 0042BAE4&& 00 00 00 00 D8 FF FF FF 00 00 00 00 FE FF FF FF&& ....? ....? &&&& 0042BAF4&& C8 28 40 00 CE 28 40 00 00 00 00 00 E4 FF FF FF&& ?@.?@.....? &&&& 0042BB04&& 00 00 00 00 B8 FF FF FF 00 00 00 00 FE FF FF FF&& ....? ....? &&&& 这段数据,在数据段,里面有诸如 0x00401CE0 之类的指针,指向函数体,也需要重定位。&&&& 3、其他一些野指针。这个就需要自己去调试找了。&&&&&&&&&&&& 如何找上面三类数据,这是个问题,首先看一些需要重定位的例子:&&&&&&&&&&&&&&&& 00407D5F&&&&B9 402A4300&&&&&& mov&&&&&&ecx, 00432A40&&&&&&&&&&&&&&&&&&&&&&&& &&&&8B3D &&&& mov&&&&&&edi, dword ptr [425390]&&&&&&&&&&&& 00D88131&&&&FF15 &&&& call&&&& dword ptr [425478]&&&& 上面的三条,开头是代码地址,中间是opcode,后面是指令。我们需要把 390 425478 这3个地址重新转换成新的地址达到重定位的目的。他们的特点,是都是 0x004xxxxx,也就是大小在exe的代码段范围内,也就是exe的基地址加上模块大小。&&&&&&&& 因此我们可以查找每条mov、call指令,判断一下立即数,发现有在这个范围内的,就认为该条需要重定位。&&&&&&&& 但所需要处理的汇编指令和类型是在太多了,其他还有cmp je add ....&&&&&&&& 所以我的思路,就是把程序里面每条指令都搜索以下,发现有类似常量,就把它揪出来供重定位。&&&&&&&& 不可否认这个思路很挫,但实际也很有效。为此我找到了裸葱裸大虾的OD插件 ustrref 的代码,把这个很挫的思路应用在他的代码上。事实正明任何很挫的方法,只要跟裸大虾联系起来,就不仅不挫反而很有效了。&&&&&&&& 对其StrFinder.cpp里面的代码进行修改,大体如下:&&&&&&&&&&&&&&&&&&&& if (&&&& //这里只列举这几条指令情况,不全面&&&&&&&&&&&& (0 != memicmp(da.result, &mov&, 3)) &&&&&&&&&&&&&& (0 != memicmp(da.result, &cmp&, 3)) &&&&&&&&&&&&&& (0 != memicmp(da.result, &call&, 4)) &&&&&&&&&&&&&& (0 != memicmp(da.result, &push&, 4))&&&&&&&&&&&& )&&&&&&&&&&&&&&&&&&&& ip1 = 0;&&&&&&&& ip2 = 0;&&&&&&&& for (int j = 0; j & MAXCMDSIZE; j++)&&&&&&&& {&&&&&&&&&&&& Readmemory(&pConst, da.ip + j, 4, MM_RESTORE | MM_SILENT);&&&&&&&&&&&& if ((pConst& 0x400000) && (pConst & 0x441000))&&&&&&&&&&&& {&&&&&&&&&&&&&&&& if (ip1 == 0)&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&& ip1 = da.ip +&&&&&&&&&&&&&&&&&&&& sprintf((char*)pszStr, &0x%X&& ,&, ip1);&&&&&&&&&&&&&&&&&&&& pCallBack(nStrIndex++, dwBase, dwOffset, dwSize, StrType, (char *)pszStr);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&& if (ip2 ==0)&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&& ip2 = da.ip +&&&&&&&&&&&&&&&&&&&& sprintf((char*)pszStr, &0x%X&& ,&, ip2);&&&&&&&&&&&&&&&&&&&& pCallBack(nStrIndex++, dwBase, dwOffset, dwSize, StrType, (char *)pszStr);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&& }&&&&&&&& }&&&&&&&&&&&&&&&& 修改后的代码很挫,因此得到的结果也很挫,大体如下:&&&&&&&&&&&&&&&& Address&&&& Disassembly&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Text String&&&&&&&& &&&&mov&&&&&&eax, dword ptr [42FB98]&&&&&&&&&&&&&&&&&&&&&& 0x401007&& ,&&&&&&&& &&&&push&&&& esi&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 0x40102A&& ,&&&&&&&& &&&&push&&&& eax&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 0x40102A&& ,&&&&&&&& &&&&call&&&& 00412A80&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x40102A&& ,&&&&&&&& &&&&mov&&&&&&edi, dword ptr [&&KERNEL32.GetVersionExA&]&&&&0x40102A&& ,&&&&&&&& &&&&push&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x401121&& ,&&&&&&&& &&&&push&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x401127&& ,&&&&&&&& &&&&call&&&& dword ptr [&&KERNEL32.GetModuleHandleA&]&&&&&&0x401127&& ,&&&&&&&& &&&&call&&&& dword ptr [&&KERNEL32.GetModuleHandleA&]&&&&&&0x40112C&& ,&&&&&&&& 0040112B&&&&push&&&& 0042555C&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x40112C&& ,&&&&&&&& 0040112B&&&&push&&&& 0042555C&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x401133&& ,&&&&&&&&&&&&&&&&&&&& ...............................&&&&&&&&&&&&&&&&&&&&&&&&&&&& 总共9476条,里面还有很多重复的,过滤一下剩下2803条。后面的 Text String ,是需要重定位的数据地址。以第一条为例:&&&&&&&&&&&&&&&& &&&&mov&&&&&&eax, dword ptr [42FB98]&&&&&&&&&&&&&&&&&&&&&& 0x401007&& ,&&&&&&&&&&&& 表示 0x401007 这个内存处的数据 0x42FB98 需要重新定位以下。&&&&&&&&&&&&&&&& 当然这么多数据,里面有很多不能随便修改的,譬如:&&&&&&&&&&&&&&&& 0040439A&& F7C3 && test&&&& ebx, 4000&&&&&&&&&&&&&&&& 按照我上面的思路,把这个地方也搜索出来了,因为里面有 0x04307C,但实际上这个地方不能修改,所以我们手工挑出来删除就可以了。&&&&&&&&&&&&&&&& 另外还有比如:&&&&&&&&&&&&&&&& //这个地方是短跳转,也不能修改&&&&&&&& 00413ECC&&&&& \E8 BF400000&&&&call&&&& 00417F90&&&&&&&&&&&&&&&& 其他还有很多,需要自己去调试了。&&&&&&&&三、重定位数据段数据&&&& 上面说了对付代码段内容,但对付数据段,就没这么简单了。比如我上面提到的SEH结构,这个地方的内存数据是exe运行起来才加载处理的,没有好的办法找出来,只有靠自己去调试。&&&&&&&& 拿上面SEH例子来说,编译后运行,会出错,错误地点定位在:&&&&&&&& && |.&& E8 F9F0FFFF&&&&call&&&& &&&& //这个函数里面出错&&&& && |.&& 84C0&&&&&&&&&& test&&&& al, al&&&& && |.&& 74 0E&&&&&&&&&&je&&&&&& short &&&& 004043AB&& |.&& 6A 00&&&&&&&&&&push&&&& 0&&&& 004043AD&& |.&& 6A 10&&&&&&&&&&push&&&& 10&&&& 004043AF&& |.&& 68 &&&&push&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&;&& debugger is found by fd_find_debugger_window!&&&& && |.&& E8 9A900000&&&&call&&&& &&&&&&&& 上面得 call&&&& ,功能是“found by fd_find_debugger_window”,跟踪以下,他主要是强行关闭一个句柄,然后跳到一个异常处理的地方用到了某些SEH结构。跟踪,下面这段代码可能是在设置某个异常处理结构:&&&& && /$&& 8BC1&&&&&&&&&& mov&&&&&&eax, ecx&&&& 0040E28B&& |.&& 33D2&&&&&&&&&& xor&&&&&&edx, edx&&&& 0040E28D&& |.&& 33C9&&&&&&&&&& xor&&&&&&ecx, ecx&&&& 0040E28F&& |.&& C700
mov&&&&&&dword ptr [eax], && //这里0x指向一个结构,里面含有函数地址指针&&&& && |.&& 8950 34&&&&&&&&mov&&&&&&dword ptr [eax+34], edx&&&& && |.&& 8950 54&&&&&&&&mov&&&&&&dword ptr [eax+54], edx&&&& 0040E29B&& |.&& 8948 4C&&&&&&&&mov&&&&&&dword ptr [eax+4C], ecx&&&& 0040E29E&& |.&& 8950 50&&&&&&&&mov&&&&&&dword ptr [eax+50], edx&&&& && \.&& C3&&&&&&&&&&&& retn&&&&&&&& 0x指向内容:&&&&&&&& && 83 E3 40 00 D8 B1 42 00 C8 E3 40 00 24 B2 42 00&& 冦@.乇B.茹@.$睟.&&&& && E6 E4 40 00 70 B2 42 00 25 E7 40 00 BC B2 42 00&& 驿@.p睟.%鏎.疾B.&&&& && 25 E7 40 00&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& %鏎.c&&&&&&&& 我们把 0x 这个地方所有看起来貌似地址一样的数据统统重定位就可以了。&&&&&&&&&&&&&&&& 其他还有很多地方,有的是被错误重定位了,有的是没有重定位,这些地方都需要靠人工调试去找出来。由于我们的目标程序本身就是反调试,这无疑让我调试起来有些吃力,最终仍然有2条功能没有实现:&&&&&&&& found by fd_parent_process!&&&& found by fd_find_debugger_window!&&&&&&&& 这2功能的实现,不仅仅是重定位问题,还涉及到了程序的初始化问题。因为我们直接把exe给LoadLibrary起来他并没有执行本身的初始化部分,导致一些内存数据没有被初始化。&&&&&&&& 原则上这个问题也很容易解决,我们自己调用函数OEP地方的代码就可以了,当然这肯定要导致我们所谓的dll会像exe一样启动起来出来自己的界面。所以可以在显示界面的地方搞点SMC,让他停留在那个地方不出现就可以了。&&&&&&&& 话虽这么说,但这个启动过程是如此漫长,我修复了十几条重定位数据,仍然没有正常跑起来,我就放弃了。&&&&&&&&&&&& 我附件里面的程序,首先启动LoadExe.exe,然后上面三个按钮分别用来加载exe、修复位导入表、重定位数据。&&&&&&&& 下面的3个函数用来实现相关功能,都是调用的check.exe里面的函数。check.exe就是壳狼同学写的,我对被调用函数其稍微处理了一下,发现调试器以后直接返回,不弹出他自己的对话框。&&&&&&&& 如果程序在你系统上执行产生非法、退出,那很正常,可以尝试打开调试器再跑我这个程序,如果运气好的话,能看到点东西,不至于白下载。
沙发沙发沙发
都来研究研究阿?
所以说,这篇文章是你复制粘贴过来的了?
这个我会玩,不过有点复杂~~~
必须很会玩汇编的人才能玩得转~~~
一定难度,需要学习,支持楼主
不明觉厉!!
很棒的东西啊
优秀文章,支持!n神马都是浮云
优秀文章,支持!n神马都是浮云
重定位。忘的差不多了都。
好东西。。。。。
看看如何把exe变成dll调用的。
这个标题 。。。。
理论上来说,代码段的指针是完全可以解释后重定位的(可实际没人写出来过),而且也有的指针是放在数据段,这是机器完全办不到的
分享是一种美德! 支持就不下了。
太长了没看完,重定位导入表倒是简单,把EXE装载内存运行,数据段的基址才是大问题,汇编写这些东西倒是简单,以前写过感染文件,api地址是暴力搜索的,数据是MOV到堆栈,以数字的形式存在代码段,这样的代码放哪都可以运行,不依赖其他环境
优秀文章,支持!n神马都是浮云
能过驱动保护吗?
简单说下这篇文章。我看到这个技术的时候是09年左右,在UpK有一个被改造过的OD叫做野猪的力量,有一个十分牛B的大神在没有源码的情况下改造了OD,使其可以自动注入Explorer.exe并调试。这个技术虽然证明了他的确很牛B,但是也带来了很多问题,由于注入后的不稳定性导致,虽然很轻松就避开了父进程校验,也多了许多不可预知的BUG。所有单纯为了避开父进程检验这样做反而不如Hook API快,注入Explorer都如此艰难,到一些系统进程可想而知,估计随时都可能蓝屏。顺便提提,09年的反修改技术基本还不会怎么涉及驱动,主要的就是加保护壳,通过保护壳的父进程校验、CRC校验等来保证文件不被修改,而那时候最流行的就是如何脱壳,脱掉了壳也就完全暴露了代码,逆向很轻松。VMP在那时候等效于无解,不像现在满淘宝都可以找到。那我们来说说现在的技术。不知道为什么你非要把EXE注入到其他进程里, 你也许认为这样会带来什么好处,但结果是NO。当一个EXE被I许改成DLL注入,它本身也就相当于DLL,而现在检测DLL注入的方法多了去了,你这个想法无非就是脱裤子放屁。如果你不是为了过这样的检测,而是单纯的注入代码,那么修改导入表添加个dll必然是最方便最快捷的方式。没有之一,用Dll来内存运行exe都比你这个方法要快很多。这项技术无疑可以证明你的汇编功底与PE结构知识的扎实,但目前而言,正如之前我们在群里讨论的一样:这个时代已经不是脱壳的时代了,不脱壳修改内存往往也能达到目的。OVER.
Re:懂彙編咊OD技術的進 EXE程序
Re:懂彙編咊OD技術的進 EXE程序Re:懂彙編咊OD技術的進 EXE程序
查看完整版本: [--
Powered by
Gzip enabled

我要回帖

更多关于 将dll封装进exe 的文章

 

随机推荐