|
|
[求助]动态加载的dll中如何调用外部函数
谢谢各位,我想我已找到解决办法。 假定有个xx.dll,其基址是65000000。 我们要对xx.dll打补丁,增加一些功能。 补丁中要调用一个zz函数(假定xx.dll的引入表中有这个函数,如果没有我们可以用LordPE等工具添加这个函数), 这个函数在xx.dll的引入表中地址为[65071020]。 调用方式如下 65032733 FF15 20100765 CALL DWORD PTR DS:[<&yy.zz>] ; yy.zz 65032738 . 90 NOP 静态加载xx.dll时,上面的做法没问题。 [65071020]指向zz函数的实际地址,这个地址是在系统加载时重定位的正确地址。 但动态加载xx.dll时,它的基地址会随机变化,这句话就会变成 xxxx2733 call dword ptr [65071020] 没有人知道[65071020]会指向哪里。程序执行到这里会raise exception。 错误在于我们不应该使用hard code方式确定函数在引入表中的位置, 因为上述代码是我们自己添加的,reloc段中没有这部分的索引, 系统加载dll时也就不可能替我们修正。 精华五中的一篇文章(对于DLL通过增加重定位项直接调用引入表函数 aafK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4m8W2k6r3W2&6i4K6u0W2j5$3!0E0i4K6u0r3j5X3u0K6K9s2c8E0L8q4)9J5c8V1u0n7f1K6g2Q4x3V1k6H3k6h3c8A6P5e0f1H3x3K6x3&6i4K6u0W2K9s2c8E0i4@1g2r3i4@1u0o6i4K6R3&6i4@1f1%4i4@1u0n7i4K6V1&6i4@1f1#2i4K6R3%4i4@1u0m8i4@1f1@1i4@1u0m8i4K6R3$3i4@1f1@1i4@1t1^5i4K6R3H3i4@1f1%4i4@1p5%4i4K6S2p5i4@1f1@1i4@1u0r3i4@1q4q4i4@1f1$3i4K6V1@1i4@1t1&6M7X3g2D9L8$3y4Q4c8e0k6Q4b7f1g2Q4b7U0g2Q4c8e0k6Q4z5f1c8Q4b7e0g2Q4c8e0k6Q4b7U0N6Q4b7V1u0Q4c8e0g2Q4z5p5q4Q4b7e0m8Q4c8e0g2Q4z5o6N6Q4b7V1c8Q4c8e0k6Q4z5e0g2Q4b7U0m8Q4c8e0g2Q4b7V1y4Q4z5e0g2Q4c8e0N6Q4z5e0c8Q4b7e0S2Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0k6Q4z5e0k6Q4b7U0W2Q4c8e0k6Q4b7U0y4Q4z5e0g2Q4c8f1k6Q4b7V1y4Q4z5p5x3`. 可惜我对reloc段的结构不了解,没办法尝试。 好在我找到了一种替代的方法,据说是病毒常用的方法。 我们知道zz函数的正确地址确实存在于xx.dll中的import table中,偏移量为a(71020)。 我们的代码偏移量为b(32738)。因此从代码到引入表的绝对偏移是一个常数c。 动态加载时我们只要知道基地址,或者知道代码的实际地址,加上常数c就是指向zz函数的真实地址。 做法是在xx.dll的代码段中找一段空闲的位置,加入 6504E770 /$ 58 POP EAX ;调用语句的下一行代码地址 6504E771 |. 50 PUSH EAX ;恢复堆栈 6504E772 |. 05 E8E80300 ADD EAX,3E8E8 ;加上常数c …… 6504E779 |. FF10 CALL DWORD PTR DS:[EAX] ;[eax]指向zz的实际地址 6504E77B \. C3 RETN 再把开始的调用代码改为 65032733 . E8 38C00100 CALL impeg34.6504E770 这样就ok了。 |
|
|
[求助]动态加载的dll中如何调用外部函数
既然调用CreateFileA会失败,调用GetModuleHandle也同样会失败吧? import table里肯定有CreateFileA, 我希望手工修改重定位表,当系统加载dll时自动修正调用地址, 请问应如何实现? |
|
|
[求助]动态加载的dll中如何调用外部函数
这个dll自己也有调用CreateFileA的地方,动态加载时没问题。 我要做的是在它的code section添加一段代码,其中要调用CreateFileA, 并且要保证动态加载时能正确执行。 请问各位有什么办法? |
|
|
一个带狗的java软件的破解
“一阵摸索加实践”就是 1.用jcreater编一个最简单的java程序,但要有if(!……)。 2.用ultraEdit察看编译后的class文件,根据00-ff的java代码对照表判断哪个字节可能是if(!。 3.感觉9a(ifne)比较可疑,而且class文件里确实有一个字节是9a。 4.把9a改为99(ifeq),存盘。用jad反编译修改过的class文件,确实变成if(……)了。 5.用ultraEdit打开要破解的class文件,可能会有多个9a,逐个改为99,再反编译,看程序的流程是不是我们期待的那样。 6.如果不是,恢复。改下一个9a为99,直到成功为止。 以上是很笨的办法。严重需要高手做个专门工具出来。 |
|
|
一个带狗的java软件的破解
在百度搜一下java虚拟机规范,挺多的。 第十章是00-ff的java代码对照表。 我下的是无优书库的pdf,10M大小, 限制版,没法拷贝,所以没法贴上来,各位见谅。 哪位找到无限制版的pdf或word版,麻烦说一下。 |
|
|
一个带狗的java软件的破解
这是个行业软件,老外做的,要一万多欧元,可见软件的保护力度跟售价不一定成正比。 另外我的本意不是贬低狗,而是希望抛砖引玉,让大家对java软件破解多一些关注。因为现在老外做的很多软件是用java写的,而class文件修改起来很不方便。希望有精通虚拟机的高手做一个反编译加修改相结合的class文件编辑工具,或者讲一讲这方面的心得。 |
操作理由
RANk
{{ user_info.golds == '' ? 0 : user_info.golds }}
雪币
{{ experience }}
课程经验
{{ score }}
学习收益
{{study_duration_fmt}}
学习时长
基本信息
荣誉称号:
{{ honorary_title }}
勋章
兑换勋章
证书
证书查询 >
能力值