是否有类似于OllyDbg/SoftICE for java的实用程序?即执行类(来自jar/with class path),并且在没有源代码的情况下,显示中间代码的反汇编,能够逐步执行/跳过/搜索引用/编辑内存中的特定中间代码/将编辑应用到文件中. .
如果没有,是否可以写这样的东西(假设我们愿意在调试期间没有热点的情况下生活)?
编辑:我不是在谈论JAD或JD或Cavaj.这些是很好的反编译器,但我不想要一个反编译器有几个原因,最值得注意的是它们的输出不正确(充其量,有时只是简单的错误).我不是在寻找一个神奇的"编译到java代码的字节" - 我想看到即将执行的实际字节.此外,我希望能够更改这些字节(就像在汇编调试器中一样),并希望将更改的部分写回类文件.
Edit2:我知道javap存在 - 但它只有一种方式(并且没有任何分析).示例(代码取自vmspec文档):从java代码中,我们使用"javac"来编译:
void setIt(int value) {
i = value;
}
int getIt() {
return i;
}
Run Code Online (Sandbox Code Playgroud)
到java .class文件.使用javap -c我可以得到这个输出:
Method void setIt(int)
0 aload_0
1 iload_1
2 putfield #4
5 return
Method int getIt()
0 aload_0
1 getfield #4
4 ireturn
Run Code Online (Sandbox Code Playgroud)
这对于反汇编部分是可以的(没有分析就不太好 - "字段#4是Example.i"),但我找不到另外两个"工具":
我目前正在拆解Visual Studio 2012 Express中的一些小型C程序,我注意到了二进制文件中的一种趋势.
在main函数中执行的第一组指令总是:
SUB ESP,154 ; Doesn't have to be 0x154.
.....
.....
.....
LEA EDI,DWORD PTR SS:[EBP-154]
MOV ECX,55 ; Also doesn't have to be 0x55.
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]
Run Code Online (Sandbox Code Playgroud)
那么,为什么机器用这个0xCCCCCCCC填充堆栈?我已经读过它被VC++或其他东西用作未初始化空间的标记?
然后让我说我要把一些东西放进我的缓冲区......编译器或处理器决定将它放在这个空间内的某个随机点,但是我不明白为什么它会把它放在那里......
EBP-90 > CCCCCCCC ÌÌÌÌ
EBP-8C > CCCCCCCC ÌÌÌÌ
EBP-88 > CCCCCCCC ÌÌÌÌ
EBP-84 > 00000001 ... ; Why this place?
EBP-80 > CCCCCCCC ÌÌÌÌ
EBP-7C > CCCCCCCC ÌÌÌÌ
EBP-78 > 41414141 AAAA ; Why this far from both the top …Run Code Online (Sandbox Code Playgroud) 我需要一个帮助,以了解以下汇编指令.在我看来,我在someUnknownValue + = 20994A调用地址?
E8 32F6FFFF - call std::_Init_locks::operator=+20994A
Run Code Online (Sandbox Code Playgroud) 我试图通过使用gdb的反汇编程序检查它来了解简单C程序的汇编级代码.
以下是C代码:
#include <stdio.h>
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1,2,3);
}
Run Code Online (Sandbox Code Playgroud)
以下是两个反汇编代码main和function
gdb) disass main
Dump of assembler code for function main:
0x08048428 <main+0>: push %ebp
0x08048429 <main+1>: mov %esp,%ebp
0x0804842b <main+3>: and $0xfffffff0,%esp
0x0804842e <main+6>: sub $0x10,%esp
0x08048431 <main+9>: movl $0x3,0x8(%esp)
0x08048439 <main+17>: movl $0x2,0x4(%esp)
0x08048441 <main+25>: movl $0x1,(%esp)
0x08048448 <main+32>: call 0x8048404 <function>
0x0804844d <main+37>: leave
0x0804844e <main+38>: ret
End of assembler dump.
(gdb) …Run Code Online (Sandbox Code Playgroud) 第一次提问者:)是否有可能在不破坏代码的情况下将全局c样式数组转换为std :: arrays?我正在开发一个项目,其中包括反编译旧游戏的源代码.我们已经设法重构了反汇编/反编译输出的大部分内容.因为它是自动的,所以仍然有像
int a;
int b[50];
*(&a + 100) = xxx;
Run Code Online (Sandbox Code Playgroud)
要么
int b[50];
int a;
*(&a - 100) = xxx;
Run Code Online (Sandbox Code Playgroud)
还有其他类型的疯狂指针算术,它们尚未手动重构.但我们想使用边界检查已经(可能)正确更改为数组的部分.
(忽略斜体文本,我只是为了保持评论的一致性)到目前为止,我发现每个数组都有一个问题:sizeof(class containing array)会改变.这可能会在某些周期中破坏代码,例如someclass somearray [100]; //例如(sizeof(somearray [0])== 50)是真的int指针=(int)somearray; 指针+ = 100((someclass)指针) - > doSomething(); .因为pointer +=100不是指向第二个元素,而是指向第一个元素,或者甚至是第0个元素,我不确定(不要忘记它是自动反编译的代码,因此是丑陋的).
我正在考虑将每个全局数组更改为std :: array以及在没有[]运算符的情况下访问数组的每个实例array._Elems.
如果我要在这样的代码中将全局数组更改为std :: arrays,是否会出现任何问题?
编辑 你是对的,大小不变.我在测试功能中出错了.所以我会扩展这个问题:
将每个c样式数组更改为std :: array是否安全?
编辑 我们当前的代码实际上只能在调试模式下运行,因为它不会移动变量.发布模式基本上在程序开始时崩溃.
编辑 因为这个问题似乎有些混乱,让我澄清一下:除了T elems [N]之外,是否有一些保证阵列中没有其他成员?我能指望拥有
array<array<int,10>, 10> varname;
int* ptr = &varname[0][0];
ptr += 10
Run Code Online (Sandbox Code Playgroud)
varname[1][0] …
我正在自学,编译器是如何工作的.我正在学习从小型64位Linux程序中读取GCC生成代码的反汇编.
我写了这个C程序:
#include <stdio.h>
int main()
{
for(int i=0;i<10;i++){
int k=0;
}
}
Run Code Online (Sandbox Code Playgroud)
使用objdump之后我得到:
00000000004004d6 <main>:
4004d6: 55 push rbp
4004d7: 48 89 e5 mov rbp,rsp
4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0
4004e1: eb 0b jmp 4004ee <main+0x18>
4004e3: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
4004ea: 83 45 f8 01 add DWORD PTR [rbp-0x8],0x1
4004ee: 83 7d f8 09 cmp DWORD PTR [rbp-0x8],0x9
4004f2: 7e …Run Code Online (Sandbox Code Playgroud) 我想用不同的系统文本大小选项轻松测试我的应用程序,包括可访问性大小.这些可以在"设置"应用中设置(显示和亮度=>文字大小或常规=>辅助功能=>较大文本).
我目前可以找到的唯一方法是进入设置并使用UI更改值(编辑:下面描述的部分解决方案).这很慢而且很麻烦.我怀疑有一种方法可以使用私有API动态地改变它,但我无法弄清楚如何.由于我的目标是仅将其用于调试,因此私有API使用和调配很好(此代码不会用于生产).
为了尝试找到一个私有API来实现这一点,我查看了一些逆向工程资源.我是新的反汇编程序,符号表,类转储,以及查找我可以使用的私有API,但这是我到目前为止所尝试的:
我成功地调高了-[UIApplication preferredContentSizeCategory](其他帖子说这在过去有效),但这不会影响从中返回的结果+[UIFont preferredFontForTextStyle:].
使用反汇编程序IDA,我发现它+[UIFont preferredFontForTextStyle:]位于私有框架中UIFoundation.framework.(-[UIApplication preferredContentSizeCategory]在,UIKit.framework但反汇编并没有看起来有用).
正如我开始写这个问题(它总是这样发生),我发现了一个部分解决方案.可以在方案中设置启动参数以在启动时设置值.这很有用,但不是我追求的.
通过上面的回答,我发现用户偏好的值显然存储在" com.apple.UIKit.plist位于模拟器data/Library/Preferences目录中的文件"中.我们所追求的值可以从命令行实用程序设置plutil.这也是一种改进!但是我想在运行时动态地改变它.
更多关于IDA的结果:
我真的不知道如何阅读反汇编,但+[UIFont preferredFontForTextStyle:]似乎指向一个符号___UIFontForTextStyle,它似乎指向一些有趣的符号,称为_getUIContentSizeCategoryUnspecified和_getUIContentSizeCategoryPreferenceClass
"符号在小对象的未初始化数据部分中." .我不知道这意味着什么(我收集到的只是他们不是一个阶级或方法).
在网上搜索_getUIContentSizeCategory...符号不会产生任何结果,但附近还有另一个符号_getUIApplicationClass.我搜索了那个,因为它听起来更一般,并在一些WebKit源代码中发现了类似的东西.可能一无所获,但也许这是Apple的内部约定.无论如何,这个例子并没有真正帮助我解决问题.
无论如何感谢阅读到目前为止.如果你还在这里,我的问题是:
我希望能够动态模拟动态类型大小首选项的值.这些反汇编符号可能有所帮助,但也许我走错了路.感觉解决方案很接近,但我不能将所有部分放在一起.
将此值设置为启动参数很好,但不能完全解决我的问题.同样,修改模拟器的值plist也很适合自动化,但不能解决我的问题.
有没有办法在运行时动态更改此值?
如果分发了这个二进制文件,则每个c程序都转换为机器代码.由于计算机的指令集众所周知,是否可以取回C原始程序?
{"无法加载文件或程序集'AssemblyName,PublicKeyToken = null'或其依赖项之一.找到的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)":"AssemblyName,PublicKeyToken = null"}
我正在InnerException.Message尝试在签署正在使用的未签名第三方程序集之后调试我的应用程序时收到有问题的消息.奇怪的是,我已经签署了消息中显示的程序集,即无法加载的程序集.
这可能是什么问题?我该如何解决这个问题?
编辑
编辑以提供有关我所做的更多信息:
抛出异常的程序集,顺便说一下,项目构建正常,这是我正在构建的程序集的运行时异常InitializeComponent(),是一个带有WPF控件的开源组件(MahApps.Metro).我发现了一个类似的问题,但没有一个答案解决了这个问题.